6.3.3 ソフト制約関数softConstraint
softConstraint
関数を使用すると,その行以降に出現した制約式をソフト制約として扱います.さらに,softConstraint
関数へ与えた引数(求解オプション)により制約式の違反量の扱いの設定もできます.
一般的なソフト制約への求解オプションの設定は,次のように3つの引数の値により行われます.
softConstraint(int weight, double a, double b);
ただし,引数は全て非負で設定します.この時,ソフト制約の違反量をxとすると,そのソフト制約のペナルティ量pは,
p = (a * x * x + b * x) * weight;
という式により定義します.
また,softConstraint
関数の第2引数と第3引数は省略することができ,次のような規則により解釈されます.
- 第2, 3引数の省略
softConstraint(weight) ==> softConstraint(weight, 0, 1)
[p = x * weight
と等価] - 第3引数の省略
softConstraint(weight, a) ==> softConstraint(weight, a, 0)
[p = a * x * x * weight
と等価]
即ち,
softConstraint(1); // softConstraint(1, 0, 1)と等価 softConstraint(1, 2); // softConstraint(1, 2, 0)と等価
となります.
softConstraint
関数は,第2, 3引数を省略する時のみ引数に-1, -2を設定できます.それぞれハード制約,セミハード制約と解釈されます.
softConstraint(-1); sum(a[i] * x[i], i) == 3; // ハード制約となる
softConstraint(-2); sum(a[i] * x[i], i) == 3; // セミハード制約となる
hardConstraint
関数,semiHardConstraint
関数,softConstraint
関数が混在する場合は,後の行に記述されたものが優先されます.
バージョン8, 9のsoftConstraint
関数は,softConstraint(int weight)
という書き方のみ可能でした.バージョン10から,上記のような形式になっています.なお,バージョン8, 9で作成したwcspモデルにおいて,softConstraint(weight)
のような記述は,バージョン10の省略規則により同一なものとして計算されます.そのため,バージョン8, 9で作成したモデルのsoftConstraint
関数はバージョン10以降でも変更する必要はありません.
上に戻る