二つの変数で小さい方を表す方法

1. 二つの変数で小さい方を表す方法#

1.1. 説明#

\(2\) つの連続変数があったときに,補助的な \(0\)-\(1\) 整数変数を導入することにより, \(2\) つの変数で小さい方 (\(2\) つの変数の最小値) を表す方法を解説する.

\(2\) つの連続変数 \(x_1, x_2\) があるとする. 今この連続変数には上下限が与えられているとする.

(1.19)#\[\begin{split}L_{1} &\leq x_1 \leq U_1, \\ L_{2} &\leq x_2 \leq U_2\end{split}\]

\(L_{\min} := \min\{L_1, L_2\}\) とした場合, 以下のように記述すると連続変数 \(y\)\(x_1\) 及び \(x_2\) の小さい方を表す.

(1.20)#\[\begin{split}y &\leq x_1, \\ y &\leq x_2, \\ y &\geq x_1 - (U_1 - L_{\min})\cdot z, \\ y &\geq x_2 - (U_2 - L_{\min})\cdot (1 - z)\end{split}\]

ここで補助変数として \(0\)-\(1\) 整数変数 \(z\) を導入している. \(z\)\(0\) の場合に \(x_1\) が最小値,\(1\) の場合は \(x_2\) が最小値となる.

1.2. #

非負の連続変数 x1 及び x2 があり,上限をそれぞれ 100 及び 200 とする.このとき二つの変数の最小値を表す変数 y は PySIMPLE で以下のように記述できる.

 1from pysimple import Variable, BinaryVariable, Problem
 2p = Problem(type=max)
 3U1 = 100
 4U2 = 200
 5x1 = Variable(lb=0.0, ub=U1)
 6x2 = Variable(lb=0.0, ub=U2)
 7y = Variable(lb=0.0)
 8z = BinaryVariable()
 9p += y <= x1
10p += y <= x2
11p += y >= x1 - U1 * z
12p += y >= x2 - U2 * (1-z)
13p += 8 * x1 + 3 * x2 >= 15
14p += 10 * x1 + 5 * x2 <= 19
15p += 1 * x1 + 16 * x2
16p.solve()

1.3. 関連#