トップ > ユーザーサポート > Numerical Optimizer FAQ > データ入出力

Numerical Optimizer FAQ

データ入出力

データの入出力方法を教えてください。

Windows 上または UNIX/Linux 上のテキストファイル(SIMPLE 独自の形式、CSV 形式)、Excel のセル、ユーザの作成したプログラム(C/C++ の配列)のいずれからでもデータを与え、また結果を出力することができます。モデルはすべての場合で共通に利用できます。Excel のセルからデータを与える場合には、Numerical Optimizer が提供する Excel アドインを使って指定します。ユーザの作成したプログラムから与える方法については、外部接続マニュアルに具体的に解説されています。Windows では Visual Studio の環境に、UNIX/Linux では gcc や Solaris の CC 等を使ってユーザプログラムと Numerical Optimizer を連結して、数理計画モデルにデータを与えることができます。S+NUOPT/RNUOPT では S-PLUS/R 環境と直接データを受け渡しすることが可能です。

Parameter の値を出力したい。

二つ方法があります。まずは、 .val.print() を用いる方法があります。

 a.val.print();

より細かい出力を行いたい場合は、simple_printf を用います。

 simple_printf("a=%lf\n",a);

データを読み込んだ結果、意図通りの式になっているか確認したい。

showSystem 関数を用いて展開された式を確認することができます。

showSystem 関数は最終的に構成される目的関数 Objective、制約式 Constraint、対称行列 SymmetricMatrix の具体的な形を出力します。

 showSystem(); 

とすれば、モデル全体の式の形を見ることができます。

また、showSystem の引数に制約式を与えることによって制約式の形を見ることができます。以下のように制約式オブジェクトを定義し、showSystem の引数に入れる必要があります。

 Constraint c(index=i);
 c[i] = x[i] >= 0;
 showSystem(c);

データファイル(.dat)で複数の添え字を持つ定数を表現したい。

 a = [1 2 3] 1.2 [4 5 6] 2.5;

あるいは、

 a = [1,2,3] 1.2 [4,5,6] 2.5;

のように [ ] の中にスペースあるいはカンマ「,」で区切って添え字を並べます。 データファイルでは、引用符(")でかこった文字列はその中の文字を一つと解釈するという意味ですので、

 a = ["1 2 3"] 1.2 ["4 5 6"] 2.5; // 誤り

とすると、a が "1 2 3" および "4 5 6" というそれぞれ空白を含んだ一つの要素で添字付けられていることになってしまいますのでご注意ください。また、

 a = ["1,2,3"] 1.2 ["4,5,6"] 2.5; // 誤り

も誤りとなります。

CSV ファイルをモデルのデータとして使う例を教えてください。

 // モデル
 Set S; 
 Element i(set=S);
 Parameter lower(index = i);
 Parameter upper(index = i);
 Parameter initial(index = i);

のように定義されたパラメータに対して、データファイル(拡張子 .dat を持つファイル)からデータを与える場合には、

 // データファイル
 lower = [1] 2.1 [2] 3.5 [3] 7.2; 
 upper = [1] 3.0 [2] 5.0 [3] 9.6; 
 initial = [1] 2.5 [2] 4.0 [3] 8.1;

のようになりますが、添字の情報 [1],[2],[3] が重複してしまい冗長です。CSV ファイル(.csv) からデータを与えると次のように比較的簡素に表現できます。

 i, lower, upper, initial
 1,   2.1,   3.0,     2.5 
 2,   3.5,   5.0,     4.0 
 3,   7.2,   9.6,     8.1

最初の行は添字とオブジェクト(Parameter)の名前を、各行の最初の数字は添字を示しています。ただし、CSV 形式は

 Parameter p;
 Parameter upper(index=i);

の p と upper のように異なる添字を持つオブジェクトを一つのファイルで表現することはできません。データファイルなら、

 p = 5;
 upper = [1] 3.0 [2] 5.0 [3] 9.6; 

のように与えることができます。

次のような二次元の添字の Parameter (cost)

 Set S,T;
 Element i(set=S),j(set=T);
 Parameter cost(index = (i,j));

には、SIMPLE 固有のデータファイルからは

 cost = [1,A] 9.2 [1,B] 3.5 [1,C] 7.2
        [2,A] 2.1 [2,B] 1.1 [2,C] 0.1;

のように値を与えますが、CSV ファイルなら次のようにそのままのイメージで与えることができます。

 cost,   A,   B,   C 
    1, 9.2, 3.5, 7.2 
    2, 2.1, 1.1, 0.1

この場合、最初の行はオブジェクトの名前と、二つ目の添字の値 (A,B,C) を示しています。各行の最初の数字は一つ目の添字の値 (1,2) を示しています。ただし、この場合には一つのファイルで一種類の定数のみしか与えることができません。CSV ファイル形式は大規模なデータに向いている書き方となります。

MPSファイルは扱えますか?

コマンドラインからのみ扱うことができます。

MPS ファイル example1.mps を入力として Numerical Optimizer を起動するには

% nuopt example1.mps

とします。

詳細は「Numerical Optimizer/SIMPLE マニュアル」の「MPS ファイル」を参照してください。

パラメータファイル nuopt.prm はどのようにして与えますか?

コマンドラインから実行する場合、パラメータファイルは実行時のカレントディレクトリに置くだけで読み込まれます。正常に読み込まれると


  <reading parameter file: nuopt.prm> 

と出力されます。

実行結果に表示される "e" は何ですか?

NUOPT の実行結果中の、

RESIDUAL                                      2.061428123e-09 

等に現れる e は常用対数の基数 (10) となっています。上記の例では 2.061428123 × (10 の -9 乗) を表します。