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

8.3 csv形式データファイル

 csv形式データファイルでは,定数Parameterの値,変数Variableの初期値が設定できます.dat形式データファイルと異なり,集合Setの要素を設定することはできません.csv形式データファイルの拡張子は.csvでなければなりません.

 定数の値や変数の初期値を設定する場合は,name引数によって定数や変数の名前を定める必要があります.Windows版では,特にname引数を付けない場合には,モデルファイルで定義された名称そのものがnameだと認識されます.つまり,以下の二つの例は同等です.

Parameter a;
Parameter a(name = "a");

 csv形式のデータファイルは半角コンマ,で区切られた行から構成されています.

 次の例では,csv形式データファイルに定数a(name = "aa")の値10を設定しています.

 モデルファイル内

Parameter a(name = "aa");

 データファイル内(csv形式)

aa
10

 なお,csv形式データファイルではヘッダー行のみの場合は読み込まれません.以下の例では定数aには値が設定されませんのでご注意ください.

 データファイル内(csv形式)

aa, 10

 次の例では,csv形式データファイルに変数x(name = "xx")の初期値4を設定しています.

 モデルファイル内

Variable x(name = "xx");

 データファイル内(csv形式)

xx
4

 一つのcsv形式データファイルには,まとめて複数の設定を記述することができます.以下の例では,定数a(name = "aa")の値10,変数x(name = "xx")の初期値4を両方設定しています.

 モデルファイル内

Parameter a(name = "aa");
Variable x(name = "xx");

 データファイル内(csv形式)

aa, xx
10, 4

 //はじまりのコメント文を付与することもできます.

// 定数と初期値の設定
aa, xx
10, 4

 改行を挟む事はできません.

 添字のある定数Parameterの値や,変数Variableの初期値を設定する際には,以下のようにします.次の例では,定数a[1], a[2], a[3]に対して,初期値1, 0.5, -1を与えています.

 モデルファイル内

Set S = "1 2 3";
Element i(set = S);
Parameter a(name = "aa", index = i);

 データファイル内(csv形式)

i, aa
1, 1
2, 0.5
3, -1

 これは,モデルファイル内で以下のように記述する場合と同じ意味です.

a[1] = 1;
a[2] = 0.5;
a[3] = -1;

 csv形式データファイルではまとめて複数の設定を記述できますが,添字を持つ定数や変数をまとめて設定する場合は,それらが属する添字が同一でなければなりません.次の例では,定数a[1], a[2], a[3]に対して,初期値1, 0.5, -1を,定数b[1], b[2], b[3]に対して初期値3, 5, 7.1を与えています.

 モデルファイル内

Set S = "1 2 3";
Element i(set = S);
Parameter a(name = "aa", index = i);
Parameter b(name = "bb", index = i);

 データファイル内(csv形式)

i, aa, bb
1, 1, 3
2, 0.5, 5
3, -1, 7.1

 次のように,定数aとbの添字が異なる場合は,一つのcsv形式データファイルでa, b両方の値を設定することはできません.

 モデルファイル内

Set S = "1 2 3";
Set T = "p q";
Element i(set = S);
Element j(set = T);
Parameter a(name = "aa", index = i);
Parameter b(name = "bb", index = j);

 csv形式データファイルで2次元の添字を持つ定数Parameterや変数Variableの初期値を設定するには,二通りの方法があります.一つは添字を全て縦に左に記述する方法で,1D書式と呼ばれます.もう一つは,最後の添字を横一行目に記述する方法です.これは2D書式と呼ばれます.

 以下の例では,変数x["1, p"], x["1, q"], x["2, p"], x["2, q"]に初期値1, 3, 5, 7を1D書式で与える場合と,2D書式で与える場合両方を記述しています.

 モデルファイル内

Set S = "1 2";
Set T = "p q";
Element i(set = S);
Element j(set = T);
Variable x(name = "xx", index = (i, j));

 データファイル内(csv形式1D書式)

i, j, xx
1, p, 1
1, q, 3
2, p, 5
2, q, 7

 データファイル内(csv形式2D書式)

xx, p, q
1, 1, 3
2, 5, 7

 これは,モデルファイル内で以下のように記述する場合と同じ意味です.

xx["1, p"] = 1;
xx["1, q"] = 3;
xx["2, p"] = 5;
xx["2, q"] = 7;

 1D書式の場合,定数や変数の添字が同じであれば,同時に複数の設定を行うことが可能です.しかし,2D書式の場合は一つのcsv形式データファイルに対して一つの定数あるいは変数しか設定する事ができません.

 以下の例では,変数x["1, p"], x["1, q"], x["2, p"], x["2, q"]に初期値1, 3, 5, 7を,定数a["1, p"], a["1, q"], a["2, p"], a["2, q"]に値2, 4, 6, 8を1D書式で与えています.

 モデルファイル内

Set S = "1 2";
Set T = "p q";
Element i(set = S);
Element j(set = T);
Variable x(name = "xx", index = (i, j));
Parameter a(name = "aa", index = (i, j));

 データファイル内(csv形式1D書式)

i, j, xx, aa
1, p, 1, 2
1, q, 3, 4
2, p, 5, 6
2, q, 7, 8

 集合クラスの構成要素は,明示的に定義しなくとも,モデルファイルやデータファイルの情報から自動的に定義されます.これをSIMPLEの自動代入機能と呼びます.以下の例では,自動代入機能により,集合Sの要素は1, 2, 3であると判断されます.

 モデルファイル内

Set S;
Element i(set = S);
Parameter a(index = i);

 データファイル内(csv形式)

i, a
1, -1
2, -1
3, 1

 以下のように,dat形式データファイルでa[1], a[2], a[3]の値を定めた場合も同様です.

a = [1] -1 [2] -1 [3] 1;

 以下のように,モデルファイル内でa[1], a[2], a[3]の値を定めた場合も同様です.

Set S;
Element i(set = S);
Parameter a(index = i);
a[1] = -1;
a[2] = -1;
a[3] = 1;

 パラメータ定義時の添字の順序と csv形式の添字の順序は一致している必要があります.例を使って説明します.

 モデルファイル内

Set S;
Set T;
Element i(set = S);
Element j(set = T);
Parameter a(name = "aa", index = (i, j));

 このモデルに対し以下のように設定したいとします.

aa["1, p"] = 1;
aa["1, q"] = 3;
aa["2, p"] = 5;
aa["2, q"] = 7;

 以下はモデルファイル内のaaと添字の順序が異なるため無効となります.

 データファイル内(csv形式)

j, i, aa
p, 1, 1
q, 1, 3
p, 2, 5
q, 2, 7

 以下のように設定してください.

 データファイル内(csv形式)

i, j, aa
1, p, 1
1, q, 3
2, p, 5
2, q, 7

 

 

上に戻る