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

6.6 重複不能関数alldiff

 重複不能関数alldiffは,添字つきの離散変数DiscreteVariableを引数に取り,「それぞれの値が全て異なる」という制約を与えることができます.

 次の例では,添字と定義域が同じ集合を対象とする,離散変数yを考えます.alldiff関数により,y[1], ..., y[10]は全て異なる値(1, ..., 10のどれか)を取ります.

Set S = "1 .. 10";
Element i(set = S);
DiscreteVariable y(dom = S, index = i);
alldiff(y[i], i);

 第二引数の添字は,省略することもできます.

alldiff(y[i]);

 alldiff関数の引数には,条件式を与えることもできます.これにより,alldiff関数が作用する範囲を制限することができます.次の例では,y[1], ..., y[5]までは,全て異なる値を取るように定めています.

Set S = "1 .. 10";
Element i(set = S);
DiscreteVariable y(dom = S, index = i);
alldiff(y[i], (i, i <= 5));

 条件式を付与した場合は,第二引数の添字を省略することはできません.例えば,次の例は誤りです.

alldiff(y[i], i <= 5);

 次の例では,y[1], y[2], y[3]が重複せずにa, b, cのいずれかを取るように定めています.

Set S = "1 .. 10";
Set T = "a b c";
Element i(set = S);
DiscreteVariable y(dom = T, index = i);
alldiff(y[i], (i, i <= 3));

 

 

上に戻る