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

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

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <  tips  > 使ってみよう PySIMPLE(第 2 回)
 ■ <トピック> MIPLIB 2017 公開
 ■ <セミナー> 特別セミナーのご案内
 ■ <セミナー> 6 月体験セミナーのご案内
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

このコーナーでは,Numerical Optimizer V21 の新機能であるモデリング
言語 PySIMPLE のエッセンスを紹介していきます.

PySIMPLE で記述するにあたり,SIMPLE と比較して表記方法が異なるため
最初に戸惑う点が条件式だと思います.例えば SIMPLE で次のように記述
した場合,

------------------------------------------------------------------
Set I; Element i(set=I);
Set J; Element j(set=J);
Set IJ(dim=2, superSet=(I,J));
IJ="1,3 1,4 2,3"; Element ij(set=IJ);
Variable x(index=ij);
sum(x[i,j], (i, (i,j)<IJ)) >= 1;
------------------------------------------------------------------

PySIMPLE では,

------------------------------------------------------------------
ij = Element(value=[(1,3), (1,4), (2,3)])
x = Variable(index=ij)
Sum(x[ij], ij(0)) >= 1
------------------------------------------------------------------

と,より簡潔に記述することができます.
今回は条件式の書き方を SIMPLE と比較しながら紹介いたします.

まずは,添字 i∈{1, 2, 3} をもつ定数 a に,a[1], a[2] には -1 を,
a[3] には 1 を設定する記述を比較してみましょう.

SIMPLE:                              PySIMPLE:
-----------------------------------+------------------------------
Set S = "1 2 3"; Element i(set=S); | i = Element(value=[1, 2, 3])
Parameter a(index=i);              | a = Parameter(index=i)
a[i] = -1, i<=2;                   | a[i<=2] = -1
a[i] = 1, i>=3;                    | a[i>=3] = 1
-----------------------------------+------------------------------

このように PySIMPLE では条件式を添字のようにして記述します.ただし,
条件式が一つの式の複数箇所に登場する場合,条件式は一度保存したものを
使用する必要がある点に注意が必要です.

-----------------------------------+------------------------------
Set S = "1 2 3"; Element i(set=S); | i = Element(value=[1, 2, 3])
Parameter a(index=i);              | a = Parameter(index=i)
Variable x(index=i)                | x = Variable(index=i)
Expression ax(index=i);            | i2 = i<=2
ax[i] = a[i] + x[i], i<=2;         | ax = a[i2] + x[i2]
-----------------------------------+------------------------------

次の例では,定数 asum の値を定数 a[i] の中で 0 より大きいものの和
$sum_{a_i>0} a_i$ で定めています.

-----------------------------------+------------------------------
Set I = "1 2 3"; Element i(set=I); | i = Element(value=[1, 2, 3])
Parameter a(index=i);              | a = Parameter(index=i,
a[1] = 10; a[2] = -20; a[3] = 30;  |  value={1: 10, 2: -20, 3: 30})
Parameter asum;                    | apos = a[i]>0
asum = sum(a[i], (i, a[i]>0));     | asum = Sum(a[apos], apos)
-----------------------------------+------------------------------

この例では,PySIMPLE では Sum 関数の第二引数を省略することで一度に
記述することができます.Sum 関数は第二引数が省略された場合,すべて
の添字について和が取られます.

------------------------------------------------------------------
asum = Sum(a[a[i]>0])
------------------------------------------------------------------

多次元の条件式を作ることもできます.

-----------------------------------+------------------------------
Set I = "1 2 3"; Element i(set=I); | i = Element(value=[1, 2, 3])
Set J = "1 2 3"; Element j(set=J); | j = Element(value=[1, 2, 3])
Variable x(index=(i,j));           | x = Variable(index=(i,j))
x[i,j] >= 0, i<j;                  | x[i<j] >= 0
-----------------------------------+------------------------------

多次元の条件式の一部の次元を用いる場合は () で必要な次元だけを取り
出す必要があります.次の例では二次元の条件式 i<j の 1 次元目を使用
して変数 y にアクセスしています.ただし,次元は 0 始まりです.

-----------------------------------+------------------------------
Set I = "1 2 3"; Element i(set=I); | i = Element(value=[1, 2, 3])
Set J = "1 2 3"; Element j(set=J); | j = Element(value=[1, 2, 3])
Variable x(index=(i,j));           | x = Variable(index=(i,j))
Variable y(index=i);               | y = Variable(index=i)
                                   | ij = i<j
x[i,j] >= y[i], i<j;               | x[ij] >= y[ij(0)]
-----------------------------------+------------------------------

このように一部の次元を取り出す方法は疎集合の考え方に基づいています.
i<j は二次元の疎集合に対応すると考えられるからです.次回はこの
疎集合を使ったモデリングについてより詳しく解説します.

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

SIMPLE と PySIMPLE の条件文のマニュアル・ユーザガイドはこちら:
     http://www.msi.co.jp/nuopt/docs/v21/manual/html/05-15-00.html
     http://www.msi.co.jp/nuopt/docs/v21/pysimple/guide/cond.html

                                                 (池田 悠)

******************************************************************
■ <トピック> MIPLIB 2017 公開
******************************************************************

MIPLIB は長年,標準的な混合整数計画問題のベンチマークとして用い
られている問題セットです.2017 年に候補となる問題を募集していました
が,昨年 11 月に公開されましたのでご紹介します.

MIPLIB2017 は大きく分けて

 (1) Collection	Set( 1065 問 )
 (2) Benchmark Set( 240 問 )

の二つの問題セットから成り立っています.
(1) は投稿された問題をできるだけ網羅するように構成されており,
(2) は開発者や研究者が性能検証しやすいような問題が抽出されています.

(2) については例えば

- 問題のサイズが小さいものから大きいものまで,偏りなく
- 数値的に安定でないものは除く(複数のソルバで目的関数値が異なる等)

などの観点で抽出します.
実際には抽出自体を混合整数計画問題として定式化しそれを整数計画
ソルバで解いて,問題を決めています.
具体的な定式化については,現在 MIPLIB プロジェクトのメンバが
執筆中の論文の中で紹介される予定です.

MIPLIB2017 は http://miplib2017.zib.de/index.html に
公開されています.興味のある方は是非ご覧ください!

なお,古い MIPLIB のページは,今回の新しい MIPLIB の公開に伴い
URL が変更されています.以前のページを参考にする場合はご注意
ください.

(旧) http://miplib.zib.de/miplib2003/miplib2003/air04.php
(新) http://miplib2010.zib.de/miplib2010/air04.php

                                                 (藤井 浩一)

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

◆ Numerical Optimizer One Day セミナー

本セミナーでは一日掛けて数理最適化に関する知識やノウハウを
たっぷりとお伝えします.
午前は数理最適化の基本的な内容と Numerical Optimizer を使った簡単な
演習をおこない,午後は発展的な内容を学び,数理最適化ツールに慣れて
きたところで応用事例をご紹介します.
また,開発責任者より,近年最適化がビジネスの現場でどのように利用
されているかを,デモを交えてお伝えします.

   ☆   日時:2019 年 5 月 28 日 (火) 10:30~16:30

   ☆ 参加費:無料

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

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

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

                                                 (山本 和寛)

******************************************************************
■ <セミナー> 6 月体験セミナーのご案内
******************************************************************

---[ Numerical Optimizer 体験セミナー開催日程 ]-------------------

東京開催
・6 月  25 日 (火) 13:30~17:00 Numerical Optimizer 体験セミナー
                  https://msi.hmup.jp/nuopt/seminar/seminarRegular

大阪開催
・6 月  21 日 (金) 10:00~12:00 Numerical Optimizer 体験セミナー
                  https://msi.hmup.jp/nuopt/seminar/seminarRegular

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

実際に PC 上でNumerical Optimizer を体験できるセミナーです.
数理最適化ソルバーをお探しの方はもちろんのこと,数理最適化とは
どんなものか知りたい方にもお薦めです.
また,機能を強化した Excel アドインもご紹介いたします.
モデルとデータの連携を気軽に行いたい方や,解を集計しグラフを
書いて分析を行いたい方にお薦めの機能です.
皆様のご参加をお待ちしております.

                                                 (山本 和寛)

==================================================================
※ このメールは,弊社ツールのユーザー様,過去に展示会などでお名刺
   等を頂いたことのある方や当社に直接お問合せを頂いたことのある方
   にお送りしています.
※ バックナンバーはこちらから御覧頂けます.
     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
==================================================================

<< 記事の訂正のお知らせ >>

「使ってみよう PySIMPLE(第 2 回)」の記事内のモデルの記述例
につきまして、以下の誤りがございました。
訂正させていただきますとともに、お詫び申し上げます。

< 最初の SIMPLE の例を PySIMPLE で記述した部分 >
  (誤)ij = Element(value=[(1,3), (1,4), (2,4)])
  (正)ij = Element(value=[(1,3), (1,4), (2,3)])

なお、本ページ内の該当箇所につきましては訂正を行なっております。