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

バックナンバー ( 2021 Vol.6 ) 2021 年 11 月 16 日 発行

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  数理システム 最適化メールマガジン  http://www.msi.co.jp/nuopt/
                           2021 Vol.6 ( 2021 年 11 月 16 日 発行 )
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> ユーザーコンファレンス 2021 開催のお知らせ
 ■ <トピック> MSIISM 記事  "The Cutting Plane Game" のご紹介
 ■ <トピック> 弊社主催数理最適化交流会 2021 ご報告
 ■ <セミナー> オンラインセミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 15 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> ユーザーコンファレンス 2021 開催のお知らせ
******************************************************************

毎年開催している数理システムユーザーコンファレンスを今年も
オンラインで開催いたします.

  https://www.msi.co.jp/userconf/2021/lp/index.html

数理最適化枠として次の 2 つのご講演がございます.

  パート・アルバイトのシフト表作成の自動化を実現
  勤務シフト作成お助けマン Time
    鉄道情報システム 株式会社
    新井 祐一 様,神谷 祐紀 様

    スタッフの要望に寄り添ったシフト表を自動作成し,タブレットで
    結果を手軽に確認できるクラウドサービスのご紹介です.
    シフトスケジューリングにご興味ある方はぜひご参加ください.

  組合せ爆発を乗り越える最先端アルゴリズム技術とその実装
    NTT コミュニケーション科学基礎研究所
    西野 正彬 様

    条件を満たす解を高速に列挙するアルゴリズム ZDD のご紹介です.
    ご講演では条件を満たすマンションの間取りの列挙といった具体例を
    交えながらご紹介いただきます.解を列挙するアルゴリズムにご興味
    ある方はぜひご参加ください.

お申込みは前日まで可能です.次の URL からお申込みください.

   https://www.msi.co.jp/userconf/2021/lp/contact.html

                                                (石橋 保身)

******************************************************************
■ <トピック> MSIISM 記事  "The Cutting Plane Game" のご紹介
******************************************************************

前々回にご紹介した "The Cutting Plane Game" について MSIISM 記事と
して執筆しました!

  https://www.msiism.jp/article/cutting-plane-game.html

メールマガジンでは "The Cutting Plane Game" の概要をご紹介しました.
今回の MSIISM 記事ではそれに加え,より深い楽しみ方について,
ビジュアルを交えて解説してみました.ぜひお楽しみください.

                                                (藤井 浩一)

******************************************************************
■ <トピック> 弊社主催数理最適化交流会 2021 ご報告
******************************************************************

10 月 29 日に弊社主催で「数理最適化交流会 2021」というイベントを
オンライン開催させていただきました.当日は 100 名を超える方に
ご参加いただきました.多数のご参加まことにありがとうございました.

昨年に引き続き第二回の開催となった本イベントですが,参加者からの
質問が活発だったこともあり,大いに盛り上がりました.
詳しい報告は MSIISM 記事として執筆しましたのでご参考ください.

  https://www.msiism.jp/article/MP-exchange-meeting-2021.html

来年も類似の企画を検討していますので,開催された折には是非皆様の
ご参加お待ちしております.

                                                (藤井 浩一)

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

定期的に無料のオンラインセミナーを開催しております.
ご興味があればぜひご参加ください.

特に「Numerical Optimizer ハンズオンセミナー」では,
Python ベースのモデリング言語 PySIMPLE を軸に Numerical Optimizer
の基本的な使い方を学ぶことができます.

・日程
   [ Numerical Optimizer 紹介セミナー ]
     12/10(金) 13:30 - 15:30

   [ Numerical Optimizer ハンズオンセミナー ]
     11/29(月) 13:30 - 16:00
     
   [ エネルギーマネジメント最適化セミナー ]
     12/22(水) 13:30 - 15:30

・詳細とお申込み
    https://www.msi.co.jp/nuopt/seminar/index.html

また,「最適化無料個別相談会」では,最適化についての様々なご相談事を
承っております.
柔軟に対応させていただきますので,nuopt-info@ml.msi.co.jp まで
お気軽にお申し込みください.

                                                (岸本 祥吾)

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

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

今回と次回では PySIMPLE を利用した最適化システムを構築する際の,
記述のコツを紹介していきます.

現代的な構造化されたシステムを作成するには,構造に応じて関数や
クラスといった単位に分割します.
まずは,チュートリアルで取り上げている油田問題を構造化して
みましょう.問題概要はマニュアルの以下のページをご覧ください.

https://www.msi.co.jp/nuopt/docs/v23/pysimple/tutorial/20.html

------------------------------------------------------------------
from pysimple import *

class Data:
    def __init__(self):
        self.cost = {0: 180, 1: 160}
        self.norma = {'重油': 12, 'ガス': 24}
        self.prod = {(0, '重油'): 6, (0, 'ガス'): 4,
                     (1, '重油'): 1, (1, 'ガス'): 6}

def model(data):
    i = Element(value=data.cost.keys())
    j = Element(value=data.norma.keys())
    cost  = Parameter(index=i, value=data.cost)
    norma = Parameter(index=j, value=data.norma)
    prod  = Parameter(index=(i,j), value=data.prod)
    x = Variable(index=i, lb=0, ub=5)

    problem = Problem()
    problem += Sum(cost[i]*x[i], i)
    problem += Sum(prod[i,j]*x[i], i) >= norma[j]
    return problem

data = Data()
problem = model(data)
problem.solve()
------------------------------------------------------------------

ここでは入力データをクラスに,最適化モデルを関数としています.
データの値は直書きされていますが,実際のシステムではファイルや
データベースなどから読み込み,必要に応じてデータを加工します.

最適化部分はシステムの一部ですので,最適化部分だけを実行できるように
しておくと,デバッグに便利です.今回は入力データを Python ファイルと
して外部保存できるように改修してみましょう.

------------------------------------------------------------------
from os.path import join, split
from pysimple import *

class Data:
    attrs = 'cost', 'norma', 'prod'

    def __init__(self):
        self.cost = {0: 180, 1: 160}
        self.norma = {'重油': 12, 'ガス': 24}
        self.prod = {(0, '重油'): 6, (0, 'ガス'): 4,
                     (1, '重油'): 1, (1, 'ガス'): 6}

    def output(self, fpath):
        with open(fpath, 'w', encoding='utf-8') as f:
            f.write('print(f"# data: {__file__}")\n\n')
            f.write(str(self) + '\n')
        print('# output:', fpath)

    def __repr__(self):
        return '\n\n'.join(f'{attr} = {getattr(self, attr)!r}'
                                           for attr in self.attrs)

def model(data):
    :

data = Data()
# print(data)
data_name = None         # ファイル出力しない場合
# data_name = 'oildata'  # ファイル出力する場合
if data_name is not None:
    data.output(join(split(__file__)[0], f'{data_name}.py'))
    data = __import__(data_name)  # 再読み込み

problem = model(data)
problem.solve()
------------------------------------------------------------------

data_name は None の場合,入力データを外部保存せず,オンメモリで
モデルにデータを渡します.一方で data_name に文字列を与えた場合は
入力データを一旦 Python ファイルとして出力し,そのファイルを
モジュールとして読み込んでモデルに渡します.後者の場合,同じ階層に
以下の記述のファイルが生成されます.

------------------------------------------------------------------
print(f"# data: {__file__}")

cost = {0: 180, 1: 160}

norma = {'重油': 12, 'ガス': 24}

prod = {(0, '重油'): 6, (0, 'ガス'): 4, (1, '重油'): 1, (1, 'ガス'): 6}
------------------------------------------------------------------

最適化を繰り返す場合にファイル名が同じだと __import__ ではリロード
されないため,importlib.reload を使用する必要がある点にご注意ください.

この他にも pickle 化してファイル保存しておく方法も有効ですが,今回の
方法の場合,「出力したいデータを選択できる」,「Python ファイルなので
可読性が高く,データを手動で改変可能」などの利点があります.目的に
応じて最適な方法をとるとよいでしょう.

いかがでしたでしょうか.今回はシステム化の際に入力データをクラス化
するコツを紹介しました.次回はモデル部分をクラス化するときのコツを
紹介します!

                                                 (池田 悠)

==================================================================
※ msi-ms@ml.msi.co.jp は送信専用アドレスです。
  本メールにそのままご返信いただいてもご回答いたしかねます。

※ このメールは、弊社ツールのユーザー様、過去に展示会などで
お名刺等を頂いたことのある方や 当社に直接お問合せを頂いたことの
ある方にお送りしています。

※ バックナンバーはこちらから御覧頂けます。
     https://www.msi.co.jp/nuopt/mailmagazine/index.html

※ 本メールマガジンは等幅フォントでお読みになることを推奨します。

※ 今後、ご案内メールが不要な方は、誠にお手数ですが、下記 URL より
  「案内停止手続き」をしてくださいますようお願いいたします。

■ 案内停止はこちらから ■
      [都合により本ページでは URL を掲載しておりません]

ご登録される情報は、暗号化された通信(SSL)で保護され、プライバシーマークや
ISO27001/JIS Q 27001, ISO20000-1, ISO9001の 認証を取得している
株式会社パイプドビッツによる情報管理システム「スパイラル」で安全に管理されます。

上記にアクセスができない場合には「メール不要」と明記の上、
 nuopt-info@ml.msi.co.jp までご連絡いただけますと幸いです。

発行:株式会社 NTT データ数理システム 
          << 数理システム Numerical Optimizer >> 担当
        東京都新宿区信濃町 35 番地 信濃町煉瓦館 1 階
                                   tel : 03-3358-6681
                                e-mail : nuopt-info@ml.msi.co.jp
==================================================================