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

バックナンバー ( 2025 Vol.6 ) 2025 年 11 月 17 日 発行

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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 新刊『実務で使える数理最適化の考え方
               ―基礎から学ぶモデリング』のご紹介
 ■ <トピック> MSIISM Conference 2025 開催報告
 ■ <トピック> 講演会「数理最適化入門:現場の気持ちをくみながら
               ベストな答えを出す」の開催報告
 ■ <  tips  > 使ってみよう PySIMPLE(第 39 回)
 ■ <セミナー> Nuorium Optimizer 新機能紹介セミナー 12/19 (金) 開催
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> 新刊『実務で使える数理最適化の考え方
               ―基礎から学ぶモデリング』のご紹介
******************************************************************

11 月 18 日に,弊社社員による新刊『実務で使える数理最適化の考え方
―基礎から学ぶモデリング』がオーム社様より発売されます.
  https://www.ohmsha.co.jp/book/9784274233906/

数理最適化は,生産計画や輸送,シフト作成,設備投資など,現代の多くの
業務で意思決定を支える中核技術になっています.しかし,教科書で扱われる
「典型的な問題」と,実務で遭遇する「現実の問題」には大きな隔たりが
あります.理論を学んでも,それを現場の課題にどう落とし込むかで
悩む方も多いのではないでしょうか.
本書は,そのギャップを埋めるために,アルゴリズムや解法の詳細よりも,
「どう考え,どうモデリングするか」という思考のプロセスに焦点を
当てました.著者らが実際の現場で最適化を適用してきた経験をもとに,
「どのように問題を整理し,変数・制約・目的関数を設計するか」を
具体的に解説しています.

各章では配合・輸送・人員配置・スケジューリングなど,代表的な問題を
題材に,条件を少しずつ変えながら考察を深める構成としました.これに
より,読者は“定式化の型”を学ぶだけでなく,「問題をどう捉えれば
よいか」というモデリングの発想法を自然に身につけることができます.
また,最終章では,最適化プロジェクトを成功させるための実務的な
ノウハウや,導入・運用における留意点にも触れています.数学的な
予備知識は最小限にとどめ,初学者から実務担当者まで幅広い層に
読んでいただける構成です.

「最適化を業務で活かしたい」「理論だけでなく実践的な考え方を知りたい」
という方に,ぜひ手に取っていただきたい一冊です.お求めの際は表紙に
猫が描いてある最適化の本をお探しください!

                                                (富塚 健志)

******************************************************************
■ <トピック> MSIISM Conference 2025 開催報告
******************************************************************

10/24 (金) に五反田で MSIISM Conference 2025 を開催いたしました.
本イベントは毎年 10 月ごろに行っている弊社イベントであり,
今年は生成 AI の再評価をテーマにしています.
各講演についての詳細はまたどこかの機会に譲るとして,本メルマガでは
展示内容について簡単に紹介いたします.

展示自体は様々なテーマを元に行いました.

◆テーマ例
- Nuorium Optimizer
- 生産計画
- オペレーション最適化
- 生成 AI エージェントと最適化
- ...

特に Nuorium Optimizer や生産計画をテーマにしたブースでは数理最適化に
興味をお持ちの方,既に始められている方が多くいらっしゃいました.

Nuorium Optimizer では今年リリースした Excel と Python インター
フェースの連携機能 Excel アドイン を紹介しました.
Excel アドインを用いることで高速なアプリ開発が可能になり,
何より計算結果の集計や可視化がプログラマでない方でも可能です.
お客様との会話ではこの点をご評価いただく声を多くいただきました.

また,数理最適化を既に始められている方について,単にソルバーを
使うだけでは解けない状況に直面されているケースもいくつか見受け
られました.
このような場合は基本に立ち戻って問題設定を見直すことが重要です.
数理最適化の限界を見極めつつ現実的なアプローチを見出すのには
ノウハウ・経験も必要になり,以下のドキュメントが参考になると
思います.その上でお困りの際はぜひ一度弊社にご相談ください.

定式化技法集
https://www.msi.co.jp/solution/nuopt/docs/techniques/index.html

定式化設計集
https://www.msi.co.jp/solution/nuopt/docs/designs/index.html

その他,展示の内容についてご興味あれば nuopt-info@ml.msi.co.jp に
ご連絡ください.

                                                (石橋 保身)

******************************************************************
■ <トピック> 講演会「数理最適化入門:現場の気持ちをくみながら
              ベストな答えを出す」の開催報告
******************************************************************

2025 年 10 月 22 日に講演会 「数理最適化入門:現場の気持ちを
くみながらベストな答えを出す」を都築電気様と開催しました.

本講演会では,現場の気持ちをくみながらベストな答えを導き出すことの
できる数理最適化が現場にもたらす変革を,看護・保育現場などの具体的
事例を通して紹介しました.また,講演した内容をもとに,参加者全員
での意見交換会の場も設け,参加者各々の立場から,数理最適化の可能性や
自社の業務への活用方法を模索しました.

ナーススケジューリングの研究で著名な成蹊大学名誉教授の池上敦子先生を
はじめ,社会福祉法人希望の会こだま保育園赤塚雄太様,ZEN 大学 HUMAI
センター武富有香先生,大阪大学大学院学系研究科医療情報学仲島圭将先生に
ご講演をいただきました.
また,都築電気株式会社鬼頭正樹様には DX 導入支援サービス
「D-VUE Service」を紹介いただき, Nuorium Optimizer を活用した
ナーススケジューリング事例についてご発表いただきました.

アカデミック・現場と多様な立場から「数理最適化(および数理科学)の
実践」について発表がされ,示唆に富む講演会となりました.
発表内容については,以下の MSIISM 記事でもまとめています. 
ご興味ある方はこちらも是非ご覧ください.

  https://www.msiism.jp/article/event-report-opt-2025.html

                                      (藤井 浩一・金村佳範)

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

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

今回は制約式でよく現れる「添字の連続した部分の表現」を取り上げます.
例えば添字のうち,連続した 3 つの部分の変数を記述してみましょう.
添字が等差数列の場合は単純です.

------------------------------------------------------------------
>>> i = Element(value=range(5), name='i')  # i in (0, 1, 2, 3, 4)
>>> x = Variable(index=i, name='x')
>>> i3 = Element(set=i.set[:-2], name='i3')  # i3 in (0, 1, 2)
>>> x[i3] + x[i3+1] + x[i3+2]
((x[i3]+x[(i3+1)[i3]][i3])[i3]+x[(i3+2)[i3]][i3]):
x[0]+x[1]+x[2]
x[1]+x[2]+x[3]
x[2]+x[3]+x[4]
------------------------------------------------------------------

では,文字列のように添字の順番に規則性がない場合はどうでしょうか.
このような場合,連続した 2 つの部分であれば Set.next メソッドを
利用して表現することができます.

------------------------------------------------------------------
>>> S = Set(value='ABCDE', name='S')
>>> s = Element(set=S, name='s')  # s in (A, B, C, D, E)
>>> y = Variable(index=s, name='y')
>>> s2 = Element(set=S[:-1], name='s2')  # s2 in (A, B, C, D)
>>> y[s2] + y[S.next(s2)]
(y[s2]+y[S.next(s2)[s2]][s2]):
y['A']+y['B']
y['B']+y['C']
y['C']+y['D']
y['D']+y['E']
------------------------------------------------------------------

しかし,この方法は 3 つの場合には適用できません.
これは Set.next(Element) の戻り値は Parameter となるため,
Set.next(Set.next(Element)) は Set.next(Parameter) となるためです.

------------------------------------------------------------------
s3 = Element(set=S[:-2], name='s3')  # s3 in (A, B, C)
>>> S.next(S.next(s3))
TypeError: unhashable type: 'Parameter'
------------------------------------------------------------------

これを回避する方法として,2 つ先の添字を対応させる Parameter を
自分で作成してしまう方法が考えられます.

------------------------------------------------------------------
>>> next2 = Parameter(index=s3, value={_s: S.next(S.next(_s)) for _s, in s3.set}, name='next2')
>>> next2
next2['A']='C'
next2['B']='D'
next2['C']='E'
>>> y[s3] + y[S.next(s3)] + y[next2[s3]]
((y[s3]+y[S.next(s3)[s3]][s3])[s3]+y[next2[s3]][s3]):
y['A']+y['B']+y['C']
y['B']+y['C']+y['D']
y['C']+y['D']+y['E']
------------------------------------------------------------------

この考え方は汎用化することができ,連続した N つの部分の表現も可能
となります.

------------------------------------------------------------------
>>> N = 3
>>> k = Element(value=range(len(S)-N+1), name='k')
>>> sk = Element(set=S[:N], name='sk')
>>> nextk = Parameter(index=(k,sk), value={(kk, ssk): v for kk, in k.set for (ssk,), (v,) in zip(S[:N], S[kk:])}, name='nextk')
>>> nextk
nextk[0,'A']='A'
nextk[0,'B']='B'
nextk[0,'C']='C'
nextk[1,'A']='B'
nextk[1,'B']='C'
nextk[1,'C']='D'
nextk[2,'A']='C'
nextk[2,'B']='D'
nextk[2,'C']='E'
>>> Sum(y[nextk[k,sk]], sk)
Sum(y[nextk[k,sk]][k,sk], sk):
y['A']+y['B']+y['C']
y['B']+y['C']+y['D']
y['C']+y['D']+y['E']
------------------------------------------------------------------

いかがでしたでしょうか.今回は特に真新しい機能は紹介していませんが,
数行のコードで様々なことを実現できる PySIMPLE の便利さを体感できた
のではないでしょうか.

Set.next メソッドの説明はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/class.html#pysimple.Set.next
マニュアル版はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/guide/continuousindex.html

                                                (池田 悠)

******************************************************************
■ <セミナー> Nuorium Optimizer 新機能紹介セミナー 12/19 (金) 開催
******************************************************************

Nuorium Optimizer の次期バージョンでリリース予定の機能を 12/19 (金)
に紹介予定です.

大きな特徴を一つ紹介しますと,分枝限定法と重み付き局所探索法を
並列実行するシンセシスソルバーを実装しました.
この機能は単にそれぞれの解法を同時に実行するだけでなく,得られた
実行可能解を共有し合うことで探索が高速化されます.
また,それぞれの解法で得意・苦手な問題もお互いの強みで補うことも
期待されます.混合整数線形計画問題(MILP)を解いている方はぜひ一度
お試しいただきたい機能となっています.
セミナーではご利用方法や計算例をお伝えする予定です.

対面とオンラインのハイブリッドで開催いたします.
対面ではセミナー後に講師に直接お話できる時間もございますので,
是非対面でのご参加もご検討お願いいたします.

申込フォーム
- 対面
https://forms.zohopublic.jp/nttdmsi/form/NuoriumOptimizerV28/formperma/RjVzCNFsrlz0HJAfz1hwvVXfLPk-zkpj8OIbigeWwYQ

- オンライン
https://forms.zohopublic.jp/nttdmsi/form/WebinarNuoriumOptimizerV28/formperma/-zdKUnUI4Wzk0lhV2-ZA1q9UaKYdFUW0UZM00wRfLWQ

                                                (石橋 保身)

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