7. 境界条件と制約条件#

7.1. 説明#

制約条件とよく似た概念に境界条件 (もしくは上下界条件) があり, 複雑な定式化を図る中で,これらの違いが問われることがある. ここで境界条件とは変数の定義域で,制約条件以前にその変数が動ける範囲のことである.

7.1.1. 構文構造の違い#

例えば \(x\geq 0\) という非負条件があった場合に, ただこれだけの情報であれば,制約条件なのか,境界条件なのかが判別がつかない.

モデリング言語は数式ベースの構文を採用することを概念的な基礎としているため, どのようにして境界条件を制約条件と区別して記述すればよいかは,非自明である.

実際,モデリング言語 SIMPLE の場合,C++SIMPLE と PySIMPLE とで, これら記述方法は異なる.

7.1.1.1. C++SIMPLE の場合#

「変数と定数の比較」が境界条件として解釈される.それ以外はすべて制約条件として扱われる. ここでいう「変数と定数の比較」とは,(変数クラス)(比較演算子)(定数) のパターンで記述される不等式もしくは等式のことである.

例えば x, y を変数,A を定数とするとき,以下の場合はパターン 1 から 3 のみが境界条件で,他は制約条件を C++SIMPLE では表す.

1x >= 0;           // pattern 1
2x >= A;           // pattern 2
3x[i] >= A[i];     // pattern 3
4sum(x[i],i) >= A; // pattern 4
5x >= y;           // pattern 5
6x + y >= A;       // pattern 6
72*x >= A;         // pattern 7

ここで特にパターン 7 の左辺は一見変数だけのように見えるが,2* という演算が行われており, 2*x は変数クラスではなく式クラスとしての扱いとなるため,境界条件とは解釈されない. 同様に 1*x も式クラスである.

現在の上下限値の確認は,下限であれば x.lb.val.print() によって, 上限であれば x.ub.val.print() で確認できる.

7.1.1.2. PySIMPLE の場合#

変数を宣言する際に,その変数の下限 lb と上限 ub を設定できる. 唯一,ここでの設定が境界条件の設定となっており, 以後,問題クラスに追加する不等式や等式はすべて制約条件として解釈される.

注釈

唯一とあるが,より厳密には V26 (PySIMPLE 1.5.0) で追加された fix メソッドでも bound 扱いになる.

https://www.msi.co.jp/solution/nuopt/docs/pysimple/guide/fix.html

7.1.2. 境界条件と制約条件の違いが重要となる状況#

実行不可能 (infeasible) な求解結果であった場合に, ある変数は制約条件に違反することになるが, 境界条件に違反することはない.

よってこの場合には SIMPLE では次のエラーが報告されやすい.

(NUOPT 2) infeasible(linear constraints and variable bounds).

例えば PySIMPLE の場合,次のサンプルコードに prob += x[i] == -1 を追加した場合である.

 1from pysimple import Problem, Element, Variable, Sum, Parameter
 2
 3i = Element(value=range(1, 6))
 4a = Parameter(index=i, value={1: 2, 2: 3, 3: 6, 4: 2, 5: 4})
 5b = Parameter(value=0)  # `value=0` は省略可能
 6x = Variable(index=i, lb=0)
 7prob = Problem(type=min)  # `type=min` は省略可能
 8prob += Sum(a[i]*x[i], i) >= b
 9prob += Sum(x[i], i)
10prob.solve()

このため求解後にある一部の解を固定した前提で新たに求解したいと考え, 変数に対して PySIMPLE で等式制約条件を新たに設定した場合に, その設定が infeasible であったらならば, 追加した条件はあくまでも制約条件のため, 出力された解は値固定が保証されないこととなる.

つまり値固定が境界条件としてなされたのならば,その値を前提に求解が行われ, infeasible であることは値固定がなされていない変数が負うことになる. しかし値固定が制約条件の意味であったならば,その固定した変数も infeasible であることの整合関係として含められることとなる.

7.2. 関連#