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

Nuorium Optimizer FAQ

エラー

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

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

Nuorium 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)
-------------------------------------------------------------
...

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

モデルの中に変数の割り算または 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.maxtimoptions.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.errorCodeNuorium Optimizer/SIMPLE マニュアルにある「付録A Nuorium Optimizer/SIMPLE のエラーメッセージ」の「A.2 Nuorium Optimizer のエラー/警告」のエラー番号に対応しています。

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

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

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

また、「集合」と「添字」の記述方法については「Nuorium Optimizer/SIMPLE マニュアル」や「Nuorium Optimizer/SIMPLE 例題集」等を参考にしてください。

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

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

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

「sdpin: Impossible asdpin」と出ます。

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

「error: (NUOPT 10) IPM iteration limit exceeded.」と出ます。

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

  • 初期点を変更する
  • 自動スケーリング機能を off にする options.scaling = "off";
  • 反復回数上限を上げる(例えば、デフォルトで 150 であれば 300 にする) options.maxitn=300;

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

「error: (SIMPLE 67) 参照オブジェクト "x" の添字付けに誤りがあります。」と出ます。

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

x[1] == 1;

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

x[1,1] == 1;

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

「error: (SIMPLE 70) 条件式に現れる要素 x の使い方に誤りがあります。」と出ます。

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

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

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

「error: (NUOPT 26) LP/IP module cannot handle NLP.」と出ます。

上記メッセージは、Nuroium Optimizer V23 以前の製品をご利用で、非線形計画問題を扱えない LP/IP モジュールを使用していて、非線形の制約式もしくは目的関数を含むモデルを実行した場合に出ます。

「warning: (SIMPLE 196) 目的関数がコンスタントとなっています。」と出ます。

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

Objective obj;
obj = 1;

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

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

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

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

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

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;  // <- 正しい

(SIMPLE 123) データファイルの (xxx) の定義の付近において文法的な誤りがあります(問題のありそうな文字列 "yyy") と出ます。

データファイルの文字コードに問題がある可能性があります。 Nuorium Optimizer Windows 版で利用可能なデータファイルの文字コードは Shift_JIS (SJIS) のみです。 異なる文字コードの場合は事前に SJIS に変換してください。 Nuorium のファイルメニューにある「文字コードを指定して保存」から SJIS と指定して変換することも可能です。