主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

効率的な最適化問題の作成

問題に整数制約がある場合,解决intlinprogを呼び出して,解を得ます。より迅速に解を得たり,より多くの整数実行可能点を得たりするためのヒントについては,整数線形計画法の調整を参照してください。

問題を解き始める前に,問題の制約または目的の定式を改善できる場合があります。一般的に,ソフトウェアでは,目的関数または制約用の式をループで作成するより,ベクトル化された形式で作成するほうが高速です。この速度の差は,特に,最適化式が自動微分の影響を受ける場合に大きくなります。优化工具箱の自動微分を参照してください。

次の目的関数について考えます。

1 30. j 1 30. k 1 10 x j k b k c j

ここで,xは最適化変数,bcは定数です。この目的関数を定式化する一般的な2つの方法は,次のとおりです。

  • ループを使用する。

    x = optimvar (“x”、30、30、10);b = optimvar (“b”10);c = optimvar (“c”、30、30);Tic expr = optimexpr;i = 1:30j = 1:30x(i,j, K)*b(K)*c(i,j);结束结束结束toc
    经过时间是307.459465秒。

    ここで,exprには,目的関数の式が含まれます。この手法は単純ですが,多くのレベルのループを通って処理されるため,過度の時間がかかることがあります。

  • ベクトル化されたステートメントを使用する。ベクトル化されたステートメントは,一般にループより迅速に実行されます。ベクトル化されたステートメントは,いくつかの方法で作成できます。

    • bcを展開する。項単位の乗算を可能にするため,xと同じサイズの定数を作成します。

      Tic bigb =重塑(b,1,1,10);bigb = repmat (bigb, 30岁,30岁,1);bigc = repmat (c, 1, 1, 10);expr =总和(和(和(x。* bigb。* bigc)));toc
      经过时间是0.013631秒。
    • bを1回ループする。

      Tic expr = optimexpr;k = 1:10 expr = expr +笔(金额(x (:,:, k)。* c)) * b (k);结束toc
      经过时间是0.044985秒。
    • bをループしてから,ループ後に項の和を求めることによって式を作成する。

      Tic expr = optimexpr(30,30,10);K = 1:10 expr(::, K) = x(:,:, K).*c*b(K);结束expr =总和(expr (:));toc
      经过时间是0.039518秒。

静電学における制約付き非線形最適化,問題ベースのベクトル化された実装とベクトル化されていない実装の速度の違いを観察する。この例は,R2020bの自動微分を使用して計測されました。

N = 30;x = optimvar (“x”N下界的, 1“UpperBound”1);y = optimvar (“y”N下界的, 1“UpperBound”1);z = optimvar (“z”N下界的2,“UpperBound”, 0);elecprob = optimproblem;elecprob.Constraints.spherec = (x ^ 2 + y ^ 2 + (z + 1)。^ 2)< = 1;elecprob.Constraints。-x-y = 0;elecprob.Constraints。x = -x+y;elecprob.Constraints。Plane3 = z <= x-y;elecprob.Constraints。= z <= x+y;rng默认的%的再现性x0 = randn (N, 3);N (ii,:) = x0(ii,:)/norm(x0(ii,:))/2X0 (ii,3) = (ii,3) - 1;结束init。x=x0(:,1); init.y = x0(:,2); init.z = x0(:,3); opts = optimoptions(“fmincon”“显示”“关闭”);Tic能量= optimexpr(1);jj = (ii+1):N;%矢量化Tempe = (x(ii) - x(jj))。²+ y(ii) - y(jj)^2 + (z(ii) - z(jj)) ^2;能量=能量+总和(tempe.^(-1/2));结束elecprob。目标=能量;disp (的矢量化计算时间:) [sol,fval,exitflag,output] = solve(elecprob,init,“选项”、选择);toc
向量化计算时间:运行时间为1.838136秒。
Tic energy2 = optimexpr(1);%用于非向量化比较2 = 1: (n - 1)jjj = (2 + 1): N;%不矢量化energy2 = energy2 + (x (x (2) - (jjj)) ^ 2 + (y (ii) - y (jjj)) ^ 2 + (z (ii) - z (jjj)) ^ 2) ^ (1/2);结束结束elecprob。目标= energy2;disp (“Non-vectorized计算时间:) [sol,fval,exitflag,output] = solve(elecprob,init,“选项”、选择);toc
非向量化计算时间:运行时间为204.615210秒。

ベクトル化されたバージョンは,ベクトル化されていないバージョンより約100倍高速です。

関連するトピック