トップ > ユーザーサポート > Numerical Optimizer FAQ > エラー

Numerical Optimizer FAQ

エラー

実行不可能(infeasible)と出ました。原因を知ることはできますか?

原因を特定する一般的な方法はありません。しかし、線形制約同士の矛盾が実行不可能性の原因となっている場合には、Numerical Optimizer にはその原因を特定する実行不可能性要因検出機能 iisDetect があります。

Numerical Optimizer の実行結果として実行不可能(infeasible)と出た場合、求解後出力される解ファイル(モデルファイル名.sol)に IIS が表示されます。IIS は互いに矛盾する制約条件の組のことです。

例えば、以下のモデルを実行すると

 Variable x;
 Variable y;
 Variable z;
 x >= 0;
 y >= 0;
 z >= 0;
 x + y <= -1;
 Objective o(type=minimize);
 o = x + y + z;

解ファイルに以下の IIS が表示されます。

 ...
 %%
 %%    IIS    
 %%
 -------------------------------------------------------------
 #1      model.smp:7 INFS :   y+x
                          		<=         -1   (         0)
 -------------------------------------------------------------
 ...

実行不可能な問題への対処(スラック緩和等)に関しては Numerical Optimizer セミナー で紹介している場合がありますので、チェックしてみてください。

浮動小数点エラーが出ます。

モデルの中に変数の割り算または log などが入っていないでしょうか。変数は初期値を与えないと初期値 0 と解釈されますので変数の割り算や log は浮動小数点エラーの原因となります。

 Variable x(index=i); 
 1/x[i] >= 5;           // 0 割りによるエラー
 sum(log(x[i]),i) == 1; // log(0) によるエラー

このような場合には変数に

 x[i] = 1;

のようにして初期値を与えます。solve 関数を呼ぶ場合は、初期値は solve(); より前に与えてください。

「'Parameter' から 'double' に変換できません」と出ます。

これは、例えば options.eps の値を Parameter で渡すときに出ることがあります。options.eps に渡す値は double 型である必要があります。Parameter から options.eps に値を渡すには以下のようにします。

 options.maxtim = a.val.asDouble();

他の options.maxtim、options.maxitn なども同様です。

最適化結果を simple_printf 等でうまく表示できません。

最適化の結果を simple_printf、.val.print()、.val.dump()等で表示/取得するには、これらの処理を solve() 後に記述する必要があります。

モデルの例を以下に示します。

 Variable x;
 x >= 7;
 Objective o;
 o = x;
 solve(); // 先に記述
 simple_printf("x=%f\n", x); // 結果を表示

solve() を呼ぶ前は初期値(通常は 0)が表示されます。

「xxx.smp がありません」と出ます。

モデルファイル名にはファイルの名前は英文字から始まる英文字と数字または _ (アンダーバー)の組みあわせを使わねばならない、という制約があり、例えばスペースを含むなど、この制約をはずれた名前を使うとこのようなエラーになる場合があります。

以下のファイル名の場合は動作を保証しません。

 1tume.smp            (数字で始まっている)
 this is my model.smp (スペースを含む) 
 モデル.smp           (漢字などの全角文字を含む)

以下のようなファイル名なら大丈夫です。

 model12.smp
 My_model.smp
 hock7.smp

result.errorCode で取得できるエラー番号の意味を教えてください。

result.errorCode は Numerical Optimizer/SIMPLE マニュアルにある「付録A Numerical Optimizer/SIMPLE のエラーメッセージ」の「A.2 Numerical Optimizer のエラー/警告」のエラー番号に対応しています。

例えば、result.errorCode = 10 は内点法反復回数が上限を越えたことを表します。

「MOP warning: The hash table is full.Expanded...」と出ます。

変数 Variable や定数 Parameter 等の宣言の数が多すぎる場合、このようなエラーが出ます。「集合」と「添字」を用いることにより、変数や定数の宣言を削減することができます。削減方法については「モデルのビルドにすごく時間がかかります。」が参考になります。

また、「集合」と「添字」の記述方法については「Numerical Optimizer/SIMPLE マニュアル」や「Numerical Optimizer/SIMPLE 例題集」等を参考にしてください。Numerical Optimizer のマニュアルはこちらからダウンロードできます。

「モデル xxx のビルドに失敗しました」と出ます。

考えられる原因は様々です。1 つの原因としてモデルファイル xxx.smp が書き込み権限のないフォルダに存在する場合が考えられます。特に Vista 以降の Windows においてはユーザー アカウント制御(UAC)により、例えば C:\Program Files (x86) 以下のフォルダ全てに書き込み権限が与えられていないことがあります。まずはモデルファイル xxx.smp が存在するフォルダに書き込み権限があるかを確認してみてください。

原因が不明の場合は、どうぞお気軽に Numerical Optimizer サポート担当 までご連絡ください。

「tbb.dll が見つかりません」と出ます。

分枝限定法の並列化を用いたモデルを Numerical Optimizer ランタイム環境で動作させるためには別途 Intel TBB のライブラリが必要になります。詳細については Numerical Optimizer サポート担当 までお問い合わせください。

「sdpin: Impossible asdpin」と出ます。

大規模問題の計算において表示されることがあります。計算結果に影響はありません。

「<<NUOPT 10>> IPM iteration limit exceeded」と出ます。

内点法の収束状況が悪化しており、反復回数が上限を越えた場合に本エラーメッセージが出力されます。このような現象は、問題のスケールの悪さなど、数値的な問題に起因することが多いことが経験上知られています。この問題に対して万能な解決策を挙げることは難しいのですが、以下の方策により回避できることがあります。

     options.scaling = "off";
     options.maxitn=300;

振る舞いが改善されないようであれば、お気軽に Numerical Optimizer サポート担当 までご連絡ください。

「<<SIMPLE 67>> 参照オブジェクト ... の添字付けに誤りがあります。」と出ます。

これは、例えば付けられた添字の次元が誤っている場合に出力されます。例を挙げると Variable x(index=(i,j)) と 2 次元で宣言されているにも関わらず、

 x[1] == 1;

というように 1 次元の添字が付けられていると本エラーが出力されます。ただし、一見 2 次元の添字を付けているように見える場合にも本エラーが出力されることがあります。例えば先の例ですと、

 x[1,1] == 1;

と記述すると出力されます。このような int 型の値の並びは、SIMPLE の仕様で 2 次元の添字とはみなされません。こちらを 2 次元の添字とみなす方法はいくつかありますが、詳細については以下をご参照ください。

「<<SIMPLE 70>> 合致しないか、不定の要素がありました」と出ます。

sum 関数や制約式の条件式(添字の範囲を限定する式)に余分な添字が含まれていると、このようなメッセージが出力されることがあります。例えば、Element i, j に対して

 x[i] >= 0, j > 3;

は、制約の条件式 j > 3 に制約式 x[i] >= 0 に現れない添字 j が含まれており不適切です。

「<<SIMPLE 194>> NUOPTの重大エラー: "<<NUOPT 26>> LP/IP module cannot handle NLP."」と出ます。

上記メッセージは、非線形計画問題を扱えない環境(例えば Numerical Optimizer LP/IP モジュールを使用している場合)で非線形の制約式もしくは目的関数を含むモデルを実行した場合に出ます。

「<<SIMPLE 194>> NUOPTの重大エラー: "<<NUOPT 56>> Method "wcsp" not installed."」と出ます。

WCSP」が使えないライセンスにも関わらず、使おうとした場合出ます。また、定式化されている問題が整数変数を含む非線形計画問題となっている場合も出ます。この場合、問題を整数線形計画問題または整数変数を含まない非線形計画問題として定式化することで回避できる場合もあります。

「<<SIMPLE 196>> 警告: 目的関数がコンスタントとなっています」と出ます。

目的関数が変数を含まない場合、このような警告が出力されます。例えば、以下のような記述をした場合です。

 Objective obj;
 obj = 1;

このような警告が出たときは、データがモデルに適切に渡っていないことが多いです。データが適切に渡っているか確認することをお勧めします。

「fatal error C1509: コンパイラの制限 : 関数 'xxx' の例外ハンドラが多すぎます。関数を簡略化してください。」と出ます。

モデルファイルのサイズが大きい場合に出ることがあります。モデルを見直してモデルファイルのサイズを小さくすることにより回避できる可能性があります。

「error C2451: 条件式の型 'Equation' が間違っています。」と出ます。

上記のメッセージは VariableParameter を含んだ式を if や while の条件文の中に記述したときに出ます。以下記述例です。

VariableParameter vp;
...
if(vp == 1){
 ...
}

これを回避するために、オブジェクトに .val を付けます。以下修正例です。

VariableParameter vp;
...
if(vp.val == 1){
 ...
}

「error C2661: 'simple_fprintf' : xx 個の引数を伴うオーバーロードされた関数はありません」と出ます。

SIMPLE の関数 simple_fprintf は 32 個までの値出力までしか対応しておりません。32 個を超える場合は出力内容を分割する等して対応してください。

「error C2679:二項演算子' =':型 'Expression'の右オペランドを扱う演算子が見つかりません」と出ます。

上記エラーは Expression を他のオブジェクトに代入しようとした時に出ます。以下記述例です。


Expression e;
Variable x;
x = e;        // <- エラー

また、Variable を使った式の値を VariableParameter に代入しようとした時も出ます。以下記述例です。

VariableParameter v;
Variable x;
v = x+1;      // <- エラー

上記の場合 Variable そのものではなく、 .val を付与した Variable を利用します。以下修正例です。

VariableParameter v;
Variable x;
v = x.val+1;  // <- 正しい

「warning C4819: ファイルは、現在のコード ページ (yyy) で表示できない文字を含んでいます。」と出ます。

Numerical Optimizer Windows 版ではモデルファイル・データファイルの文字コードは Shift_JIS のみをサポートしています。異なる文字コードの場合は事前に Shift_JIS に変換してください。