関連イベント・セミナー1
概要が入ります。
数理システム 最適化メールマガジン
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
数理システム 最適化メールマガジン
https://www.msi.co.jp/solution/nuopt/top.html
2026 Vol.3 ( 2026 年 5 月 20 日 発行 )
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
数理システム 最適化メールマガジンでは,数理最適化パッケージ
Nuorium Optimizer をはじめとして,最適化に関する様々な情報や
ご案内を提供していきます.
++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
■ <トピック> シンセシスソルバーのご紹介
■ <トピック> 定式化技法集「列生成法という技法」のご紹介
■ <トピック> Japan IT Week【春】2026 展示内容のご紹介
■ < tips > 使ってみよう PySIMPLE(第 41 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
******************************************************************
■ <トピック> シンセシスソルバーのご紹介
******************************************************************
Nuorium Optimizer V28 で新機能「シンセシスソルバー」をリリース
しました.
本機能のリリースに合わせて弊社オウンドメディアである MSIISM で,
計算性能をご紹介する記事を掲載しました.
・Nuorium Optimizer V28 シンセシスソルバーをご紹介!
分枝限定法とメタヒューリスティクスの融合による高速化
https://www.msiism.jp/article/nuorium-optimizer-v28-1.html
本記事では生産スケジューリングにおいて非常に重要な並列機械
スケジューリングに対して,汎用的な分枝限定法や局所探索法よりも高い
性能を発揮していることをご紹介しています.
さて,本記事では紹介できていませんが,シンセシスソルバーは発電機の
運転計画問題のような問題でも,短時間の求解(1-5 分)においては
汎用的な分枝限定法や局所探索法よりも良い性能が得られることを
確認しています.
今後もシンセシスソルバーの強みと使いどころを整理してお客様に
届けたいと考えています.
新しい解法の選択肢として,ぜひ Nuorium Optimizer V28 のシンセシス
ソルバーにご注目ください.
(石橋 保身・神谷 俊介)
******************************************************************
■ <トピック> 定式化技法集「列生成法という技法」のご紹介
******************************************************************
今回は,定式化技法集の中から「列生成法という技法」を紹介します.
数理最適化では,取扱う課題の対象範囲が拡大すると,変数や制約式の
数が非常に多くなることがあります.特に,候補となるパターンをすべて
列挙して,その中から最適な組合せを選ぶような問題では,考えられる
候補数が膨大になってしまいます.
たとえば,配送計画問題の経路パターンなどを考える場合,経路パターンの
候補を事前にすべて作成してから最適化するのは現実的でないことが
あります.
このようなときに重要になる考え方の一つが,今回紹介する「列生成法」
です.
# そもそも定式化技法集とは
定式化技法集は,数理最適化モデルを作成する際に役立つテクニックを
まとめたドキュメントです.
数理最適化では,現実の業務課題を,変数・制約条件・目的関数として
表現する必要があります.しかし,単に数式として書くだけでなく,
計算機で実際に解きやすい形にすることも重要です.
定式化技法集では,そのような実践的なモデリングのヒントが紹介されて
います.
# 「列生成法という技法」では何を紹介しているか
「列生成法という技法」の記事では,大規模な線形最適化問題に対して,
すべての変数や制約条件を最初から扱うのではなく,必要なものを順に
生成しながら解いていく考え方が紹介されています.
ここでいう「列」とは,主問題の係数行列の列,つまり主問題の変数に
対応するものです.
列生成法では,最初からすべての変数を用意するのではなく,一部の変数
だけを使った限定問題を解きます.その後,現在の解を改善する可能性の
ある変数があるかどうかを調べ,必要であれば新しい変数を追加して,
再び問題を解きます.
このようにして,膨大な候補をすべて列挙するのではなく,必要な候補
だけを生成しながら解を改善していくのが,列生成法の基本的な考え方
です.
# このテクニックが重要な理由
列生成法の考え方は,候補数が非常に多い問題で特に重要です.
実務では,次のような問題で「候補をすべて列挙すると大きすぎる」
という状況がよく現れます.
- 配送経路の候補から,実際に使うルートを選ぶ
- 勤務パターンの候補から,各人の勤務を選ぶ
- 資材切り出しパターンの候補から,材料の使い方を選ぶ
- 生産パターンや作業パターンの候補から,実行する計画を選ぶ
このような問題では,自然に考えると「候補を全部作ってから選ぶ」
というモデルになります.しかし,候補数が多すぎる場合,そのままでは
モデルが大きくなりすぎてしまいます.
列生成法を知っていると,
「すべての候補を最初から持つ必要はないのではないか」
「必要な候補を,解きながら追加していけないか」
という発想ができるようになります.
これは,大規模な最適化問題へのアプローチを考えるうえで非常に重要な
視点です.
# 実務での利用イメージ
私自身も,配送ルートや作業パターンのように,候補数が非常に多くなる
問題を考える際には,列生成法の考え方を意識することがあります.
たとえば,ある案件で「すべての候補パターンを変数として持つと,
変数数が膨大になりそうだ」という状況がありました.
そのような場合,単に全候補を列挙するのではなく,候補をどのように
生成するか,どの候補だけをモデルに入れるか,という観点で問題を
見直す必要があります.
実際に列生成法を実装するかどうかは問題の構造や要件によりますが,
「変数をすべて先に作るのではなく,必要なものを追加していく」
という考え方を持っているだけでも,大規模なモデルを設計するときの
見通しが大きく変わります.
# まずは考え方を知る入口として
列生成法は,双対問題,被約費用,価格付け問題などと関係する専門的な
技法です.そのため,最初から詳細な手続きをすべて理解するのは簡単では
ありません.
しかし,定式化技法集の記事では,列生成法がどのような考え方に基づく
技法なのかが整理されています.
大規模な問題を扱っていて,
「変数が多すぎる」
「候補を全部列挙するのが難しい」
「パターン選択型のモデルをどう扱えばよいか分からない」
と感じたときには,ぜひ「列生成法という技法」の記事を参考に
してみてください.
このように,定式化技法集には,実務で数理最適化モデルを作成する際に
役立つ魅力的な記事が多数掲載されています.
皆さんもぜひ,モデル作成時のヒントとして活用してみてください.
# 参考リンク
- 定式化技法集
https://www.msi.co.jp/solution/nuopt/docs/techniques/index.html
- 列生成法という技法
https://www.msi.co.jp/solution/nuopt/docs/techniques/articles/column-generation-method-technique.html
(加瀬 力)
******************************************************************
■ <トピック> Japan IT Week【春】2026 展示内容のご紹介
******************************************************************
Japan IT Week【春】2026 にて,数理最適化を用いた生産計画・生産
スケジューリングの実践的なソリューションを展示しました.
日本の製造業において,生産計画・生産スケジューリングの DX 化は
一定程度進みつつある一方で,意思決定の自動化・最適化にまで進んで
いる企業はまだ多くないのが実情です.
特に,生産計画業務において以下のようなお悩みを抱えつつも,
「どう改善すべきか分からない」という声を多くお聞きします.
- 業務が属人化している
- 何が最適な計画なのか分からない
- パズルのような計画業務に追われている
弊社では,このような課題に対して数理最適化が有効なアプローチで
あると確信しており,今回の展示会では特に,大日程計画の自動化に
焦点を当てて展示を行いました.
大日程計画は,各種小日程・中日程計画のベースとなるため,様々な
シミュレーション(いわゆる意思入れ,What If 分析)を経て計画を
立案する必要があります.
しかし現状では,計画作成ロジックが属人化しており,十分な
シミュレーションを行えないまま意思決定をされているケースも
少なくありません.
もちろん,こうした意思決定は過去の経験や勘に基づくものであり,
現時点で取り得る最善の判断である場合も多くあります.
人手で行うプロセスが,ある意味で「最適化」されている状態だと
言えます.
一方で,環境変化のスピードが速まる現在においては,「経験と勘」に
よる最適化だけでは対応しきれない場面が増えています.需要変動,
制約条件の増加,人員不足などが重なり,検討すべき組み合わせの数
そのものが,人の思考限界を超えつつあるためです.
そこで有効となるのが,数理最適化を用いた計画立案です.
数理最適化は,人の経験や判断を否定するものではなく,人が考えるべき
意思決定を支援するための技術です.
例えば大日程計画においては,
- 複数の制約条件を同時に考慮した計画案を短時間で生成
- 前提条件を変えた複数シナリオを即座に比較
- 「なぜその計画が選ばれたのか」を論理的に説明
といったことが可能になります.
弊社のソリューションが属人化対策,計画の品質向上,計画業務の効率化を
目指す皆さまにとって,本展示内容が一つのヒントとなれば幸いです.
展示内容の詳細や,個別課題に応じたご説明をご希望の方は,ぜひお気軽に
お問い合わせください.
(石橋 保身)
******************************************************************
■ < tips > 使ってみよう PySIMPLE(第 41 回)
******************************************************************
このコーナーでは,Nuorium Optimizer の Python インターフェース
PySIMPLE のエッセンスを紹介していきます.
PySIMPLE は多次元の疎な集合を頻繁に扱いますが,これらの操作は
関係代数の演算として整理できます.
今回は関係代数の PySIMPLE 実装について紹介していきます.
まずは,基本的な演算である,和,差,交わり,直積,射影,選択を
見てみます.
------------------------------------------------------------------
>>> I = Set(value=[1,2,3,4], name='I')
>>> J = Set(value=[2,4,6,8], name='J')
>>> print(I | J) # 和
(I|J)=Set(value=[1, 2, 3, 4, 6, 8])
>>> print(I - J) # 差
(I-J)=Set(value=[1, 3])
>>> print(I & J) # 交わり
(I&J)=Set(value=[2, 4])
>>> S = Set(value=[1,2], name='S')
>>> print(S * S) # 直積
(S*S)=Set(value=[(1, 1), (1, 2), (2, 1), (2, 2)])
>>> IJ = Set(value=[(1,3), (1,4), (2,3)], name='IJ')
>>> print(IJ(0)) # 射影
IJ(0)=Set(value=[1, 2])
>>> ij = Element(set=IJ, name='ij')
>>> Condition(ij, ij(1)==3) # 選択
(ij, (ij(1)==3))[ij] in [(1, 3), (2, 3)]
------------------------------------------------------------------
選択以外は専用の演算子やメソッドが用意されており,集合の演算として
自然に記述できます.また,これらの演算は(疎な)多次元集合でも記述
できます.
結合演算の中でも基本的な演算が,直積を一般化した等結合(equijoin)や
自然結合(natural join)です.これらの他に頻出する有用な結合演算が,
交わりと差を一般化した準結合(semijoin)と反結合(antijoin)です.
------------------------------------------------------------------
>>> ij = Element(value=[(1,3), (1,4), (2,3)], name='ij')
>>> jk = Element(value=[(3,5), (3,6), (4,5)], name='jk')
>>> Condition((ij,jk), ij(1)==jk(0)) # 等結合
((ij,jk), (ij(1)==jk(0)))[ij,jk] in [(1,3,3,5), (1,3,3,6), (1,4,4,5), (2,3,3,5), (2,3,3,6)]
>>> Condition((ij,jk(1)), ij(1)==jk(0)) # 自然結合
((ij,jk(1)), (ij(1)==jk(0)))[ij,jk(1)] in [(1,3,5), (1,3,6), (1,4,5), (2,3,5), (2,3,6)]
>>>
>>> ijk = Element(value=[(1,3,5), (1,3,6), (1,4,5), (2,3,5)], name='ijk')
>>> ik = Element(value=[(1,6), (2,5)], name='ik')
>>> Condition(ijk, ijk(0,2)<ik.set) # 準結合
(ijk, (ijk(0,2)<ik.set))[ijk] in [(1, 3, 6), (2, 3, 5)]
>>> Condition(ijk, ijk(0,2)>ik.set) # 反結合
(ijk, (ijk(0,2)>ik.set))[ijk] in [(1, 3, 5), (1, 4, 5)]
------------------------------------------------------------------
結合は直積に対する条件付けとして定義されます.それぞれに専用の記法が
用意されている訳ではありませんが,Condition によって述語を明示的に
与えることで,結合を関係論理的に表現しています.このことは,先ほどの
選択についても同様です.
最後に集約を見てみましょう.
------------------------------------------------------------------
>>> ab = Element(value=[(1,1), (1,2), (1,4), (2,2), (2,3), (3,1), (3,5)], name='ab')
>>> Sum(ab(1)) # 合計
Sum(ab(1), ab(1))[1]=7
Sum(ab(1), ab(1))[2]=5
Sum(ab(1), ab(1))[3]=6
>>> Max(ab(1)) # 最大
Max(ab(1), ab(1))[1]=4
Max(ab(1), ab(1))[2]=3
Max(ab(1), ab(1))[3]=5
>>> Min(ab(1)) # 最小
Min(ab(1), ab(1))[1]=1
Min(ab(1), ab(1))[2]=2
Min(ab(1), ab(1))[3]=1
>>> print(Sum(1, ab(1))) # カウント
Sum(1, ab(1))[1]=3
Sum(1, ab(1))[2]=2
Sum(1, ab(1))[3]=2
------------------------------------------------------------------
平均は Sum(ab(1))/Sum(1, ab(1)) で計算できます.
いかがでしたでしょうか.
データベースでは必須の関係代数ですが,PySIMPLE と異なる点として,
データベースの関係は属性に名前がついている一方,PySIMPLE の集合には
次元ごとに名前はついていません.そのため,属性は次元で指定することに
なりますが,IJK など次元に対応したオブジェクト名を用意することで,
却って簡潔に記述することができます.
マニュアル版はこちら:
https://www.msi.co.jp/solution/nuopt/docs/pysimple/guide/relationalalgebra.html
集合の演算はこちら:
https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/operation.html
条件関数はこちら:
https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/function.html#id2
集約に用いた関数はこちら:
https://www.msi.co.jp/solution/nuopt/docs/pysimple/api/function.html#module-pysimple.func
(池田 悠)
==================================================================