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

バックナンバー ( 2019 Vol.2 ) 2019 年 3 月 7 日 発行

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <  tips  > 使ってみよう PySIMPLE(第 1 回)
 ■ <トピック> OR 学会出展のお知らせ
 ■ <セミナー> 特別セミナーのご案内
 ■ <セミナー> 4 月・5 月定例セミナーのご案内
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

Numerical Optimizer には数理計画問題のモデリングに特化した言語
『SIMPLE』が付属しています.V21 では SIMPLE の Python 版インター
フェース『PySIMPLE』が追加されます.このコーナーでは PySIMPLE の
便利な使い方を紹介いたします.第 1 回は PySIMPLE の基本的な使い方を
SIMPLE と比較しながら紹介いたします.

まずは,SIMPLE で記述された以下の油田問題を見てみましょう.

-- [oil.smp] -----------------------------------------------------
Set OilField(name="油田集合"); Element i(set=OilField);
Set Product(name="製品集合"); Element j(set=Product);

Parameter costX(index=i, name="油田運転コスト");
Parameter norma(index=j, name="製品ノルマ");
Parameter prodX(index=(i,j), name="油田の生産量");

IntegerVariable x(index=i, name="油田の運転日数");

Objective cost(type=minimize, name="全運転コスト");
cost = sum(costX[i]*x[i], i);

sum(prodX[i,j]*x[i], i) >= norma[j];  // 製品ノルマ制約
0 <= x[i] <= 5;  // 運転日数制約

showSystem();
solve();

simple_printf("油田 %d の最適運転日数 = %d\n", i, x[i].val);
------------------------------------------------------------------

-- [data.dat] ----------------------------------------------------
油田運転コスト = [0] 180 [1] 160;
製品ノルマ = ["重油"] 12 ["ガス"] 24;
油田の生産量 =
[0, "重油"] 6  [1, "重油"] 1
[0, "ガス"] 4  [1, "ガス"] 6
;
------------------------------------------------------------------

これを PySIMPLE で記述すると次のようになります.

-- [oil.py] ------------------------------------------------------
from pysimple import *

prb = Problem(type=min, name='油田問題')

i = Element(value=[0, 1])  # 油田
j = Element(value=['重油', 'ガス'])  # 製品

costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
prodXvalue = {(0,'重油'): 6, (0,'ガス'): 4, (1,'重油'): 1, (1,'ガス'): 6}
prodX = Parameter(index=(i,j), value=prodXvalue, name='油田の生産量')

x = IntegerVariable(index=i, lb=0, ub=5, name='油田の運転日数')

prb += Sum(costX[i]*x[i], i), '全運転コスト'
prb += Sum(prodX[i,j]*x[i], i) >= norma[j], '製品ノルマ制約'

print(prb)
prb.solve()

Printf('油田 {} の最適運転日数 = {:.0f}', i, x[i].val)
------------------------------------------------------------------

すこしゴチャゴチャしている部分もありますが,これはデータもまとめて
与えているためです.細かい点は PySIMPLE のチュートリアルを確認して
いただくとして,SIMPLE との違いを見ていきましょう.

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

まず最初に PySIMPLE をモジュールとしてインポートします.
ここでは一括してインポートしていますが,必要分だけでも構いません.

------------------------------------------------------------------
prb = Problem(type=min, name='油田問題')
prb += Sum(costX[i]*x[i], i), '全運転コスト'
prb += Sum(prodX[i,j]*x[i], i) >= norma[j], '製品ノルマ制約'
------------------------------------------------------------------

PySIMPLE では問題を宣言し,問題に対して目的関数や制約式を追加して
いきます.

------------------------------------------------------------------
i = Element(value=[0, 1])  # 油田
j = Element(value=['重油', 'ガス'])  # 製品
------------------------------------------------------------------

集合と添字の宣言です.このように添字を直接宣言することもできますが,
次のように SIMPLE と同様,集合を経由することもできます.

------------------------------------------------------------------
OilField = Set(value=[0, 1], name='油田集合')
i = Element(set=OilField)
Product = Set(value=['重油', 'ガス'], name='製品集合')
j = Element(set=Product)
-----------------------------------------------------------------

集合は宣言時に value というキーワードで値を与える必要があります.

------------------------------------------------------------------
costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
prodXvalue = {(0,'重油'): 6, (0,'ガス'): 4, (1,'重油'): 1, (1,'ガス'): 6}
prodX = Parameter(index=(i,j), value=prodXvalue, name='油田の生産量')
------------------------------------------------------------------

定数も value キーワードが用意されており,宣言時に辞書,または値を
与えます.定数の値は後から与えることもできます.

------------------------------------------------------------------
x = IntegerVariable(index=i, lb=0, ub=5, name='油田の運転日数')
------------------------------------------------------------------

変数は宣言時に lb, ub で下界,上界を与えられるようになりました.
また,0-1 整数変数を表す BinaryVariable キーワードも追加されました.

------------------------------------------------------------------
print(prb)
prb.solve()
------------------------------------------------------------------

showSystem や solve は問題に対しての操作となります.オプションや
求解結果も問題に対する操作として行います.

いかがでしたでしょうか.
今回扱ったモデルは PySIMPLE のチュートリアルでより詳細に解説して
います.チュートリアルでは数理計画問題を初めて扱う方,SIMPLE を
知らない方にも分かりやすく解説しています.

PySIMPLE のチュートリアルはこちら:
    http://www.msi.co.jp/nuopt/docs/v21/pysimple/tutorial.html

                                                 (池田 悠)

******************************************************************
■ <トピック> OR 学会出展のお知らせ
******************************************************************

3 月 14 日~ 15 日に千葉工業大学(津田沼キャンパス)で開催される
日本オペレーションズ・リサーチ学会 2019 年春季研究発表会にて出展を
致します.
出展ブースにて是非とも御挨拶させて頂ければ幸いです.
ブースでは数理最適化をはじめとした各種分野の読本をお配りしており
ます.
学会ご参加の方は是非とも出展ブースにお立ち寄りくださいませ.

                                                 (山本 和寛)

******************************************************************
■ <セミナー> 特別セミナーのご案内
******************************************************************

◆ RNUOPTセミナー
    
本セミナーは統計解析ツール R の最適化のためのアドオンパッケージ
RNUOPT をご紹介するセミナーでございます.
金融工学のポートフォリオモデルをはじめ,非線形フィッティング,
確率推移行列の推移,アンケート抽出など多種多様な数理最適化モデルを
RNUOPT でご紹介します.

また,RNUOPT では高速な非線形最適化の動作のために必要なツール
である,自動微分についてもご紹介いたします.

   ☆   日時:2019 年 5 月 16 日 (木) 14:00~16:00

   ☆ 参加費:無料

   ☆   会場:
         (株) NTT データ数理システム セミナールーム
           (東京都新宿区信濃町 35 信濃町煉瓦館 4F)
             http://www.msi.co.jp/msi/location.html

   ☆ 上記セミナーのお申込み・詳細は下記をご覧ください.
             https://msi.hmup.jp/nuopt/seminar/rnuopt

皆様のご参加をお待ちしております.

                                                 (山本 和寛)

******************************************************************
■ <セミナー> 4 月・5 月定例セミナーのご案内
******************************************************************

---[ Numerical Optimizer 定例セミナー開催日程 ]-------------------

・4 月 24 日 (水) 13:30~17:00 Numerical Optimizer 体験セミナー
                  https://msi.hmup.jp/nuopt/seminar/seminarRegular

・5 月 28 日 (火) 10:30~16:30 Numerical Optimizer One Day セミナー
                  https://msi.hmup.jp/nuopt/seminar/oneday

------------------------------------------------------------------

Numerical Optimizer 体験セミナーに加えて,5 月には大変ご好評を
頂いております Numerical Optimizer One Day セミナーも開催いたします.
この機会に Numerical Optimizer の使い方を復習,あるいは数理最適化の
アルゴリズムについて学んでみるのはいかがでしょうか.
皆様のご参加をお待ちしております.

                                                 (山本 和寛)

==================================================================
※ このメールは,弊社ツールのユーザー様,過去に展示会などでお名刺
   等を頂いたことのある方や当社に直接お問合せを頂いたことのある方
   にお送りしています.
※ バックナンバーはこちらから御覧頂けます.
     http://www.msi.co.jp/nuopt/mailmagazine/index.html
※ 本メールマガジンは等幅フォントでお読みになることを推奨します.
※ 今後,本メールマガジンやご案内に関するメールが不要な方は,誠に
   お手数ですが,下記 URL より「案内停止手続き」をしてくださいます
   ようお願いいたします.

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

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

   上記にアクセスができない場合には「メール不要」と明記の上,
     nuopt-ms@ml.msi.co.jp
   (このメールに返信で結構です)にメール送付してください.

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