5.9 添字クラスElement
 添字はElementというクラスで表現されます.添字とは数式の
に相当するものを意味します.添字と集合を対応させるには,引数
setを用います.頭文字のsは小文字である事に注意してください.集合クラスSetと併用することで,変数Variableを集合の要素ごとに設定できます(制約式Constraint,定数Parameter,整数変数IntegerVariable,式Expressionについても同様です).以下の例では,3個の変数y[1], y[2], y[3],3個の定数b[1], b[2], b[3]を定義しています.
               
Set S; S = "1 2 3"; Element i(set = S); Variable y(index = i); Parameter b(index = i);
 添字は複数導入することも可能です.次の例では6個の変数x["1, p"], x["1, q"], x["2, p"], x["2, q"], x["3, p"], x["3, q"]を定義しています.
               
Set S; Set T; S = "1 2 3"; T = "p q"; Element i(set = S); Element j(set = T); Variable x(index = (i, j));
 一つの集合に対して複数の添字を定める事もできます.次の例では12個の定数a["1, p, p"], a["1, p, q"], a["1, q, p"], a["1, q, q"], a["2, p, p"], a["2, p, q"], a["2, q, p"], a["2, q, q"], a["3, p, p"], a["3, p, q"], a["3, q, p"], a["3, q, q"]を定義しています.集合Tに対して2つの添字j, kが定められています.
               
Set S; Set T; S = "1 2 3"; T = "p q"; Element i(set = S); Element j(set = T); Element k(set = T); Parameter a(index = (i, j, k));
複数の添字を持つ対象を個別に記述する場合は,添字部分をダブルクォート"で囲む必要があります.
y["1, p"] >= b["1, p"] + 3;
また以下のようにダブルクォートで囲まないと添字は自動展開され,制約式が一括して複数定義されます.(添字の自動展開機能)
y[i, j] >= b[i, j] + 3;
添字は,属する集合が整数値を取る場合には次のような演算子を用いることができます.
, (順序対) + (和) - (差) / (商) * (積) % (余り) ceil (切り上げ) floor (切り下げ)
 次の例では,定数a[1], a[2], a[3]に初期値2, 4, 6を設定しています.
               
Set S = "1 2 3"; Element i(set = S); Parameter a(index = i); a[i] = 2 * i;
 次の例では,制約式を記述しています.制約式の左辺を定義するために偶数番目の項のみの和を取得しています.
               
Set S; S = "1 2 3 4 5 6"; Element i(set = S); Variable x(index = i); sum(x[i], (i, i % 2 == 0)) <= 5;
 次の例では,漸化不等式を定義しています.
               
Set S = "1 2 3 4"; Element i(set = S); Variable x(index = i); x[i] <= x[i + 1], i != 4;
 添字クラスは,「Element i;」などと集合に対応させないで定義することも可能です.ただし,これは順序集合クラスのための定義です.詳細は 「5.11 順序集合クラスOrderedSet」を確認してください.順序集合クラス以外のために用いると未定義動作を起こしやすいため注意が必要です.例えば,以下のコードは未定義動作になります.
               
Set I = "1 .. 10";
Element i(set=I);
Parameter a(index=i);
a[i] = i;
Element j; // 集合に対応されていない添字
simple_printf("%d\n", a[i], (i,j)<I); // 未定義動作順序集合クラスために用いるなどの明確な目的がない場合には,添字は集合と対応させて定義するのが推奨されます.
上に戻る
