数理最適化セミナーのご案内

9.1 solve関数

 solve関数はNuorium Optimizerに最適化計算の実行を命令する関数です.以下の書式で記述されます.

solve();

 モデルファイルに明示的に記述しない場合は,モデルファイルの最後にsolve関数が書かれた場合と同じ意味になります.従って,通常の場合はモデルファイルにsolve関数を明示的に記述する必要はありません.なお,求解オプションの設定によって,この自動的な実行を避けることができます.以下のように記述すると自動実行が抑制できます.このオプションは C++SIMPLE の挙動を素早く確認したい時などに有効です.

options.noDefaultSolve = 1;

 一方,以下のような場合は,どこで最適化計算を行っているかを明示的に指示する必要があります.

  • 解いた後の構成要素の内容を表示させる.
  • 複数の目的関数について連続して最適化を行う.
  • モデルの定義を変更しながら複数回の最適化を行う.

 以下は,解いた後の構成要素を表示させるモデルファイルの記述例です.

モデルファイル
Variable x;
Objective f(type = minimize);
f = 2 * x;
x >= 5; //制約
x = 10; //初期値設定
solve();
x.val.print();
出力
x=5

 明示的にsolve関数を記述しないと,次のように解く前の値が出力されてしまいます.

モデルファイル
Variable x;
Objective f(type = minimize);
f = 2 * x;
x >= 5; //制約
x = 10; //初期値設定
x.val.print();
出力
x=10

 次のモデルでは複数の目的関数を定義しています.

Variable x(name = "x"), y(name = "y");
Objective f(name = "f", type = maximize);
Objective g(name = "g", type = maximize);
f = x + y;   // 目的関数fの定義
g = x - y;   // 目的関数gの定義
pow(x - 1, 2) + pow(y - 1, 2) <= pow(0.5, 2);
solve();  // 最後に代入されたgに関する最大化を行う
solve(f); // 目的関数fに関する最大化を行う
solve(g); // 目的関数gに関する最大化を行う

 最初のsolve ()は目的関数の指定を省略した最適化の実行で,この場合には最後に代入された目的関数について最適化が行われます.その後,明示的に目的関数を指定した最適化が実行されます.solve(f)で,目的関数fに関する最適化が,solve(g)で目的関数gに関する最適化がそれぞれ行われます.solve()の呼び出しによって最適化が行われるのは,その時点以前に定義されたモデルの内容に対してです.このことを利用して,モデルを逐次変更しながら最適化を行うことができます.

 次の例では,制約式$x - y \ge 0.5$を1つ加える前と後で最適化を行っています.

Variable x(name = "x"), y(name = "y");
Objective f(name = "f", type = maximize);
f = x + y; // 目的関数fの定義
pow(x - 1, 2) + pow(y - 1, 2) <= pow(0.5, 2);
solve();   // 上記までのモデルを解く
x - y >= 0.5;
solve();   // 上の制約式も加えたモデルを解く

 

 

上に戻る