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

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

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 新年のご挨拶
 ■ <トピック> MSIISM Conference 2023 開催報告
 ■ <セミナー> オンラインセミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 28 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

新年を迎えました.
読者の皆様にとりまして,2024 年が良い年となりますよう祈念申し上げます.

さて昨今,ChatGPT に代表される生成 AI が世の中で注目を集めています.
一方,数理最適化界隈で注目を集めているテーマの一つに,「物流 2024 
年問題」があります.

(参考記事) 数理最適化を用いて業務改善・業務改革を実現する
物流業界における数理最適化の適用
https://www.msi.co.jp/speciality/t-solution2.html

輸配送計画に対して,
  ・需給バランスの不安定さ(供給力が不足傾向)
  ・共同配送や中継輸送等新しい枠組みの活用
を考慮した上で効率の良い結果を導出する.その為には,数理最適化が
欠かせない存在となるでしょう.

様々な数理最適化課題を解決すべく,NTT データ数理システムは,
数理最適化ソリューションの提供や Nuorium Optimizer の
バージョンアップを今後も継続していきます.

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

                                                (多田 明功)

******************************************************************
■ <トピック> MSIISM Conference 2023 開催報告
******************************************************************

昨年 11 月 22 日に当社主催のイベント「MSIISM Conference 2023」を
開催いたしました.当日は大変多くの方にご参加いただきました.
誠にありがとうございます.

どの講演も大変興味深いものだったかと思います.特に数理最適化に
ついての講演に触れると,遠州鉄道株式会社の木俣様のご講演ではバス
営業所の勤務シフト作成事例を通じ,数理最適化案件の進め方やポイント
などを学ぶことができました.
また,弊社藤井の生成 AI 活用の講演では,数理最適化を用いる立場で
生成 AI 活用の一端を知ることができ,将来が楽しみになりました.

ホワイエでおこなった展示ブースでは昨今関心が高まっている物流 2024
年問題を題材に,数理最適化がどのようにこの課題に貢献できるのかを
ご説明させていただきました.また,弊社の Nuorium Optimizer も展示
させていただき,ユーザーの方や現在数理最適化に取り組んでいる方とも
お話でき,大変有意義な展示となりました.お話させていただいた皆様に
この場を借りてお礼申し上げます.

本イベントの一部講演について後日に配信も予定しています.引き続き
弊社ページやメルマガで情報をご確認ください.

                                                (石橋 保身)

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

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

2 月と 3 月にハンズオンセミナーを開催します.
実際に製品を動かしながら受講いただけるセミナーになっております.
年度末のこの機会にご興味のある方は申込いただければと思います.

ぜひこの機会にご参加ください.

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

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

                                                (保科 拓紀)

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

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

今回はパラメータの値を変えて逐次求解を行う方法を紹介します.
C++SIMPLE ではこのような場合に可変定数 VariableParameter を用いる
ことができます.通常,式に登場する定数は式を定義したときの値で評価
されますが,可変定数はこれを後から変更することができる点で Parameter
と異なります.PySIMPLE には C++SIMPLE の可変定数はありませんが,同じ
意味の記述は可能です.Nuorium Optimizer C++SIMPLEマニュアルで紹介
されている直線の傾き a を変化させながら円と直線の接点を求めるモデルを
書いてみましょう.

------------------------------------------------------------------
x = Variable()  # 円の x 座標
y = Variable()  # 円の y 座標
p = Problem(type=max)
p += (x - 1)**2 + (y + 0.5)**2 <= 0.25  # (1, -0.5) を中心とする円
for a in range(-5, 5):
    p += -a*x + y, 'obj'
    p.solve(silent=True)
    assert p.status == NuoptStatus.OPTIMAL
    Printf('a={:2} x.val={:.3f} y.val={:.3f} obj.val={:.3f}',
                                 a, x.val, y.val, p.objective.val)
    #print(f'{a=:2} {x.val:.3f} {y.val:.3f} {p.objective.val:.3f}')
------------------------------------------------------------------

PySIMPLE では通常,目的関数を一度しか設定できませんが,求解をはさむ
ことで再度設定ができるようになります.また,出力部分では Printf 関数を
用いていますが,V26 以降ではフォーマット済み文字列リテラル(f-string)を
利用する後者の書き方ができるようになります.このモデルの出力はいずれも
次のようになります.

------------------------------------------------------------------
a=-5 x.val=1.490 y.val=-0.402 obj.val=7.050
a=-4 x.val=1.485 y.val=-0.379 obj.val=5.562
a=-3 x.val=1.474 y.val=-0.342 obj.val=4.081
a=-2 x.val=1.447 y.val=-0.276 obj.val=2.618
a=-1 x.val=1.354 y.val=-0.146 obj.val=1.207
a= 0 x.val=1.000 y.val=-0.000 obj.val=-0.000
a= 1 x.val=0.646 y.val=-0.146 obj.val=-0.793
a= 2 x.val=0.553 y.val=-0.276 obj.val=-1.382
a= 3 x.val=0.526 y.val=-0.342 obj.val=-1.919
a= 4 x.val=0.515 y.val=-0.379 obj.val=-2.438
------------------------------------------------------------------

上記は目的関数を変更するモデルでしたが,制約式を変更するモデルも
見てみましょう.以下は二次関数の最小値を定義域を変更しながら求める
モデルです.

------------------------------------------------------------------
x = Variable()
p = Problem()
p += x**2 - 4*x + 8, 'obj'
for a in range(5):
    p += x >= a, 'cons'
    p.solve(silent=True)
    assert p.status == NuoptStatus.OPTIMAL
    del p['cons']  # del p[-1] でも可
    print(f'{a=} {x.val:.2f} {p.objective.val:.2f}')  # V26 以降
------------------------------------------------------------------

PySIMPLE では += 演算子では制約式の上書きを行うことはできないため,
求解後に del 文を用いて一度削除しています.一方で,
「p.constraints['cons'] = x >= a」と記述すれば制約式の上書きを行う
ことが可能です.この場合は  del 文は不要となります.
このモデルの出力は次のようになります.

------------------------------------------------------------------
a=0 x.val=2.00 obj.val=4.00
a=1 x.val=2.00 obj.val=4.00
a=2 x.val=2.00 obj.val=4.00
a=3 x.val=3.00 obj.val=5.00
a=4 x.val=4.00 obj.val=8.00
------------------------------------------------------------------

これまでは目的関数・制約式が単純でしたが,複雑な場合には少し注意が
必要です.例えば「problem += 重い式 >= 可変定数」のような制約式の
場合,可変定数に無関係である重い式がループの度に評価されてしまいます.
これを避けるには「heavyexp = 重い式」と重い式をループの外に出し,
「problem += heavyexp >= 可変定数」とすることで重い式の評価を一度に
抑えることが可能となります.
また,可変定数を用いた制約式が多いようであれば,問題自体を関数化して
しまうのもよいでしょう.

いかがでしたでしょうか.PySIMPLE には C++SIMPLE の可変定数はありま
せんが,Python の機能と組み合わせることでより柔軟な記述が可能となり
ます.

Nuorium Optimizer C++SIMPLEマニュアル 可変定数の紹介はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/SIMPLE/html/08-04-00.html
PySIMPLE の更新履歴はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/changelog.html

                                                (池田 悠)

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