gurobi+python 備忘録

gurobi+pythonを使っていて忘れそうなことや見つけたことをメモります

gurobi7.5で多目的最適化がやりやすくなった?

お久しぶりです

 

ごたごたしている間にgurobi7.5がリリースされていました.

(って結構前か・・・)

 

このgurobi7.5になってから,多目的最適化をするのに便利なメソッドが追加されたようです.知らんけど.

 

www.gurobi.com

 

私もざっと見ただけなんでよくわからんのですが

これまで多目的最適化をするためには変数の係数をいちいち与えなければならなかったのか何なのか,分からんのですけど(何もわかってない),このsetObjectiveNメソッドによって,いつも使ってるsetObjectiveみたいなノリで複数の目的関数を設定できるようなんですね.

 

というわけで遊んでみました.

次のような整数混合線形計画問題を考えます.

 

min α*a+β*10*b

s.t. a>=1

      a+b >= 2

(aは連続,bは0-1変数)

(α,βは重み)

 

 

この問題でパラメータαに大きな値を置く(aを優先する)と,最適解は

{a,b}={1,1}

になり,逆にβに大きな値を置く(bを優先する)と,最適解は

{a,b}={2,0}

になります.他の解はパレート最適でないので出てきません.

具体的には,αがβの10倍を超える値になれば,上の解に,下回る値なら下の解になります.そのはずです.

 

このαとかβとか重みをおいて自分で普通に最適化してもいいんですが,今回はそれをgurobiにやってもらおうというやつになります.

 

 

setObjectiveNメソッドの第一引数は,目的関数の式になります.

第二引数はindexといいます.多目的最適化は名前の通り複数の目的関数を扱うわけですが,その複数ある目的関数に固有の番号を付けて管理するためのものと思います.知らんけど.

第三引数がわかりません.上に貼り付けたgurobiのサイトを見ると,priorityのようですが...

priorityは優先,weightは重みです.

第三引数がpriorityなら,数字の大きい方の最小化を最優先し,それを邪魔しない範囲で数字の小さい方の最小化をするはず.

weightなら,前述のαとβのように扱われるはず.

 

 

一方は何の値か指定せずに与えました.もう一方はweightをこの値にするよと伝えてみました.

上段の何の値か指定しない場合はaを優先した解になりました.このことから,第三引数は通常priorityであろうことが伺えます.

下段の場合はbを優先した解になりました.α=2,β=1として扱ってもらえたものと思われます.この場合αがβに対して10倍以下なので,解はこうなりました.

 

本当にweightが重みとして機能しているのか?という確認もしてみました.

 

 

重みを10と1にすると,解は2と0,つまりbの最小化を優先した解になりましたが,

重みを11と1にすると,解は1と1,つまりaの最小化を優先した解になりました.

αがβの10倍より大きいかどうかで解が切り替わっています.

というわけで,重みとして扱ってもらえていると思えます.

 

まとめると

  • gurobi 7.5 になって,多目的最適化がやりやすくなったらしい
  • setObjectiveNの第三引数はpriority
  • その第三引数をweightとして与えることも可能

そんな感じです.

 

自分の気になるところだけざざっと調べた内容をそのままレポートしましたんで,オチはないんです.