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

バックナンバー ( 2023 Vol.4 ) 2023 年 7 月 26 日 発行

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  数理システム 最適化メールマガジン
                     https://www.msi.co.jp/solution/nuopt/top.html
                           2023 Vol.4 ( 2023 年  7 月 26 日 発行 )
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 発表案内
 ■ <セミナー> オンラインセミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 25 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> 発表案内
******************************************************************

早稲田大学にて開催される数理最適化の国際学会にて弊社から 3 件発表を
行います.

  10th International Congress on Industrial and Applied Mathematics
    開催日:8 月 20 日(日) ~ 8 月 25 日(金)
      場所:早稲田大学
              https://iciam2023.org/

Nuorium Optimizer・数理最適化に関する日頃の研究成果を発表させて
いただきます.ご興味ある方は是非ご聴講ください.

"Implementation of Interior Point Method for Nonlinear Programming
for Real-life Applications"
  * 田辺隆人(NTT データ数理システム)
    田中大毅(NTT データ数理システム)

非線形最適化に対する内点法の実装について,線形計画法の場合と対比
しながら実装の勘所や Nuorium Optimizer に組み込まれている工夫と
応用について紹介します.
特に一次方程式解法について,求解精度向上のための新しい試みについても
紹介します.

"Steepest-Edge Simplex Algorithms for Quadratic Programming"
  * 清水翔司(NTT データ数理システム)
    藤井浩一(NTT データ数理システム)
    Julian Hall (University of Edinburgh)

二次計画問題用単体法 (QP 単体法) に対して,線形計画問題用単体法で
利用されている steepest-edge 規則や Devex 規則の拡張を行いました.
これらの規則が効率的に動作するためには,変数選択におけるエッジの
重みを毎回新しく計算するのではなく,前回の反復の情報を利用して
効率的に更新する必要があります.発表では拡張の詳細および計算実験
結果について報告します.

"Improving Lower Bounds for Large Scale QAPs"
  * 藤井浩一(NTT データ数理システム)
    小島政和(中央大学)
    品野勇治(Zuse Institute Berlin)
    Hans D. Mittelmann (Arizona State University)

大規模二次割当問題(QAP)を解くプロジェクトの進捗状況を報告します.
QAP に対して,二重非負和錐(DNN)緩和に基づいた分枝限定法を適用し,また
大規模並列化を行うためにUbiquity Generatorフレームワーク(UG)を利用
します.本発表ではニュートンブラケット法によって DNN 緩和を解く際に
得られる補助的情報を活用することによって QAP の下界を効率的に得る
手法を紹介し,QAP のベンチマーク QAPLIB に対して,複数の問題で下界を
更新したという結果を報告します.

                                                (藤井 浩一)

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

9 月までに開催する無料のオンラインセミナーをご紹介します.

定例の紹介セミナーとハンズオンセミナーを 8 月と 9 月に開催予定です.
ハンズオンセミナーは実際に製品を動かしながら受講いただける
セミナーになっています.ぜひこの機会にご参加ください.

10 月以降のセミナーに関しては現在企画中ですので,また別途お知らせ
いたします.

[ Nuorium Optimizer 紹介セミナー ]
  2023 年 08 月 30 日 (水) 13:30~15:30
  2023 年 09 月 21 日 (木) 13:30~15:30
  詳細とお申込み:
    https://www.msiism.jp/event/nuopt-introduction.html

[ Nuorium Optimizer ハンズオンセミナー ]
  2023 年 08 月 04 日 (金) 13:30~16:00
  2023 年 09 月 26 日 (火) 13:30~16:00
  詳細とお申込み:
    https://www.msiism.jp/event/nuopt-hands-on.html

                                                (保科 拓紀)

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

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

今回は numpy.ndarray や scipy.sparse のデータを PySIMPLE と連携する
方法を紹介します.
PySIMPLE では添字の要素や値として numpy の型を与えることはできません.
そのため,一度 Python の数値型や文字列型に変換する必要があります.

まずは一次元,二次元の numpy.ndarray オブジェクト → Python
オブジェクト → PySIMPLE オブジェクトと変換してみましょう.
添字は numpy.ndarray オブジェクトのインデックスを用いることにします.

------------------------------------------------------------------
>>> import numpy as np
>>> from pysimple import Element, Parameter
pysimple 1.4.1 (2023-05-31 20:58:25 +0900 d48248a)
Copyright (C) 2019 NTT DATA Mathematical Systems Inc. All Rights Reserved.
>>> vec = np.arange(3)
>>> i = Element(value=np.ndindex(vec.shape), name='i')
>>> i.set
Set(name='i.set', value=[0, 1, 2])
>>> a = Parameter(index=i, value=dict(zip(i.set, vec.tolist())), name='a')
>>> a
a[0]=0
a[1]=1
a[2]=2
>>> mtx = np.arange(6).reshape(3, 2)
>>> mtx
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> ij = Element(value=np.ndindex(mtx.shape), name='ij')
>>> ij.set
Set(name='ij.set', dim=2, value=[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)])
>>> b = Parameter(index=ij, value=dict(zip(ij.set, mtx.flatten().tolist())), name='b')
>>> b
b[0,0]=0
b[0,1]=1
b[1,0]=2
b[1,1]=3
b[2,0]=4
b[2,1]=5
------------------------------------------------------------------

一次元である前半部分は以下のような方法でも変換できます.

------------------------------------------------------------------
i = Element(value=range(len(vec)))
a = Parameter(index=i, value=dict(enumerate(vec.tolist())))
------------------------------------------------------------------

次に scipy.sparse オブジェクト → Python オブジェクト → PySIMPLE
オブジェクトと変換してみましょう.

------------------------------------------------------------------
>>> from scipy import sparse
>>> svec = sparse.coo_matrix(vec)
>>> print(svec)
  (0, 1)        1
  (0, 2)        2
>>> i = Element(value=svec.col.tolist(), name='i')
>>> i.set
Set(name='i.set', value=[1, 2])
>>> a = Parameter(index=i, value=dict(zip(i.set, svec.data.tolist())), name='a')
>>> a
a[1]=1
a[2]=2
>>> smtx = sparse.coo_matrix(mtx)
>>> print(smtx)
  (0, 1)        1
  (1, 0)        2
  (1, 1)        3
  (2, 0)        4
  (2, 1)        5
>>> ij = Element(value=zip(smtx.row.tolist(), smtx.col.tolist()), name='ij')
>>> ij.set
Set(name='ij.set', dim=2, value=[(0, 1), (1, 0), (1, 1), (2, 0), (2, 1)])
>>> b = Parameter(index=ij, value=dict(zip(ij.set, smtx.data.tolist())), name='b')
>>> b
b[0,1]=1
b[1,0]=2
b[1,1]=3
b[2,0]=4
b[2,1]=5
------------------------------------------------------------------

scipy.sparse では非零要素の部分のみを保持するため,疎行列を扱う
場合は numpy.ndarray に比べて効率的になります.今回は添字 (0,0) が
削減されていますね.
scipy.sparse にはさまざまな疎行列の形式がありますが,座標形式である
coo 形式にしておくと PySIMPLE オブジェクトに変換しやすいです.他の
形式の場合は tocoo() メソッドで変換しておきましょう.

いかがでしたでしょうか.
今回は numpy/scipy のオブジェクトから PySIMPLE のオブジェクトへの
連携方法を紹介しましたが,第 6 回,第 8 回では pandas との連携方法を
紹介しています.また,PySIMPLE オブジェクトから Python オブジェクトに
変換する方法を以下のページでも紹介しています.是非ご覧ください.

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

                                                (池田 悠)

==================================================================