最適化セミナーのご案内

5.2.6 その他の操作(UNIX)

 これで簡単な操作について一通り解説しましたが,例えば

  • Numerical Optimizerのパラメータを指定する.
  • 最適化の初期値を設定する.
  • 解をいろいろなフォーマットで印刷,ファイル出力する.

などが通常のSIMPLEの記述と同様に可能です.以下ではこれらについて具体的に解説します.Numerical Optimizerのパラメータを設定するには,通常の.smpの記法と同様に

options.パラメータ名 = ...;

というコードを挿入します.例えばNumerical Optimizerの標準出力を抑制するには

options.outputMode = "silent";

とします.また,デフォルト出力されるNumerical Optimizerの求解レポート*.solの出力を抑制するには

options.outfilename = "_NULL_";

と設定します.例えば,useClass.ccで次のように書くと,

void simpleControl()
{
  // Numerical Optimizerの標準出力を抑制,
  options.outputMode = "silent";
  // Numerical Optimizerの解ファイルの出力を抑制
  options.outfilename = "_NULL_";
  int len;
  int* ind;
  int i;
          ...
}

 次のようにNumerical Optimizerからの標準出力が抑制されます.

[List of Data Files]
<reading data_file: qp312.dat>
f=2.31818
x[1]=0.939394
x[2]=0.121212
,[*] = [j]
constr[1]=-0.927273
constr[2]=-0.309091
constr[3]=2
,[*] = [i]
x[  1] =  9.394e-01 x[  2] =  1.212e-01 
x(QP):
[  1]  9.394e-01 [  2]  1.212e-01 
** QP is solved **
x(knapsack):
[  1]  1.000e+00 [  2]  0.000e+00 [  3]  0.000e+00 [  4]  0.000e+00 
[  5]  0.000e+00 [  6]  1.000e+00 [  7]  1.000e+00 [  8]  1.000e+00 
[  9]  0.000e+00 [ 10]  1.000e+00 
** knapsack is solved **

 変数の初期値の設定はシステムオブジェクト内の変数に相当するオブジェクトに対して代入を行います.すなわちuseClass.ccの例では

System_QP qp;
qp.x[1] = 2.0; // x[1]の初期値の設定

のようにして行います.ただし,デフォルト動作ではqpを宣言した段階で,初期値の設定を行う前に求解が行われてしまいますので,これを抑制し,陽に求解を指示するようにしましょう.次のようにします.

options.noDefaultSolve = 1; // デフォルトで求解を行わないようにする
System_QP qp;      // qpの宣言(求解は行わない)
qp.x[1] = 2.0;     // 初期値の設定
qp.solve();        // 求解を指示

 変数のすべてのコンポーネントに同じ初期値を設定するなどの場合には,モデルの中の集合や要素オブジェクトを利用して

qp.x[qp.j] = 2.0;  // モデル中でx[j] = 2.0;とするのと同じ

あるいは

Element j(set=qp.T); // モデル内のTをまわる要素を宣言する.
qp.x[j] = 2.0;       // jの回る範囲についてxの初期値を設定する.

などのSIMPLE独特の記述方法が可能です.ここで,通常のint型のループ変数を使って

int j;
for ( j = 1 ; j <= 3 ; ++j ) {
    qp.x[j] = 2.0;
}

のように書くこともできますが,特に大規模なモデルの場合(ループ長が1000以上になるような場合),には,Elementをつかった表現にすることをお勧めします.これはSIMPLEの処理はElementの利用を前提として最適化されているためです.

 simple_printf()を利用すると,オブジェクトの内容を書式を設定して出力することができます.例えばuseClass.ccで求解を行ったのちに,

simple_printf("x[%3d] = %10.3e ",qp.j,qp.x[qp.j]);

と書くと

x[  1] = 9.394e-001 x[  2] = 1.212e-001

のような出力が得られます(同様の書式でsimple_fprintf(fp,...);とすれば任意のファイルに結果を出力することができます).


 

 

上に戻る