ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

問題を解き始める前に、問題の制約または目的の定式を改善できる場合があります。通常、ループで作成するより、ベクトル化された形式で目的関数または制約の式を作成する方が高速です。次の目的関数について考えます。

i=130j=130k=110xi,j,kbkci,j,

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

  • for ループを使用する。この場合、

    expr = optimexpr;
    for i = 1:30
        for j = 1:30
            for k = 1:10
                expr = expr + x(i,j,k)*b(k)*c(i,j);
            end
        end
    end

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

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

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

      bigb = reshape(b,1,1,10);
      bigb = repmat(bigb,30,30,1);
      bigc = repmat(c,1,1,10);
      expr = sum(sum(sum(x.*bigb.*bigc)));
    • b を 1 回ループする。

      expr = optimexpr;
      for k = 1:10
          expr = expr + sum(sum(x(:,:,k).*c))*b(k);
      end
    • 異なる方法、つまり、b をループしてから、ループ後に項の和を求めることで式を作成する。

      expr = optimexpr(30,30,10);
      for k = 1:10
          expr(:,:,k) = x(:,:,k).*c*b(k);
      end
      expr = sum(expr(:));

関連するトピック