最適化セミナーのご案内

17.1 折れ線関数の表現

 折れ線関数$y = \left\{ \begin{array}{@{}l@{}} -x,x \le 0 \\ x,x \ge 0 \end{array} \right.$を表現する事を考えます.ifelse関数を用いて折れ線関数を表現することはできませんが,0-1変数dを次のように導入する事で,折れ線関数を表現できます.

Variable x,y;
IntegerVariable d(type=binary);
Parameter M;
M = 10000; // 非常に大きな数
-M*(1-d) <= x <= M*d;
x - M*(1-d) <= y <= x + M*(1-d);
-x - M*d <= y <= -x + M*d;

 $x$に関する上下限制約は$d = 0 \Rightarrow  - M \le x \le 0$$d = 1 \Rightarrow 0 \le x \le M$であることを意味しています.$M$として十分大きな数を取ると$d = 0 \Rightarrow x \le 0$$d = 1 \Rightarrow 0 \le x$と等価です.

 $y$に関する一つ目の上下限制約は$d = 0 \Rightarrow x - M \le y \le x + M$$d = 1 \Rightarrow x \le y \le x$を意味します.つまり,$M$として十分大きな数を取ると$d = 1 \Rightarrow y = x$という意味になります.同様に考えると,二番目の上下限制約は$d = 0 \Rightarrow y = -x$という意味になります.


 

 

上に戻る