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

6.10 カウント関数count

 カウント関数countは,条件を満たす式の数を取得します.

 添字付き変数を含んだ制約式に対して制約式を満たす添字の個数を返す関数です.定数Parameterのみを含んだ式に対しては適用できません.

// 添字の範囲にわたる最小値
Expression count(制約式,範囲指定並び) // 戻り値は一般の式

 ここでいう「範囲指定並び」には,count関数の適用範囲となる添字を指定します.添字に条件をつけることはできないため注意してください.

 count関数によって,中間変数を用いることなく個数を数え上げることができるので問題規模の増加を防ぐことができます.目的関数やsoftConstraintで用いる場合にはメタヒューリスティクスの性質によりノイズを加えることによって速度を向上させることが可能です.以下簡単に説明します.

IntegerVariable x(index = i, type = binary);

Objective obj(type = minimize);
obj = count(x[i] == 1, i);

 上記のような問題の場合にノイズの導入は有効です.以下のように目的関数を書き換えます.

IntegerVariable x(index = i, type = binary);
Parameter rand(index = i);
Parameter M;
Objective obj(type = minimize);
obj = count(x[i] == 1, i) * M + sum(x[i] * rand[i], i);

 上記パラメータrandは適当な乱数を想定しています.Mは目的関数の第二項が第一項に影響を及ぼさないようにするためのスケーリング値です.このようにすると大幅に速度向上する場合がありますのでお試しください.


 

 

上に戻る