バックナンバー ( 2026 Vol.2 ) 2026 年 3 月 13 日 発行

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


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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> Nuorium Optimizer V28 を 3 月リリース予定
 ■ <トピック> MSIISM 記事「ブラックボックス最適化による
               偏微分方程式の逆問題解析」のご紹介
 ■ <トピック> 書籍出版記念 講演イベント開催ご報告
 ■ <トピック> 展示会出展のご案内
 ■ <  tips  > 使ってみよう PySIMPLE(第 40 回)
 ■ <セミナー> 無料セミナーのご案内
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> Nuorium Optimizer V28 を 3 月リリース予定
******************************************************************

いつも弊社のメールマガジンをご購読くださり誠にありがとうございます.

Nuorium Optimizer の最新バージョンである V28 を 3 月下旬にリリース
することが決定しました.本メルマガでは最新バージョンの魅力を簡潔に
ご紹介いたします.

□ 新機能 1:シンセシスソルバー

分枝限定法と重み付き局所探索法を協調動作しながら並行に実行して問題を
解く機能を追加しました.本機能は以下のような特長を持ちます.

・二つの解法を同時に実行しているため実行可能解の発見を期待できる.
・発見された実行可能解が二つの解法で共有されるため,更なる
  実行可能解の更新を期待できる.
・目的関数の下界値を得ることができる.

本機能は PySIMPLE / C++SIMPLE どちらからでもご利用できます.
ぜひお試しください.

□ 新機能 2:スパース単体法における LP Folding

線形計画問題に対して,問題の対称性を利用して次元を圧縮する前処理
手法 LP Folding を実装しました.

LP Folding は単なる「冗長な制約・変数の削除」にとどまらず,
同一の形(構造)をもつ部分を重ね合わせることで,解くべき問題規模を
縮小する手法です.LP Folding は,hsimplex 選択時に前処理として
自動で起動し,圧縮が十分に見込める場合にのみ適用されます.
ユーザーは追加の設定なしで利用できます.

□ 新機能 3:MIP IIS

従来は整数変数を含む問題に対して整数変数から由来する実行不可能の場合,
IIS (実行不可能性の要因となる制約式の集合)の検出が不可能でした.
V28 では整数変数を含む問題に対して,IIS の検出が可能となりました.


最新バージョンにご興味をお持ちの方は 3/18 開催の無料セミナー
「Nuorium Optimizer 最新動向セミナー」にご参加ください.
お申込みページは本メルマガの「<セミナー> 無料セミナーのご案内」を
ご覧ください.

                                                (石橋 保身)

******************************************************************
■ <トピック> MSIISM 記事「ブラックボックス最適化による
              偏微分方程式の逆問題解析」のご紹介
******************************************************************

ブラックボックス最適化とは,最適化したい関数が明示されていない
場合に,その関数を直接評価することだけを手がかりに最適解を探す手法の
総称です.
今回,輻射輸送方程式の逆問題にブラックボックス最適化を応用した事例を
紹介する MSIISM 記事を執筆しました.

MSIISM 記事「ブラックボックス最適化による偏微分方程式の逆問題解析」
  https://www.msiism.jp/article/black-box-optimization.html
  
本記事では,近赤外光トモグラフィを題材に生体に照射した光の観測データ
から生体内部の光学特性を推定する逆問題を扱っています.
輻射輸送方程式の数値シミュレーションをブラックボックスとみなし,
観測値との誤差を最小化する問題として定式化したうえで,
ブラックボックス最適化を適用した例を紹介しています.

ブラックボックス最適化は,観測データとモデルの狭間に潜む未知の
パラメータの推定など,従来の最適化アルゴリズムでは困難であった
領域にも新たなアプローチを提供することができます.
ぜひご覧いただければ幸いです.  

                                     (藤井 浩一・田中 大毅)

******************************************************************
■ <トピック> 書籍出版記念 講演イベント開催ご報告
******************************************************************

11 月のメルマガでもお知らせしましたが,
弊社社員による書籍『実務で使える数理最適化の考え方―基礎から学ぶ
モデリング―』を発売させていただきました.
  https://www.ohmsha.co.jp/book/9784274233906/

これを記念して,1 月 22 日に,
「実務で使える数理最適化の考え方とその実践」という講演会を新宿で
開催しました.

当日は執筆に携わった三名の社員による講演を行いました.

松岡からは「実務で使える数理最適化の考え方」というタイトルで,
「数理最適化とは何か」というところから丁寧に解説をしました.
さらに,数理最適化プロジェクトを成功させるための考え方として,
数理最適化プロジェクトの流れや,スモールスタートの落とし穴など
書籍にもある点について解説をしました.

私藤井浩一からは,「『数理最適化の考え方』で伝えたこと,
伝えられなかったこと」というタイトルで,最適化問題の「書ける」と
「解ける」のギャップについて解説をしました.
最適化問題は,問題をきちんと定式化できたとしても,それがソルバーに
とって最善の書き方ではなく,より良い書き方がある場合もあります.
このような「別解」の重要性,という観点を分枝限定法やメタヒューリ
スティクスなど,それぞれのアルゴリズムの特性を解説しながら
説明しました.

最後に,伊藤からは「数理最適化の考え方の実践例」というタイトルで,
実際の現場での実践経験に基づきながら,定式化の「勘所」について解説を
しました.
また,個人的な考察と断りつつ,ユーザと技術者の歩み寄り方,問題を
解いた後のフォローアップ,メンテナンスについても紹介しました.

残念ながら参加が叶わなかった方も,興味がありましたら当日資料を
紹介しますのでお気軽にご連絡ください.
また,まだ書籍を手に取っていない方はこれを機会に取っていただけ
ましたら著者一同幸いです.

                                                (藤井 浩一)

******************************************************************
■ <トピック> 展示会出展のご案内
******************************************************************

2026 年 4 月 8 日(水)~ 2026 年 4 月 10 日(金)に東京ビッグサイト
にて開催されます Japan DX Week AI・業務自動化展にて当社出展いたします.

今回は製造業の DX をメインとして展示を行い, 生産計画・生産工程の
最適化や, 工場におけるデータ解析をテーマに, 数理科学を活用した
ソリューションを展示いたします. 

製造業における様々な課題に関してソリューションを紹介しておりますので, 
是非展示会参加の方は弊社ブースにもお立ち寄りいただけますと幸いです. 
当社社員とその場でディスカッションしていただくことで, 
ソリューションのイメージを深めていただけるのではと考えております. 

展示会の概要はこちらの URL からご確認いただけます. 
https://www.japan-it.jp/spring/ja-jp.html

                                                (保科 拓紀)

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

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

PySIMPLE は添字を用いて数式のように記述できる点が特長ですが,それでも
複雑なものでは少し工夫が必要になります.今回は少し複雑な制約式を
添字を用いて記述する方法を紹介します.

まずは基本となる,条件に対して多次元の添字を用いる方法です.
多次元の添字に慣れてない方は第 2 回,第 3 回のメルマガを参照ください.
いくつか例を見てみましょう.

Σ_{i, i<j} x[i] ≧ a[j], ∀j:
------------------------------------------------------------------
>>> i = Element(value=[1, 2, 3, 4], name='i')
>>> j = Element(set=i.set, name='j')
>>> x = Variable(index=i, name='x')
>>> a = Parameter(index=j, name='a'); a[j] = j
>>> ij = i<j
>>> Sum(x[ij(0)], ij(0)) >= a[ij(1)]
(Sum(x[(i<j)(0)], (i<j)(0))[(i<j)(1)]>=a[(i<j)(1)]):
x[1]>=2
x[1]+x[2]>=3
x[1]+x[2]+x[3]>=4
------------------------------------------------------------------

添字の範囲を集合で指定する場合にも同様の考え方が利用できます.

Σ_{i, (i,j)∈IJ} x[i] ≧ 1, ∀j:
------------------------------------------------------------------
>>> i = Element(value=[1, 2], name='i')
>>> j = Element(value=[3, 4], name='j')
>>> ij = Element(value=[(1,3), (1,4), (2,3)], name='ij')
>>> x = Variable(index=i, name='x')
>>> Sum(x[ij(0)], ij(0)) >= 1
(Sum(x[ij(0)], ij(0))[ij(1)]>=1):
x[1]+x[2]>=1
x[1]>=1
------------------------------------------------------------------

複数の条件が絡む場合は,条件を満たす多次元の添字をあらかじめ用意する
ことで記述できます.

x[i,t] ≦ x[i,t+1], ∀(i,t)∈IT, (i,t+1)∈IT:
------------------------------------------------------------------
>>> IT = Set(value=[('A',1), ('B',2), ('C',3), ('D',1), ('D',2),
    ('E',1), ('E',3), ('F',2), ('F',3), ('G',1), ('G',2), ('G',3)], name='IT')
>>> it = Element(set=IT, name='it')
>>> it2 = Element(set=IT, name='it2')
>>> x = Variable(index=it, name='x')
>>> itt = Condition((it,it2(1)), (it(0)==it2(0), it(1)+1==it2(1)))
>>> itt.name = 'itt'
>>> itt
itt[it,it2(1)] in [('D', 1, 2), ('F', 2, 3), ('G', 1, 2), ('G', 2, 3)]
>>> x[itt(0,1)] >= x[itt(0,2)]
(x[itt(0,1)]>=x[itt(0,2)]):
x['D',1]-x['D',2]>=0
x['F',2]-x['F',3]>=0
x['G',1]-x['G',2]>=0
x['G',2]-x['G',3]>=0
------------------------------------------------------------------

ただし,このような場合,無理をして 3 次元の添字を用意するよりも,
Python の for 文を利用して条件を満たす集合を直接作成した方が低コスト
です.

------------------------------------------------------------------
>>> it1 = Element(value=[(i,t) for i, t in IT if (i,t+1) in IT], name='it1')
>>> it1.set
Set(name='it1.set', dim=2, value=[('D', 1), ('F', 2), ('G', 1), ('G', 2)])
>>> x[it1] >= x[it1(0),it1(1)+1]
(x[it1]>=x[it1(0),(it1(1)+1)[it1(1)]][it1(0),it1(1)]):
x['D',1]-x['D',2]>=0
x['F',2]-x['F',3]>=0
x['G',1]-x['G',2]>=0
x['G',2]-x['G',3]>=0
------------------------------------------------------------------

別の例を見てみましょう.こちらも条件を満たす集合を直接作成するという
考え方は同じです.

Σ_{i, (i,j)∈IJ, (i,k)∈IK} (x[i,j] + y[i,k]) ≦ 1, ∀j, k:
------------------------------------------------------------------
>>> i = Element(value=[1, 2], name='i')
>>> j = Element(value=[3, 4], name='j')
>>> k = Element(value=[5, 6], name='k')
>>> IJ = Set(value=[(1,3), (1,4), (2,3)], name='IJ')
>>> IK = Set(value=[(1,5), (1,6), (2,5)], name='IK')
>>> x = Variable(index=IJ, name='x')
>>> y = Variable(index=IK, name='y')
>>> ijk = Element(value=[(_i,_j,_k) for _i, in i.set for _j, in j.set
    for _k, in k.set if (_i,_j) in IJ and (_i,_k) in IK], name='ijk')
>>> Sum(x[ijk(0,1)] + y[ijk(0,2)], ijk(0)) >= 1
(Sum((x[ijk(0,1)]+y[ijk(0,2)])[ijk(0,1),ijk(2)], ijk(0))[ijk(1,2)]>=1):
x[1,3]+x[2,3]+y[1,5]+y[2,5]>=1
x[1,3]+y[1,6]>=1
x[1,4]+y[1,5]>=1
x[1,4]+y[1,6]>=1
------------------------------------------------------------------

和をとる添字に条件を付ける場合も,和をとった後で残った添字に条件を
付ける場合も,考え方同じです.

Σ_{i, (i,j)∈IJ, (i,k)∈IK} (x[i,j] + y[i,k]) ≦ 1, ∀(j,k)∈JK:
------------------------------------------------------------------
>>> JK = Set(value=[(3,5), (3,6), (4,5)], name='JK')
>>> ijk = Element(value=[(_i,_j,_k) for _i, in i.set for _j, in j.set
    for _k, in k.set if (_i,_j) in IJ and (_i,_k) in IK and (_j,_k) in JK], name='ijk')
>>> Sum(x[ijk(0,1)] + y[ijk(0,2)], ijk(0)) >= 1
(Sum((x[ijk(0,1)]+y[ijk(0,2)])[ijk(0,1),ijk(2)], ijk(0))[ijk(1,2)]>=1):
x[1,3]+x[2,3]+y[1,5]+y[2,5]>=1
x[1,3]+y[1,6]>=1
x[1,4]+y[1,5]>=1
------------------------------------------------------------------

制約式としてよく出現する境界条件やフロー保存則などは 第 30 回なども
参照してください.

いかがでしたでしょうか.いずれも添字に条件がつく場合は「あらかじめ
条件を満たす多次元の添字(集合)を用意しておく」という考え方が基本に
なります.一方で,その作成方法は最も効率の良いと考えられる方法が
よいでしょう.

マニュアル版はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/guide/complexconstraint.html
初期条件やフロー保存則の記述テクニックの説明はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/guide/get.html

                                                (池田 悠)

******************************************************************
■ <セミナー> 無料セミナーのご案内
******************************************************************

来週開催予定の Nuorium Optimizer 最新動向セミナーをご案内いたします. 

2026 年 3 月末頃にリリースの数理最適化ソルバー Nuorium Optimizer
の最新機能を先出しでご紹介するセミナーを開催いたします.

現在 Nuorium Optimizer をご利用いただいている方はもちろん,
フリーソルバを使って数理最適化に取り組まれている方や, これから
数理最適化に取り組まれる方に Nuorium Optimizer 新機能の重要性や効果, 
使い方を紹介するセミナーになります. 
是非この機会にご参加ください.

開催日 : 2026 年 3 月 18 日(水)
時間 : 16:00 - 17:00
開催方法 : オンライン
申込および詳細 : 
https://www.msiism.jp/event/nuoriumoptimizer-newfeatures-2025.html

                                                (保科 拓紀)

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