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

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

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 新年のご挨拶
 ■ <トピック> ライオン株式会社様の事例ご紹介
 ■ <トピック> 発表案内
 ■ <セミナー> 無料オンラインセミナーのご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 34 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

あけましておめでとうございます.
本年もどうぞよろしくお願いいたします.
 
さてアフターコロナ時代に差し掛かった 2023 年から,弊社では対面
イベント「Nuorium Optimization Day」を年に一度開催しております.
2023 年は「数理最適化の入門と実務適用のギャップを埋める」,2024 年は
「数理最適化を用いた課題解決のポテンシャルを知る」をコンセプトに
実施し,ご参加の皆様と交流いたしました.
  (参考) Nuorium Optimization Day 2024
    https://www.msiism.jp/event/nuorium-optimization-day2024.html
 
2025 年も本イベントで,数理最適化や Nuorium Optimizer のポテンシャル,
魅力を皆様にお届けしていきたいと考えております.
「Nuorium Optimization Day 2025」で多くの皆様と交流できることを
楽しみにしております.
 
                                                (多田 明功)

******************************************************************
■ <トピック> ライオン株式会社様の事例ご紹介
******************************************************************

ライオン株式会社様が,Nuorium Optimizer を用いて基幹システムと連携
した生産スケジューラーを開発されました.本事例にご興味を持つお客様も
増えているため,メルマガでもご紹介いたします.

10 年前と比較して近年では生活用品の需要面と供給面に大きな変化が
表れています.
需要面では製品の品揃え数が増加して製品の改廃頻度も短縮化し,
さらには購買ルートも多様化しています.
供給面では工場 1 ラインあたりの品種数および供給対応の件数も増加
しています.
その結果,需要面では需要変動の幅や頻度が増大し,供給面では
対応余力が減少していました.
ライオン株式会社様は環境の変化が引き起こすこうした課題に迅速かつ
柔軟に対応するために業務プロセスの改革を構想されていました.

今回の生産スケジューラーの導入により,属人的になっていた生産計画
作成の標準化と大幅な時間短縮を達成し,6 ヶ月分の生産計画を 1 日で
作成できるようになりました.
この大幅な時間短縮は副次的に 18 ヶ月にも及ぶ中長期的な生産計画の
立案を可能とし,Sales and Operations Planning(S&OP)を意識した
先行的な SCM デザインにも貢献することができました.

「環境変化に対して柔軟な生産計画の作成」という課題は,近年,生産に
関わるあらゆる現場で求められており,こうした課題にも数理最適化を
用いた解決が有効です.
2024 年に弊社コンファレンスでご講演いただいた際の資料や MSIISM
記事を弊社ウェブページに公開してますので是非ご覧ください.

MSIISM 記事 「ライオン株式会社様 数理最適化を用いたスケジューラ
による生産計画の自動作成」
    https://www.msiism.jp/article/lion-production-plannning.html

                                                (加瀬 力)

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

以下の学会にて発表をいたします.
ご参加される方がいらっしゃいましたらぜひお気軽にお声がけください.

■  日本オペレーションズ・リサーチ学会 2025 年春季研究発表会

開催日:3 月 6 日(木) ~ 3 月 7 日(金)
    https://orsj.org/nc2025s/conference/

「Feasibility Jump の Nuorium Optimizer への導入」
  * 富塚健志 (株式会社NTTデータ数理システム)
    藤井浩一 (株式会社NTTデータ数理システム)

混合整数線形計画問題(MILP)による定式化は,高い表現力をもちますが,
その実行可能解を求めることさえ困難なことも多々あります.また最適解を
求める汎用解法である分枝限定法においても早期に実行可能解を求めることが
速度向上に繋がります.
本発表では,最近提案された高速に実行可能解を求める LP-free な
ヒューリスティックである Feasibility Jump (FJ) を解説し,FJ を
Nuorium Optimizer に導入されている repair 機能と結合することで,
実行可能解を求めるタスクにおける性能が向上したことを報告いたします.

参考文献:
Bjornar Luteberget and Giorgio Sartor: Feasibility jump: an lp-free 
lagrangian mip heuristic. Mathematical Programming Computation, 
Vol. 15, No. 2, pp. 365-388, Jun 2023.

「混合整数線形計画問題に対する重み付き局所探索法」
  * 神谷俊介 (株式会社NTTデータ数理システム)
    藤井浩一 (株式会社NTTデータ数理システム)
    石橋保身 (株式会社NTTデータ数理システム)

Nuorium Optimizer V26 において,重み付き局所探索法 (WLS) は対象と
する問題クラスを混合整数線形計画問題へ広げました.本手法は文献 [1] の
0-1 整数線形計画問題に対する手法に基づいており,整数変数間の類似度
により問題構造を識別し,巨大な近傍を適切に構築する点が特徴です.
本発表では,WLS がもつ整数変数への強みを維持しつつ,連続変数に
対する性能を向上させる独自の拡張手法を説明します.また,
Supervisor-Worker パラダイムに基づき各スレッドが協調して探索を行う
WLS の並列化手法についても紹介します.

参考文献:
[1] S. Umetani: Exploiting variable associations to configure 
efficient local search algorithms in large-scale binary integer 
programs. Eur. J. Oper. Res., Vol. 263, pp. 72-81, 2017.

■  日本オペレーションズ・リサーチ学会 2025 年春季シンポジウム

開催日時  3 月 5 日(水) 13:30 ~ 17:20
    https://orsj.org/nc2025s/symposium/

「海外 OR の最前線」というテーマで行われるパネルディスカッション
にて藤井浩一がパネリストとして参加します.Zuse Institute Berlin に
一年間滞在した経験をもとに,国内外の OR の違いなどについて識者と
議論します.

■  日本機械学会 生産システム部門研究発表講演会 2025

開催日:3 月 3 日(月) ~ 3 月 4 日(火)
    https://www.jsme.or.jp/msd/102_kouen25-6

「汎用メタヒューリスティクス解法 WLS の紹介と実務問題への応用」
  * 神谷俊介 (株式会社NTTデータ数理システム)
    藤井浩一 (株式会社NTTデータ数理システム)
    石橋保身 (株式会社NTTデータ数理システム)

本発表では重み付き局所探索法 (WLS) を,製造業の実務における
最適化問題への適用可能性という観点から紹介します.LP-free 解法
である WLS は,アプローチの違いにより分枝限定法と比べ得意な
問題種別が異なり,両者が性能を補完し合う関係をもっています.
特に,緩和問題の情報が有効に活用できない問題において性能差が
生じやすく,例えば 2D Strip Packing Problem と呼ばれる積付問題
では,WLS が分枝限定法を上回る性能を示します.
WLS の連続変数への対応を通じて,汎用解法の可能性がどのように
広がるかについて詳しく紹介します.

                                                (神谷 俊介)

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

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

エネルギーや物流に関して,課題に特化したセミナーを実施いたします.
ご興味のあるセミナーございましたら詳細をご確認いただき,
是非セミナーにご参加いただけますと幸いです.

物流セミナーは開催まで時間がないため,
参加ご検討の方はお早めにお申し込みください.

[ 物流クライシスを解決 輸送業務の最適化セミナー ]
  2025 年 01 月 17 日(金)13:30~15:30
  詳細とお申込み : 
    https://www.msiism.jp/event/nuopt-logistics.html

[ エネルギーマネジメント最適化セミナー ]
  2025 年 02 月 13 日(木)13:30~15:30
  詳細とお申込み
    https://www.msiism.jp/event/nuopt-energy-management.html

                                                (保科 拓紀)

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

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

今回は PySIMPLE における多次元の添字の設計思想とテクニックを紹介
します.
まずは以下の C++SIMPLE の記述を見てみましょう.C++SIMPLE において
以下のように superSet=(I,J) とした場合には IJ.slice(2)⊂J は保証
されますが,IJ.slice(2) == J であるとは限りません.

C++SIMPLE:
------------------------------------------------------------------
Set I; Element i(set=I);
Set J="3 4 5"; Element j(set=J);
Set IJ(dim=2, superSet=(I,J)); IJ="1,3 1,4 2,3";  // IJ.slice(2)⊂J
J.val.print();            // {3 4 5}
IJ.slice(2).val.print();  // {3 4}
------------------------------------------------------------------

そのため,以下の 2 つの制約式では意味が異なり,後者ではエラーになって
しまいます.

C++SIMPLE:
------------------------------------------------------------------
Variable x(index=IJ);
sum(x[i,j], (i, (i,j)<IJ)) >= 1, j<IJ.slice(2);  // j in 3 4
//sum(x[i,j], (i, (i,j)<IJ)) >= 1;               // j in 3 4 5
// (SIMPLE 215) 制約式1[5] は以下の式に等価です "1 == 0" (常に満たされない).
// (SIMPLE 216) 常に Infeasible な制約式が現れました.
------------------------------------------------------------------

このような記述も PySIMPLE では多次元の添字を使うことで曖昧性なく
記述することができます.

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

C++SIMPLE では多次元の添字を使うこともできますが,使わないことも
できます.一方で PySIMPLE では多次元の添字を強制することで曖昧性の
なく,一貫性のある pythonic な記述となる設計になっています.

多次元の添字は便利な面もありますが,次元が多くなると少し見づらくなる
こともあります.以下の C++SIMPLE と PySIMPLE の記述を見てみましょう.

C++SIMPLE:
------------------------------------------------------------------
Set I, J, K; Element i(set=I), j(set=J), k(set=K);
Set IJK(dim=3, superSet=(I,J,K)); IJK="1,3,5 1,3,6 1,4,5 2,3,5";
Variable x(index=IJK.slice(1,2));
Parameter a(index=IJK.slice(2)); a[j] = 1;
sum(x[i,j], ((i,k), (i,j,k)<IJK)) >= a[j], j<IJK.slice(2);
------------------------------------------------------------------

PySIMPLE:
------------------------------------------------------------------
>>> ijk = Element(value=[(1,3,5), (1,3,6), (1,4,5), (2,3,5)], name='ijk') 
>>> x = Variable(index=ijk(0,1), name='x') 
>>> a = Parameter(index=ijk(1), value=1, name='a') 
>>> Sum(x[ijk(0,1)], ijk(0,2)) >= a[ijk(1)]  # 通常の書き方  
(Sum(x[ijk(0,1)], ijk(0,2))[ijk(1)]>=a[ijk(1)]):
2*x[1,3]+x[2,3]>=1
x[1,4]>=1
------------------------------------------------------------------

同じモデルですが,添字が増えたことによりいずれもやや見づらくなって
います.こんなとき PySIMPLE ではエイリアスを使うことで記述を簡潔に
することができます.

PySIMPLE:
------------------------------------------------------------------
>>> i, j, k = ijk(0), ijk(1), ijk(2)  # エイリアスを使った書き方
>>> Sum(x[i,j], (i,k)) >= a[j] 
(Sum(x[ijk(0),ijk(1)], (ijk(0),ijk(2)))[ijk(1)]>=a[ijk(1)]):
2*x[1,3]+x[2,3]>=1
x[1,4]>=1
------------------------------------------------------------------

多次元の添字にも拘らず,その疎性を気にすることなく記述することが
できています.また,エイリアスの定義部分は以下のようにして汎用化する
ことも可能です.

------------------------------------------------------------------
>>> i, j, k = map(ijk, range(ijk.set.dim))  # 汎用化
>>> Sum(x[i,j], (i,k)) >= a[j]
(Sum(x[ijk(0),ijk(1)], (ijk(0),ijk(2)))[ijk(1)]>=a[ijk(1)]):
2*x[1,3]+x[2,3]>=1
x[1,4]>=1
------------------------------------------------------------------

いかがでしたでしょうか.PySIMPLE では多次元の添字を強制することで
ユーザーが陥りやすい箇所が自動的に排除される設計となっています.
また,Python の機能を上手く併用することで,可読性を制御することも
可能です.

Set.__call__ のマニュアルはこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/class.html#pysimple.Set.__call__
Element.__call__ のマニュアルはこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/class.html#pysimple.Element.__call__

                                                (池田 悠)

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