数理システム 最適化メールマガジン

バックナンバー ( 2023 Vol.1 ) 2023 年 1 月 11 日 発行

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  数理システム 最適化メールマガジン
                     https://www.msi.co.jp/solution/nuopt/top.html
                           2023 Vol.1 ( 2023 年  1 月 11 日 発行 )
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

数理システム 最適化メールマガジンでは,数理計画法パッケージ
Nuorium Optimizer をはじめとして,最適化に関する様々な情報や
ご案内を提供していきます.

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 新年のご挨拶
 ■ <トピック> 数理システムアカデミックコンファレンス FY2022 ご案内
 ■ <トピック> NTT データ数理システム主催数理最適化勉強会 2022 ご報告
 ■ <セミナー> オンラインセミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 22 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> 新年のご挨拶
******************************************************************

NTTデータ数理システム・数理計画部の多田です.
昨年は皆様に大変お世話になりました.

さてこの年末年始,皆様はいかがお過ごしでしたでしょうか.

私は冬期休暇を利用し,帰省や初詣等,幾つかの場所を訪れました.
目的地への道すがら,ふと周りを見渡すと,トラック配送,電車運行,
遊園地運営,等の業務.年末年始も様々な業務に支えられて社会が回って
いることを実感しました.
更に周囲に目を配らせていると,Nuorium Optimizer で立案した計画を
基に業務を遂行している現場がちらほら.
弊社の休暇中も Nuorium Optimizer が活躍していることを再認識し,
身が引き締まる思いをした次第でございます.

「いつもどこかで Nuorium Optimizer による最適化計算が行われている」
このことを肝に銘じ,今後とも Nuorium Optimizer の機能増強,
数理最適化ソリューションのご提供を心がけてまいります.

本年もどうぞよろしくお願いいたします.

                                                (多田 明功)

******************************************************************
■ <トピック> 数理システムアカデミックコンファレンス FY2022 ご案内
******************************************************************

数理システムアカデミックコンファレンス FY2022 を開催いたします.
このイベントでは弊社製品をご利用頂いているアカデミックの先生による
ご講演及び 2022 年度学生研究奨励賞で優秀な成績を収められた方に研究
成果を発表していただきます.今年はオンデマンド動画をお好きなタイミ
ングでご覧いただける形の予定です.

[公開開始予定日]
  2023 年 02 月 10 日(金)

[費用]
  無料

[参考:学生研究奨励賞とは]
  https://www.msi.co.jp/solution/stuaward.html

ご講演動画のプログラムやご視聴登録につきましては,決まり次第
弊社 Web ページにてご案内いたします.

                                                (石橋 保身)

******************************************************************
■ <トピック> NTT データ数理システム主催数理最適化勉強会 2022 ご報告
******************************************************************

先日は弊社主催「数理最適化勉強会 2022 」を開催させていただきました.
多数のご参加まことにありがとうございました!

■ 講演者
品野勇治博士 (Zuse Institute Berlin)

■ 講演題目
Introduction to Ubiquity Generator (UG) Framework Version 1.0

■ 講演日時
2022 年 12 月13 日 (火) 17:00~18:00

Ubiquity Generator Framework (UG) は,品野氏によって開発された
分枝限定法の並列化フレームワークです.
最新の分枝限定法に基づく最適化問題ソルバを大規模並列分枝限定法
ソルバへと拡張するためのソフトウェアフレームワークとして
Nuorium Optimizer をはじめ多くの混合整数計画ソルバの大規模並列化を
実現してきました.

本講演では,これまでの分枝限定法並列化研究の変遷や UG の内部詳細,
さらには分枝限定法以外のソルバの並列化を扱えるようにした近年の
拡張までを解説していただきました.
質疑応答では今後の UG の進展やコラボレーションの秘訣などが活発に
議論されました.

講演の詳細は MSIISM に記事として掲載していますので是非ご覧ください!

[URL] https://www.msiism.jp/article/mp-study-2022.html

                                                (藤井 浩一)

******************************************************************
■ <セミナー> オンラインセミナーのご案内
******************************************************************

3 月までに開催する無料のオンラインセミナーをご紹介します.

まずは「Nuorium Optimizer 紹介セミナー」にご参加いただき,
数理最適化を大まかに理解していただくことをおすすめいたします.

1 月には製造業に特化したセミナーも開催予定です.
生産スケジューリング等にご興味のある方はぜひこちらのセミナーにも
ご参加ください.

[ 製造現場の業務改善に向けた数理最適化ソリューション紹介セミナー ]
  2023 年 01 月 25 日 (水) 13:30~15:30
  詳細とお申込み:
    https://www.msiism.jp/event/nuopt-manufacturing-scheduling.html

[ Nuorium Optimizer 紹介セミナー ]
  2023 年 02 月 03 日 (金) 13:30~15:30
  2023 年 03 月 15 日 (水) 13:30~15:30
  詳細とお申込み:
    https://www.msiism.jp/event/nuopt-introduction.html

[ Nuorium Optimizer ハンズオンセミナー ]
  2023 年 02 月 21 日 (火) 13:30~16:00
  詳細とお申込み:
    https://www.msiism.jp/event/nuopt-hands-on.html

                                                (石橋 保身)

******************************************************************
■ <  tips  > 使ってみよう PySIMPLE(第 22 回)
******************************************************************

このコーナーでは,Nuorium Optimizer の Python インターフェースである
PySIMPLE のエッセンスを紹介していきます.

今回は数理最適化を考えているとしばしば遭遇する多目的最適化について,
PySIMPLE を用いて考えてみましょう.

多目的最適化問題とは目的関数が複数存在する数理最適化問題のことです.
複数の目的関数を同時に最適とする解(完全最適解)が存在するとは限らず,
また目的関数も複数とることができないため,工夫が必要となります.

PySIMPLE では目的関数に添字が残っていたり,複数の目的関数を
設定したりするとエラーとなります.

------------------------------------------------------------------
>>> p = Problem()
>>> i = Element(value=[1,2], name='i')
>>> x = Variable(index=i, name='x')
>>> p += x[i]  # 添字が残っている
pysimple.error.SimpleError: objective cannot be defined with index
>>> p += x[1]  # 目的関数(1 つ目)
>>> p += x[2]  # 目的関数(2 つ目)
pysimple.error.SimpleError: objective can only be assigned once
------------------------------------------------------------------

多目的最適化の例として,制約 x≦2,y≦2,z≦2,x+y+z≧4 の元で,
x + y,y + z,z + x のそれぞれを最小化したいとします.
このとき目的関数をどのように設定したらよいでしょうか.

------------------------------------------------------------------
x = Variable(ub=2)
y = Variable(ub=2)
z = Variable(ub=2)

p = Problem()
p += x + y + z >= 4
p += ?, '目的関数'
------------------------------------------------------------------

多目的最適化を実現する方法の 1 つは,多段階で最適化を行うというもの
です.これを汎用的に実装したものが以下となります.

------------------------------------------------------------------
objs = x + y, y + z, z + x
for obj in objs:
    p += obj
    p.solve()
    Printf('x: {:.1f} y: {:.1f} z: {:.1f}', x.val, y.val, z.val)
    p += obj <= p.objective.val + 1e-5
------------------------------------------------------------------

上記のモデルでは次のようなステップで求解しております.

1. 目的関数に x + y を設定して求解 (x=1, y=1, z=2)
2. 問題に制約「x + y ≦ 2(=目的関数値)」を追加
3. 目的関数に y + z を設定して求解 (x=2, y=0, z=2)
4. 問題に制約「y + z ≦ 2(=目的関数値)」を追加
5. 目的関数に z + x を設定して求解 (x=2, y=0, z=2)

今回のモデルでは,ステップ 1 でいわゆる「パレート最適」となっており,
最適解が複数存在しています.また,この方法の場合,目的関数の設定順序に
よって最終的な解が変わる可能性がある点に注意しましょう.

多目的最適化を実現する別の方法は,目的関数ごとに重みをつけて同時に
扱う方法です.これを実装したものが以下となります.

------------------------------------------------------------------
for w1, w2 in (1, 1), (1, 2), (2, 1):
    p += (x + y) + w1*(y + z) + w2*(z + x)
    p.solve()
    Printf('x: {:.1f} y: {:.1f} z: {:.1f}', x.val, y.val, z.val)
------------------------------------------------------------------

重み w1, w2 の値によって変数の値は次のようになりました.

w1=1, w2=1 のとき x=1.3, y=1.3, z=1.3
w1=1, w2=2 のとき x=1,   y=2,   z=1
w1=2, w2=1 のとき x=2,   y=1,   z=1

今回は重みによって変数の値が変わる様子を確かめるために複数求解
しましたが,重みが決まっている場合は必要ありません.一方で,
この重みの決め方が難しいのですが,重みは目的関数ごとのトレードオフ
割合と考えることができます.
例えば,目的関数が「コスト(万円) + w*移動距離(km)」だった場合,w=1 の
場合は「コスト 1 万円の削減」と「移動距離 1km の短縮」を同価値に,
w=10 の場合は「コスト 10 万円の削減」と「移動距離 1km の短縮」を同価値
に考えていることになります.
単位が異なる目的関数を同時に考える場合は取りうる範囲に十分注意する必要が
あり,必要に応じて正規化を施します.

いかがだったでしょうか.
数理最適化では複数の目的関数を直接扱うことができないため,工夫が必要と
なります.一方で PySIMPLE は Python のパッケージですので Python の
文法を利用することにより,ちょっとした仕組みを簡単に実装できます.
多目的最適化やパレート最適については以下の数理計画用語集もご覧ください.

多目的最適化:
    多目的最適化 | 数理計画用語集
パレート最適:
    パレート最適 | 数理計画用語集

                                                (池田 悠)

==================================================================