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

バックナンバー ( 2023 Vol.5 ) 2023 年 9 月 8 日 発行

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 学会展示と発表のご案内
 ■ <セミナー> オンラインセミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 26 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> 学会展示と発表のご案内
******************************************************************

日本オペレーションズ・リサーチ学会 2023 年秋季研究発表会にて
学会展示と発表をおこないます.

[ 発表 ]

1-B-6
  "Nuorium Optimizer における改良版
   Parallel Alternating Criteria Search の開発"

※石橋保身(株式会社NTTデータ数理システム)
  藤井浩一(株式会社NTTデータ数理システム)
  逸見宣博(株式会社NTTデータ数理システム)

本発表では Nuorium Optimizer V25 において機能改善をおこなった解の
修復機能に関する発表をおこないます.解の修復機能とは MIP において,
ユーザーが与えた初期値に対して実行不可能性を修復した解を返す機能の
ことです.Nuorium Optimizer では分枝限定法を実行する前に働きます.
V25 ではこの機能の核となる Parallel Alternating Criteria Search [1]
に対する改良をおこないました.具体的な改良の内容と数値実験について
発表しますのでぜひお立ち寄りください.

展示ブースでは最適化読本をお配りしておりますので,是非弊社展示
ブースにもお立ち寄りください.

[ 日時 ]
2023 年 09 月 14 日(木)~ 09 月 15 日(金)

[ 場所 ]
関西学院大学 西宮上ヶ原キャンパス

[ 詳細 ]
学会 HP  https://orsj.org/nc2023f/

[1] Lluis-Miquel Munguia et al. 
“Alternating criteria search: a parallel large neighbor-hood search
algorithm for mixed integer programs”. In: Computational Optimization
and Applications 69.1 (Jan. 2018), pp. 1?24.
doi: 10.1007/s10589-017-9934-5.

                                                (石橋 保身)

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

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

10 月にはエネルギーマネジメント最適化セミナーを開催します.
数理最適化を用いたエネルギーマネジメントの事例紹介や,
簡単な地域熱供給問題に関して数理最適化を適用したデモを行います.

11 月には製造現場の業務改善に向けた数理最適化ソリューションセミナーを
開催します.
本セミナーでは,生産スケジューリングの業務効率化・自動化に向けた
数理最適化ソリューションのご紹介を行います.

また,定例の紹介セミナーとハンズオンセミナーも開催予定です.
ハンズオンセミナーは実際に製品を動かしながら受講いただける
セミナーになっています.ぜひこの機会にご参加ください.

[ エネルギーマネジメント最適化セミナー ]
  2023 年 10 月 19 日 (木) 13:30~15:30
  詳細とお申込み:
    https://www.msiism.jp/event/nuopt-energy-management.html

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

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

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

                                                (保科 拓紀)

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

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

今回は制約式の違反量を簡単に抽出,表示する方法を紹介します.
まずは以下のモデルを見てみましょう.

------------------------------------------------------------------
>>> i = Element(value=[1,2,3], name='i') 
>>> x = IntegerVariable(index=i, lb=0, name='x')
>>> p = Problem()
>>> p += Sum(x[i]), 'objective'
>>> p += x[i] >= i-2, 'cons1'
>>> p += x[i] <= i+1, 'cons2'
>>> p.solve(silent=True)

>>> x.val
x[1].val=0.0
x[2].val=0.0
x[3].val=1.0
>>> x[i].val>0  # x[i].val>0 となる添字を抽出
(x[i].val>0)[i] in [3]
>>> x[x[i].val>0].val
x[3].val=1
------------------------------------------------------------------

x[i].val>0 で変数の値が正となる添字を抽出できることに注意すると,
x[x[i].val>0].val では,この添字に対応する値を抽出できます.
次に,このモデルに制約式を追加して制約式の違反量を表示してみましょう.

------------------------------------------------------------------
>>> p += x[i] >= 5-i, 'cons3'
>>> p.solve(silent=True)

>>> cons1 = p['cons1']  # p[0] や p[-3] でも OK
>>> cons1.violation
cons1[1].violation=-5
cons1[2].violation=0
cons1[3].violation=1
>>> cons1[cons1.violation>0].violation
cons1[3].violation=1
------------------------------------------------------------------

制約式には違反量を表す属性 violation が存在し,val のように扱うことが
できます.そのため,cons1[cons1.violation>0].violation で違反して
いる箇所のみを抽出することができます.
以下のように制約式一覧をイテレートすることで,すべての制約式に亘って
違反している箇所のみを抽出することもできます.

------------------------------------------------------------------
>>> for cons in p.constraints.values():
...     cons[cons.violation>0].violation
...
cons1[3].violation=1
cons2[1].violation=2
cons3[2].violation=3
cons3[3].violation=2
------------------------------------------------------------------

また,第 17 回で取り上げた実行不可能性要因検出機能(IIS)を利用する
ことにより,実行不可能性の原因を探索することもできます.
以下では制約式 cons2 の x[1]<=2 と cons3 の x[1]>=4 が矛盾しており
実行不可能性の原因のひとつであることが分かります.

------------------------------------------------------------------
>>> for iis in p.result.iis.values():
...     iis
...
  0: cons2[1]: violation=2
      -x[1]>=-2
          x[1]: value=4: dual=0: [0, inf]
  1: cons3[1]
      x[1]>=4
          x[1]: value=4: dual=0: [0, inf]
------------------------------------------------------------------

いかがでしたでしょうか.値が正の部分のみの抽出や制約式の違反量表示と
いった操作は Python オブジェクトに落とし込むことでも実現可能ですが,
PySIMPLE の機能を利用することで簡単,簡潔に記述することができます.

制約式の違反量の詳細はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/class.html#pysimple.constraint.Constraint.violation

実行不可能性要因検出機能の詳細はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/class.html#pysimple.problem.IIS

                                                (池田 悠)

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