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

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

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <  tips  > 使ってみよう PySIMPLE(第 4 回)
 ■ <トピック> 量子アニーリングでの最適化との違い
 ■ <セミナー> 特別セミナーのご案内
 ■ <セミナー> 9~12 月体験セミナーのご案内
 ■ <セミナー> PySIMPLE セミナー
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

このコーナーでは,Numerical Optimizer V21 の新機能であるモデリング
言語 PySIMPLE のエッセンスを紹介していきます.
前回は疎集合を扱うことによって効率よくモデルを記述する方法を紹介
しました.今回はこの考え方が出力やデバッグの際にも有用であることを
SIMPLE と比較しながら紹介していきます.

まず,次のような問題設定を考えましょう.

- 仕事 A, B, C, D を人 0, 1, 2, 3 で分担する
- 各仕事は 2 人で分担する
- 各人は 2 つの仕事をする

この問題の定式化は次のようになります.

SIMPLE:                            PySIMPLE:
---------------------------------+--------------------------------
Set I="0 .. 3"; Element i(set=I);| i = Element(value=range(4))
Set J="A B C D";Element j(set=J);| j = Element(value='ABCD')
IntegerVariable x(index=(i,j),   | x = BinaryVariable(index=(i,j))
                    type=binary);| p = Problem()
sum(x[i,j], i) == 2;             | p += Sum(x[i,j], i) == 2
sum(x[i,j], j) == 2;             | p += Sum(x[i,j], j) == 2
solve();                         | p.solve()
---------------------------------+--------------------------------

この結果を確認するために整形した文字列を出力してみましょう.
SIMPLE では simple_printf 関数,PySIMPLE では Printf 関数を使います.

SIMPLE:
------------------------------------------------------------------
simple_printf("%s は %s 個を担当\n", j, sum(x[i,j].val, i));
------------------------------------------------------------------

PySIMPLE:
------------------------------------------------------------------
Printf('{} は {:.0f} 個を担当', j, Sum(x[i,j].val, i))
------------------------------------------------------------------

この関数は制約式と同様に浮いている添字 j に対して展開され,いずれも
次のような出力になります.

------------------------------------------------------------------
A は 2 個を担当
B は 2 個を担当
C は 2 個を担当
D は 2 個を担当
------------------------------------------------------------------

確かに制約を満たしてることが確認できました.x の値を確認するだけで
あれば今までと同じように SIMPLE では x.val.print(),PySIMPLE では
print(x.val) で OK です.しかし,例えば値が入っている部分だけを
抽出して確認したい場合はどうすればよいでしょうか.

SIMPLE:
------------------------------------------------------------------
Set IJ(dim=2); Element ij(set=IJ);
IJ = setOf((i,j), x[i,j].val>0);
x[ij].val.print();
// (x[i,j].val, x[i,j].val>0).print();  // 実はこれでも可能
------------------------------------------------------------------

PySIMPLE:
------------------------------------------------------------------
ij = x[i,j].val>0
print(x[ij].val)
------------------------------------------------------------------

ここで添字 ij は前回出てきた多次元の添字であることに注意しましょう.
PySIMPLE では条件を満たす添字を上記のように作り出すことができます.
では,今度はこの ij を用いて整形して出力してみましょう.

SIMPLE:
------------------------------------------------------------------
simple_printf("%s を %s に割当て\n", ij);
simple_printf("%s を %s に割当て\n", i, j, x[i,j].val>0);
------------------------------------------------------------------

PySIMPLE:
------------------------------------------------------------------
Printf('{} を {} に割当て', ij)
------------------------------------------------------------------

これはいずれも次のような出力となります.

------------------------------------------------------------------
0 を C に割当て
0 を D に割当て
1 を A に割当て
1 を C に割当て
2 を B に割当て
2 を D に割当て
3 を A に割当て
3 を B に割当て
------------------------------------------------------------------

先ほどと異なり,2 つのプレースホルダに対して対応するオブジェクトが
1 つしか存在しません.多次元の添字を simple_printf/Printf 関数に
渡す場合,各次元に分解されます.個別に記述する場合は次のように記述
することもできます.

SIMPLE:
------------------------------------------------------------------
simple_printf("%s を %s に割当て\n", ij.at(1), ij.at(2));
------------------------------------------------------------------

PySIMPLE:
------------------------------------------------------------------
Printf('{} を {} に割当て', ij(0), ij(1))
------------------------------------------------------------------

添字の次元は SIMPLE では 1 始まり,PySIMPLE では 0 始まりであることに
注意しましょう.

いかがでしたでしょうか.このように PySIMPLE では多次元の添字を簡単に
扱うことができます.また,Printf 関数のフォーマットは Python の書式
指定文字列と同じものを使うことができます.詳細な文法は Python の公式
ドキュメントをご確認ください.

書式指定文字列
https://docs.python.org/ja/3/library/string.html#format-string-syntax

PySIMPLE の出力制御に関する解説はこちら:
    https://www.msi.co.jp/nuopt/docs/v21/pysimple/guide/output.html
    https://www.msi.co.jp/nuopt/docs/v21/pysimple/api/function.html#pysimple.Printf

                                                 (池田 悠)

******************************************************************
■ <トピック> 量子アニーリングでの最適化との違い
******************************************************************

量子アニーリングによる最適化と Numerical Optimizer による最適化の
大きな違いは,それぞれ特定の問題を解くか汎用的に問題を解くかに
あります.
これに加えてそれぞれ近似解法だけか厳密解法も有するかの違いもあり
ます.
量子アニーリングの仕組みについて簡単に述べながら,これら違いに
ついて明らかにしたいと思います.

量子アニーリングは断熱量子計算とよばれる計算を基礎にしています.
断熱量子計算とは,計算開始時には自明な目的関数 f0 とその最適解 x0
から開始して,ある特別な物理的過程を経て本来考えたい目的関数 f 
へと変形していき,対応する所望の最適解 x を得るという計算です.
物理的には目的関数がハミルトニアン,最適解が基底状態を表します.
そしてその特別な物理的過程というのが断熱過程です.
量子アニーリングは次の意味でこの特殊な場合になっています.

- ハミルトニアンがイジング模型である.
- 断熱過程が横磁場によって引き起こされる.

断熱量子計算はいわゆる量子ゲートを用いた量子回路による計算モデルと
等価であることが示されています.
つまり他方は一方を多項式時間でシミュレーション可能になっています.
このような訳ですが,特殊な場合である量子アニーリングについては
イジング模型に限定しているため,限られた問題に特化した計算手法と
なっています.

量子アニーリングが相手にする特定の問題とは,
QUBO (Quadratic Unconstrained Binary Optimization)
とよぶ次の問題クラスです.

- Quadratic: 目的関数が高々二次関数である.
- Unconstrained: 制約条件がない.
- Binary: 変数が 0-1 整数変数 (バイナリ変数) である.

原理的には変数は自然数や整数に拡張可能であり,目的関数も三次以上
でも二次に帰着可能であり,そして制約条件も目的関数に組み込むことも
可能です.
しかしながらそれだけ計算資源を消費することになります.

この他,量子アニーリングは問題表現能力以外にも,例えば以下の課題を
挙げることができます.

断熱過程を計算プロセスに頼っているので,所望の最適解を得るためには,
ハミルトニアンの時間変化が極めて小さいことが前提となります.
そして必ず最適解が見つかることが保証されていますが,
ハミルトニアンに特別な工夫がない限り計算時間が長くなってしまう
という点と,そもそもデコヒーレンスしてしまわないうちに計算を終え
ないといけないという点が原理的な課題になっています.
前者は量子アニーリングでこそ解くべき問題の探求,後者は広く量子工学の
工学的発展の追求が課題となっています.

以上に述べたように,ムーアの法則の終焉として,次に期待される量子
計算機のアーキテクチャの一つが量子アニーリングであり,その動作原理は
量子論の時間発展をダイレクトに利用するアナログ計算になっています.
対してデジタル計算は今のところ歴史の長い古典計算機の独壇場となって
います.
今日私たちが利用している古典計算機は物理層を高度に抽象化して,
解くべき問題やアルゴリズム,
もっと平易にいえばタスクそれ自体に専念できるようになっています.
Numerical Optimizer もその一つです.

Numerical Optimizer はモデリング言語 SIMPLE によって問題を数式で
抽象的に記述し,その記述内容を解釈して最適化計算を実行します.
記述可能な問題クラスは QUBO に限らず,従って特定の問題に特化した
つくりではなく汎用的なつくりになっています.

以上が量子アニーリングによる最適化と Numerical Optimizer による
最適化の違いで,ハードウェアレベルで仕組みが異なることが理解できた
かと思います.

                                                 (伊藤 元治)

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

◆ エネルギーマネジメント最適化セミナー

昨今注目度が高いエネルギー事業における,NTT データ数理システムの
ソリューション展開についてご紹介するセミナーです.
本セミナーでは,発電事業における分散電源・マイクログリッドの
最適運転計画・設備計画について,数理計画法を適用し問題を解決する
ソリューションをご紹介します.

・エネルギー事業所でプラントの設備や運転計画を制御したい
・工場の自家発電設備の最適化をしたい

といった課題をお持ちの方におすすめのセミナーです.


   ☆   日時:2019 年  9 月 27 日 (金) 15:00~17:00
              2019 年 12 月 12 日 (木) 15:00~17:00

   ☆ 参加費:無料

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

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


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

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

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

また Numerical Optimizer V21 の新機能として実装いたしました
Python インタフェース【 PySIMPLE 】を用いたデモもご用意して
おりますので,日頃業務で Python に触れられる方にもおすすめです.

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

   ☆ 参加費:無料

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

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


◆ Numerical Optimizer 金融工学セミナー
  
金融工学の分野ではアセットの市場価格や企業価値など,ゆらぎの
あるデータに基いて意思決定することに伴う「リスク」を測り,
制御するモデル化手法が確立されています.
これらの手法はシミュレーションや最適化技術の発展によって
具体化され,機関投資家のみならず,近年ではエネルギー調達の分野
からも注目を浴びております.
本セミナーでは,いくつかのデモを通して

・金融工学におけるリスク最小化の考え方
・イールドカーブと非線形計画法,判別分析と半正定値計画法
・実務的なポートフォリオ最適化の実際

などについてご紹介します.
併せて統計計算ツール R から手軽に最適化計算が実行できる 
RNUOPT もご紹介します.

   ☆   日時:2019 年 11 月 6 日 (水) 15:00~17:00

   ☆ 参加費:無料

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

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

                                                 (松岡 勇気)

******************************************************************
■ <セミナー> 9~12 月体験セミナーのご案内
******************************************************************

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

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

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

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

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

[名古屋開催]
・12 月  6 日 (金) 10:00~12:00 Numerical Optimizer 体験セミナー
                  https://msi.hmup.jp/nuopt/seminar/seminarRegular
------------------------------------------------------------------

実際に PC 上で Numerical Optimizer を体験できるセミナーです.
数理最適化ソルバーをお探しの方はもちろんのこと,数理最適化とは
どんなものか知りたい方にもお薦めです.
機能を強化した Excel アドインもご紹介いたします.モデルとデータの
連携を気軽に行いたい方や,解を集計しグラフを書いて分析を行いたい
方にお薦めの機能です.
また,近年の動向や弊社に頂くご相談内容を踏まえ,数理最適化が
どのようにビジネスの現場で利用されているのかを,開発責任者より
お伝えします.

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

                                                 (松岡 勇気)

******************************************************************
■ <セミナー> PySIMPLE セミナー
******************************************************************

先日大盛況に終わりました PySIMPLE セミナーについて,皆様からの声に
お応えすべく,次回開催日を調整中です.

本セミナーでは Numerical Optimizer V21 の新機能として実装いたし
ました Python インタフェース【 PySIMPLE 】をご紹介いたします.

PySIMPLE を用いたモデリングの例や SIMPLE との表記方法の違いなど,
実際の製品画面をご覧頂きながらご説明いたします.
大変多くのご要望を頂いておりました機能でございます.

PySIMPLE のデモは One Day セミナーでもご覧になれますが,本セミナーは
より深く PySIMPLE について知っていただけるセミナーとなっています.

・SIMPLE と PySIMPLE の違いについて知りたい方
・日頃業務で Python に触れている方

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

開催日程が決まり次第,以下のページにて告知させていただきます.
    http://msi.hmup.jp/nuopt/seminar

                                                 (松岡 勇気)

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