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

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

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 新年のご挨拶
 ■ <トピック> Numerical Optimizer V22  3 月リリース予定
 ■ <セミナー> スケジューリングセミナー 2/4 開催
 ■ <セミナー> 最適化&シミュレーションセミナー 2/27 開催
 ■ <セミナー> 1~3 月 体験セミナー・One Day セミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 6 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

新年あけましておめでとうございます.
旧年中はたいへんお世話になりました.

高速なキャッシュメモリの性能を活用するための行列分解のアルゴリズム,
マルチコア環境を有効活用するための分枝限定法の並列化,python 環境の
普及に対応した新しい数理最適化モデリング環境 PySIMPLE などなど,
進化する計算機環境は,Numerical Optimizer の発展の素材を提供し続け
てくれています.

数理科学の基本はそれほど大きく変化はしません.変わらず残る難問も
数多くあります.
ただ,我々の実務経験と計算機環境,ソフトウエアの進歩が攻略の
可能性を確実に広げてくれており,弊社の理念であるところの数理科学と
コンピュータサイエンスが共に噛み合って発展してゆくことを改めて実感
する次第です.

適切なモデル化とアルゴリズム,マルチコアやクラウド上での仮想マシンを
駆使して,実務に大きな価値を御届けできる機会が増える年でありますよう.
数理科学とコンピュータサイエンスを軸に我々は今年も努力します.

本年もどうかよろしくお願い申しあげます.

                                                 (田辺 隆人)

******************************************************************
■ <トピック> Numerical Optimizer V22  3 月リリース予定
******************************************************************

Numerical Optimizer V22 を 3 月中にリリースする予定です.
V22 では以下の機能が強化されています.

- 分枝限定法と wcsp の並列計算機能を刷新
     - Linux やランタイムライセンスでもご利用可能
     - 3 つの並列分枝限定法(Racing, Subtree, Deterministic Racing)を
       実装

- モデリング言語 PySIMPLE を強化
     - Linux 版をリリース
     - モデルの展開速度が大幅に向上

- モデリング環境 Nuorium を強化
     - モデル・データ連係が刷新されてより柔軟に

これらの機能の強化に加えて計算ライブラリの性能も強化されています.
V22 では発電機の起動停止計画問題 (Unit Commitment, UC) の定式化に
着目し,切除平面法に改良を加えました.これによって V22 では UC に
おいて,V21 に比べて 3, 4 倍の高速化を実現しています.技術的内容に
ついては The 4th ISM-ZIB-IMI MODAL Workshop で発表した下記の資料を
ご覧ください.

   https://ura3.c.ism.ac.jp/opt2019/slides/Fujii2.pdf

さて,V22 における分枝限定法や wcsp の並列計算機能の使い方をご紹介
します.V21 以前ではビルド時に並列化オプションをつけてビルドしますが,
V22 では不要になりました.必要なことはたった一つです.


## 分枝限定法の場合
モデルファイルでスレッド数を指定します.

------------------------------------------------------------------
options.bbthreads = 4;  // 4 スレッドで実行する

// 並列分枝限定法の手法を変更する場合は以下の記述を追加します
// options.branchParallelMethod = "racing";  // デフォルト
// options.branchParallelMethod = "subtree";
// options.branchParallelMethod = "deterministicRacing";
------------------------------------------------------------------

## wcsp の場合
モデルファイルでスレッド数と試行回数を指定します.

------------------------------------------------------------------
options.wcspthreads  =  4;  // 4 スレッドで実行する
options.wcspTryCount = 12;  // 試行回数を設定する
------------------------------------------------------------------


以上のように,基本的にはスレッド数を記述した後にビルドするだけで
並列計算機能を利用できます.ご利用いただく際の注意点として,最近の
CPU は物理コア数よりも多いコア数を持っていると OS に認識させています.
OS から見たコア(論理コア)数をスレッド数に指定しても性能が向上しない
可能性があるので,物理コア数を指定するのがおすすめです.

V22 のご紹介は以上です.現在はリリースに向けて鋭意作業中ですので,
お手元に届くまでもうしばらくお待ちください.

                                                 (石橋 保身)

******************************************************************
■ <セミナー> スケジューリングセミナー 2/4 開催
******************************************************************

コールセンター業界における大規模スタッフのシフトスケジューリングや
医療・介護現場でのシフトスケジューリングなど,多様な現場・要望にお
応えできるスケジューリングソリューションをご紹介いたします.

最適化・数理計画を用いたワークフォースマネジメント(WFM)への導入
事例にご興味がある方,実用的なシフトスケジューリングにご興味がある
方は是非お気軽にご参加ください.

    ☆   日時:2020 年 2 月 4 日 (火) 15:00~17:00

    ☆ 参加費:無料

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

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

                                                 (松岡 勇気)

******************************************************************
■ <セミナー> 最適化&シミュレーションセミナー 2/27 開催
******************************************************************

最適化とシミュレーション,混同しがちなこれらのワードに対して,それ
ぞれの手法の違いや使いどころについて解説いたします.

・ 最適化やシミュレーションという言葉は聞いたことあるが,どのような
   手法か分からない
・ 手持ちの課題に最適化とシミュレーション,どちらのソリューションを
   適用すればよいのか知りたい
・ 最適化とシミュレーションの基礎を一度で学びたい

といった方々におすすめのセミナーです.

最適化とシミュレーションの違いや使い分け,両者を組み合わせたソリュー
ションについての解説の後,それぞれの手法について弊社ソフトウェア
(Numerical optimizer,S4 Simulation System)を用いた活用事例を体験
していただけます.

セミナー終了後には,最適化,シミュレーションに精通しているスタッフが
個別にご相談を承ります.

    ☆   日時:2020 年 2 月 27 日 (木) 13:30~17:00

    ☆ 参加費:無料

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

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

                                                 (松岡 勇気)

******************************************************************
■ <セミナー> 1~3月 体験セミナー・One Day セミナーのご案内
******************************************************************

   ◆ Numerical Optimizer 体験セミナー

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

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

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

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

    ☆ 参加費:無料

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

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

本セミナーは,

・ 最適化を業務に活用されたいと考えている方
・ Numerical Optimizer に触れてみたい方
・ 数理システムの最適化ソリューションについて知りたい方

にお薦めのセミナーです.

最適化の業務への適用方法について,Numerical Optimizer の操作演習
を通じてご説明いたします.
機能を強化した Excel アドインもご紹介いたします.モデルとデータの
連携を気軽に行いたい方や,解を集計しグラフを書いて分析を行いたい
方にお薦めの機能です.
また,近年の動向や弊社に頂くご相談内容を踏まえ,数理最適化が
どのようにビジネスの現場で利用されているのかを,開発責任者より
お伝えします.

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


   ◆ Numerical Optimizer One Day セミナー

---[ Numerical Optimizer One Day セミナー開催日程 ]-------------------

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

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

    ☆ 参加費:無料

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

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

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

・ 数理最適化を学びたいが敷居が高いと感じている方
・ 1 日でさくっと数理最適化について学びたい方
・ 数理最適化ツールに触れたい方
・ 数理最適化を業務に導入しようと考えている方

におすすめのセミナーです.

                                                 (松岡 勇気)

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

このコーナーでは,Numerical Optimizer V21 の新機能であるモデリング
言語 PySIMPLE のエッセンスを紹介していきます.
前回,前々回では PySIMPLE における便利な出力方法について紹介して
きました.今回は更に進んで,pandas モジュールと連携した出力の加工
方法を紹介します.

まず,前々回に扱った割当問題を見てみましょう.

PySIMPLE:
------------------------------------------------------------------
>>> from pysimple import *
>>> i = Element(value=range(4), name='i')  # 仕事
>>> j = Element(value='ABCD', name='j')    # 人
>>> x = BinaryVariable(index=(i,j), name='x')
>>> p = Problem()
>>> p += Sum(x[i,j], i) == 2, '各人は 2 つの仕事をする'
>>> p += Sum(x[i,j], j) == 2, '各仕事は 2 人で分担する'
>>> p.solve(silent=True)
1  # optimal
------------------------------------------------------------------

今回はこの結果を,データ解析分野で表操作によく使われる pandas の
DataFrame を用いて加工してみましょう.
一般に最適化の出力は整然データ(tidy data) の形式になります.整然
データを表形式に加工するには pivot 関数を使うことでできます.

------------------------------------------------------------------
>>> import pandas as pd
>>> output = pd.DataFrame((x[i,j].val>0).set, columns=['i','j'])
>>> output['val'] = 1
>>> output.pivot(*output.columns).fillna(0).astype(int)
j  A  B  C  D
i            
0  0  0  1  1
1  1  0  1  0
2  0  1  0  1
3  1  1  0  0
------------------------------------------------------------------

二行目ではまず,x[i,j].val>0 で正の値が入っている部分からなる
(二次元の)添字を抽出しています.添字自体はイテレートできないので,
set 属性により長さ 2 のタプル列を DataFrame に渡します.
三行目では値列を追加し,四行目でピボットテーブルに加工します.
pivot 関数は index, columns, values 引数を取りますが,それぞれが
output の i 列,j 列,val 列に対応するため,output.columns を渡す
ことで簡略化しています.
次のように,最初から三つ組を DataFrame に与えることもできます.

------------------------------------------------------------------
>>> val = [(*ij, v) for ij, v in x.val.items()]
>>> output = pd.DataFrame(val, columns=['i','j', 'val'])
>>> output.pivot(*output.columns).astype(int)
------------------------------------------------------------------

次は,別の例としてシフト表を作ってみましょう.
5 人の一週間のシフトとして日勤(Day)・夜勤(Ngt)・休み(Off)を決めます.

------------------------------------------------------------------
>>> m = Element(value='ABCDE', name='m')     # Man
>>> d = Element(value=range(1,8), name='d')  # Day
>>> s = Element(value=['Day','Ngt','Off'], name='s')  # Shift
>>> p = Problem()
>>> x = BinaryVariable(index=(m,d,s), name='x')
>>> p += Sum(x[m,d,s], s) == 1, '一日に勤務は一つ'
>>> p += Sum(x[m,d,'Day'], m) == 2, '日勤は二人ちょうど'
>>> p += Sum(x[m,d,'Ngt'], m) >= 1, '夜勤は一人以上'
>>> p += Sum(x[m,d,'Off'], d) >= 1, '一回以上は休み'
>>> p += Sum(x[m,d,'Ngt'], d) <= 2, '夜勤は二回まで'
>>> d1 = d != 7
>>> p += x[m,d1+1,'Off'] >= x[m,d1,'Ngt'], '夜勤の次の日は代休'
>>> p.solve(silent=True)
1  # optimal
------------------------------------------------------------------

今回は,DataFrame への値の与え方が少し異なり,添字自体が三次元です.

------------------------------------------------------------------
>>> output = pd.DataFrame((x[m,d,s].val>0).set,
...                                  columns=['Man','Day','Shift'])
>>> piv = output.pivot(*output.columns)
>>> piv
Day    1    2    3    4    5    6    7
Man                                   
A    Day  Off  Day  Ngt  Off  Day  Ngt
B    Off  Day  Off  Day  Day  Off  Ngt
C    Off  Ngt  Off  Day  Ngt  Off  Day
D    Ngt  Off  Ngt  Off  Off  Day  Day
E    Day  Day  Day  Off  Day  Ngt  Off
------------------------------------------------------------------

制約を満たしているか確認のため集計列と集計行を付け加えてみましょう.

------------------------------------------------------------------
>>> piv.loc['DayCount'] = (piv == 'Day').sum(axis=0)
>>> piv.loc['NgtCount'] = (piv == 'Ngt').sum(axis=0)
>>> piv.assign(OffCount=(piv == 'Off').sum(axis=1),
...            NgtCount=(piv == 'Ngt').sum(axis=1))
Day         1    2    3    4    5    6    7  OffCount  NgtCount
Man                                                            
A         Day  Off  Day  Ngt  Off  Day  Ngt         2         2
B         Off  Day  Off  Day  Day  Off  Ngt         3         1
C         Off  Ngt  Off  Day  Ngt  Off  Day         3         2
D         Ngt  Off  Ngt  Off  Off  Day  Day         3         2
E         Day  Day  Day  Off  Day  Ngt  Off         2         1
DayCount    2    2    2    2    2    2    2         0         0
NgtCount    1    1    1    1    1    1    2         0         0
------------------------------------------------------------------

いかがでしたでしょうか.このように PySIMPLE と他モジュールを連携
させることで,高度な処理も簡潔に記述することができます.
また,PySIMPLE オブジェクトも Python オブジェクトに手軽に変換できる
ため,他モジュールとも容易に連携することができます.

PySIMPLE の Python オブジェクトへの変換の解説はこちら:
    http://www.msi.co.jp/nuopt/docs/v21/pysimple/guide/dump.html

                                                 (池田 悠)

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