Slide 1

Slide 1 text

9.3 Special ordered sets of variables Naoki Nishimura @nnnnishi4 1 Model Building in Mathematical Programming

Slide 2

Slide 2 text

n Special order set of variables (SOS) とは︖ • 典型的な条件を満たす変数の集合 n 利点は︖ • SOSの構造を利⽤した⾼速な分枝限定操作がソルバーによっては 搭載されている n 応⽤例は︖ • SOS type1(変数集合のうち1つだけが⾮ゼロになる) example 9.5: いずれか⼀つの⽤地に⼯場を建設する example 9.6: 離散的な関数を表現 • SOS type2(隣接するたかだか2つの変数が⾮ゼロになる) example 9.7: ⾮線形関数の区分線形近似 example 9.8: 多変量⾮線形関数の区分線形近似 n SOSを利⽤できないソルバーを利⽤しているときには︖ • 線形表現でも同等の条件を表せる n 実装は︖ • Python-MIPを利⽤するとpythonからCBCのSOSを利⽤できる 2 概要

Slide 3

Slide 3 text

• 2つの典型的なタイプの条件を満たす変数集合に対してSOS1と SOS2という概念が提案された [Beale and Tomlin 1969] ü SOS1︓1つの変数が⾮ゼロでなければならない変数の集合 ü SOS2︓最⼤2つの変数が⾮ゼロである変数の集合、 2つの変数は与えられた順序で隣接しなければならない • ある変数のセットがSOS1またはSOS2に属するという条件を、 整数の変数と制約を使ってモデル化することは可能 • しかし、専⽤のアルゴリズムで処理すると⾼速に処理できる 3 9.3 Special ordered sets of variables

Slide 4

Slide 4 text

SOS1︓変数集合のうち1つだけが⾮ゼロになる • デポはA,B,C,D,Eのいずれかの位置に1つだけ建設することができる • 0-1変数δiを⽤いてデポがi (∈{A,B,C,D,E})に設置︓δi=1とする • 変数の集合(δ1,δ2,δ3,δ4,δ5)はSOS1とみなすことができる • SOS1であるという条件と制約(9.56)で整数性を保証されおり、 δiが整数であることを規定する必要はない → どれか⼀つが⾮ゼロで和が1なので、どれかが1その他が0となるため • デポが⾃然な順序で並んでいるとSOSには⼤きな利点がある • https://python-mip.readthedocs.io/en/latest/examples.html#exsos 4 SOS1の例︓Depot Siting (Example 9.5)

Slide 5

Slide 5 text

5 参考1︓SOSでの変数への順序(重み)付け ILOG CPLEX Optimization Studio/12.9.0/ Example: SOS Type 1 for sizing a warehouse https://www.ibm.com/docs/en/icos/12.9.0?topic=sos-example-type-1-sizing-warehouse 変数につけた重みをもとに 分枝限定操作がされる 例では建設費⽤に⽐例した 重み付けをしている

Slide 6

Slide 6 text

6 参考2︓GurobiでのSOSの設定 https://www.gurobi.com/documentation/9.1/refman/py_model_addsos.html#pythonmethod:Model.addSOS 変数にweightsを設定する

Slide 7

Slide 7 text

• ⼯場の⽣産能⼒Cは投資額Iの増加により離散的に拡張できる • 変数の集合(δ0, δ1, δ2, δ3, δ4, δ5)をSOS1とする • CをIの離散的な関数を表現できる • C(I)︓ δ0=1のときI=0,C=0, δ1=1のときI=I1,C=C1... • 0-1変数の2値以上の変数への⼀般化ともみなせる 7 SOS1の例︓Capacity Extension (Example 9.6)

Slide 8

Slide 8 text

SOS type2︓隣接するたかだか2つの変数が⾮ゼロになる 8 SOS2の例︓Non-linear Functions (Example 9.7) 左図の区分線形関数上の点はO,A,B,C,Dの うちの隣接する2点の内分点として表せる 例︓ y=x**3を左下のように区分線形近似する λ4=0.5, λ5=0.5とするとx1=2のときのyは 以下のように近似される 2**3 ≒ (3.375*0.5 + 15.625*2)/2= 9.5

Slide 9

Slide 9 text

SOS2の例︓Non-linear Functions of Two or More Variables • z =g(x, y)をxとyの⾮線形関数とする • 図9.2のように(x, y)の値の格⼦点を定義 (等間隔と限らない) • 各格⼦点に⾮負の重み変数λijを考える • 格⼦点における(x, y)の値を(Xs, Yk)とすると、 関数z=g(x, y)は以下の関係で近似される • SOS2の⼀般化であるような以下を条件として加える • (9.66) はξ、ηをSOS2として以下のように表現できる 9 ξ2 η5 • ξに関するSOS2︓多くとも2つの隣接する⾏和が⾮ゼロ • ηに関するSOS2︓多くとも2つの隣接する列和が⾮ゼロ 例︓ξ2 =1/3, ξ3 =2/3, η5 =1/4, η6 =3/4 のとき ① λ52 =1/6、λ62 =1/6、λ53 =1/12、λ63 =7/12 ② λ52 =1/4, λ62 =1/12, λ63 =2/3 などと⼀意性のない形で表せてしまう ζをさらにSOS2として加えると②の3頂点に⼀意に定まる ζ1 • x⽅向の格⼦点間の補完をしなければξ, ζは不要 • λは chain of linked SOS sets と呼ばれる

Slide 10

Slide 10 text

• 利⽤しているソルバーにSOSの機能が搭載されていれば利⽤するのが望ましい • SOSの機能が利⽤できなくても、意味する条件は0-1変数と線形制約を⽤いて 課すこともできる n SOS1 • (x1, x2, ... , xn)でSOS1を表したいとする → xiは⾮負としても⼀般性を失わない • xが0-1変数でないとき、0-1インジケータ変数δ1, δ2, ... , δnを導⼊し、 xと以下のように対応させる(Mi,miはxiの上下界を表す定数) • δについて以下の制約を課す • xが0-1変数のときは単純にδをxとみなして(9.70)だけでよい 10 SOS1の表現 xiが⾮負なので、 δiが1のとき mi ≦ xi ≦ Mi δiが0のとき xi = 0 ≧ miはxiの下界なので誤植 X

Slide 11

Slide 11 text

11 参考3︓Gurobi内部でのSOSの処理 SOSの構造を利⽤する場合と bigMを利⽤する場合を⾃動 的に切り替え、性能のよいほ うで実⾏される https://www.gurobi.com/documentation/9.1/refman/constraints.html#subsubsection:SOSConstraints

Slide 12

Slide 12 text

12 SOS2の表現 n SOS2 • (λ1, λ2, ... , λn)でSOS2を表したいとする • 0-1変数δ1, δ2, ... , δn-1を導⼊し、xと以下のように対応させる • これはSOS1とSOS2の関係を表している • (9.72)はδをSOS1とすれば省略してOK 例︓δ1=1,他δ=0とすると λ1,λ2≦1, ほかλ=0となり、 隣接するたかだか2つのλが ⾮ゼロとなる λの和が1でないときは(9.71)の δに和を係数として乗ずればよい

Slide 13

Slide 13 text

• ⾮連続の区分線形表現をモデリング(よりタイトな線形近似になる) 例︓図9.3のx=a1で⾮連続な区分線形関数を表現 • λをSOS2とするのは例9.7の区分線形近似と同様 • ⾮連続部分を左、右とそれぞれλを⽤意していずれかのみ1になるようにすればいい 13 モデリングの改良 [Sherali 2001] 連続部分は例9.7と 同様に⼀つのλ ⾮連続部分は左λ、右λと2つ ⽤意、(9.74)でどちらかしか 1がたたないようにする

Slide 14

Slide 14 text

• 区分線形近似をSOStype2を使って実装 • https://colab.research.google.com/drive/1EebR1stM0DhPmKD8XBj0 o0b5QdFr0E-2?usp=sharing 14 Python-MIPをつかったSOSの実装例