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

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


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

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

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> 代表取締役就任のご挨拶
 ■ <トピック> 線形計画問題と対称性 - LP Folding のご紹介
 ■ <トピック> ブラックボックス最適化アルゴリズム CMA-ES の紹介
 ■ <イベント> 学生研究奨励賞のご案内
 ■ <トピック> 定式化技法集「頻出する式構造」のご紹介
 ■ <  tips  > 使ってみよう PySIMPLE(第 42 回)
 ■ <セミナー> 無料セミナーのご案内
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック> 代表取締役就任のご挨拶
******************************************************************

はじめまして.6 月より NTT データ数理システム社の代表取締役と
なりました,奥田です.
Nuorium Optimizer をはじめ,当社製品・サービスをご利用いただき,
誠にありがとうございます.
当社は 1982 年の創立以来,「数理科学とコンピュータサイエンスにより
現実世界の問題を解決する」という使命のもと,技術を研鑽し,統計解析や
数理最適化,機械学習などの数理科学と,それを土台に当社が培ってきた
AI 技術を基盤に,お客様とともに価値創出に取り組んでまいりました.
近年は生成 AI をはじめとする技術革新により,データ活用の可能性が
飛躍的に広がっていますが,その価値を最大化するためには,現実の
課題を深く理解し,最適な形で実装する力が不可欠です.
当社は数理科学の知見と AI 技術に加え,コンサルティング力と実装力を
融合し,「成果につながる技術」を提供することで,引き続きお客様の
課題解決に貢献してまいります.
これからも NTT データ数理システムをご愛顧のほど,よろしくお願い
申し上げます.

                                                (奥田 良治)

******************************************************************
■ <トピック> 線形計画問題と対称性 - LP Folding のご紹介
******************************************************************

対称性という言葉を聞いて,何を思い浮かべるでしょうか.

雪の結晶やアラベスク模様のように,回転・並進・鏡映などの変換を
加えても元の図形と一致する性質を,対称性と呼びます.数学的には,
対称性は「ある変換に対して対象が不変である」という性質として定義
されます.

このような対称性の考え方は,実は最適化問題に対しても適用できます.
変数・制約式・解集合に対して,並べ替えや混合などの変換を考える
ことで,解対称性(solution symmetry),定式化対称性(formulation
symmetry),弱対称性(weak symmetry)など,いくつかの対称性が定義
されます.最適化問題におけるこれらの対称性についてご興味が
ありましたら,本節末尾に記載した文献 [1, 2, 3] などをご参照ください.

さて,このたび Nuorium Optimizer V28 では,線形計画問題(LP)に
対して対称性を検出し,活用する前処理手法である LP Folding をリリース
しました.線形計画問題に対して解法 hsimplex を選択すると,
LP Folding が前処理として自動で実行されます.

本手法では,問題に含まれる対称な変数や制約を検出し,それらをまとめて
扱うことで,元の線形計画問題をより次元の小さい問題へと縮約します.
これにより,対称性をもつ問題に対して,より効率的な求解が期待できます.
本機能は,主に文献 [3] の手法に基づいて実装しています.

https://www.msi.co.jp/solution/nuopt/whatsnew.html#v28-hsimplex
https://www.msi.co.jp/solution/nuopt/docs/manual/html/02-04-00.html


LP Folding を新たに備えた解法 hsimplex を,ぜひ引き続きご活用ください.

[1] Pfetsch, Marc E, and Thomas Rehn. 2019. "A Computational
    Comparison of Symmetry Handling Methods for Mixed Integer
    Programs." Mathematical Programming Computation 11 (1): 37-93.
[2] Margot, Francois. 2009. "Symmetry in Integer Linear Programming.
    " 50 Years of Integer Programming 1958-2008: From the Early
    Years to the State-of-the-Art, 647-86.
[3] Grohe, Martin, Kristian Kersting, Martin Mladenov, and Erkal
    Selman. 2014. "Dimension Reduction via Colour Refinement."
    In European Symposium on Algorithms, 505-16. Springer.

                                                (清水 翔司)

******************************************************************
■ <トピック> ブラックボックス最適化アルゴリズム CMA-ES の紹介
******************************************************************

CMA-ES (Covariance Matrix Adaption Evolution Strategy, 共分散行列
適応進化戦略) は 1996 年に Nikolaus Hansen と Andreas Ostermeier
により考案された,ブラックボックス最適化アルゴリズムの一種です.
目的関数の導関数の情報が不要で 100 次元程度の高次元にも対応でき,
ノイズにも強いという性質があります.
以前のメールマガジンで紹介した MSIISM 記事でもこのアルゴリズムを
使用しています.

MSIISM 記事「ブラックボックス最適化による偏微分方程式の逆問題解析」
  https://www.msiism.jp/article/black-box-optimization.html

今回は,CMA-ES のアルゴリズムについて簡単に紹介します.
CMA-ES による最適化では,複数の解候補を正規分布からサンプリング
してそれぞれのサンプル点で目的関数値を計算します.
そして,その評価値に基づいて正規分布の平均ベクトルと共分散行列を
更新し,最終的に正規分布が最適解におけるデルタ関数に収束することを
期待します.
分布の更新では,まず解候補の中で良好な目的関数値を返すエリート集団を
取り出し,正規分布の平均ベクトルをエリート集団の平均に近づける操作を
行います.
その後,共分散行列の更新を行いますが,ここは少し複雑です.
Rank-μ 更新と Rank-one 更新と呼ばれる 2 つの方法により共分散行列を
更新します.
Rank-μ 更新では,正規分布の共分散行列をエリート集団のステップの
標本共分散行列に近づける操作を行います.これは,エリート集団が多く
いる方向に探索を進めようとするアイデアに基づいています.
一方,Rank-one 更新では,正規分布の平均ベクトルがこれまでたどって
きた経路を考慮し,その延長上にサンプル点を取りやすくするように
共分散行列を更新します.
これら 2 つの更新操作の重み付き和により共分散行列を更新し,次の
ステップのサンプリングを行います.
実際の計算では,共分散行列とステップサイズを分離して更新したり,
進化パスと呼ばれるものを導入してステップサイズや Rank-one 更新の
速さを調整したりと,様々な工夫が取り入れられています.
詳しくは Nikolaus Hansen によるチュートリアルをご覧ください.
  https://arxiv.org/abs/1604.00772

CMA-ES はトポロジー最適化やマテリアルズインフォマティクス,
機械学習のパラメータ最適化など幅広い分野で活用されています.
明示的に記述することが難しい関数を最適化しなければならないなど,
従来の最適化アルゴリズムでは困難なケースに活用をご検討ください.

                                                (田中 大毅)

******************************************************************
■ <イベント> 学生研究奨励賞のご案内
******************************************************************

今年度も学生研究奨励賞を開催します.
2027 年 2 月時点で学生であることがエントリーの条件でございます.
当社のソフトウェアを活用した研究成果を報告いただき,
内容に応じて表彰をいたします.

詳細は以下のページからご確認ください.
https://www.msi.co.jp/event/stuaward/guideline.html

皆様からのエントリーを心よりお待ちしております.

                                                (保科 拓紀)

******************************************************************
■ <トピック> 定式化技法集「頻出する式構造」のご紹介
******************************************************************

今回は,定式化技法集の中から「頻出する式構造」を紹介します.

数理最適化の定式化では,目的関数や制約式を線形な式として記述する
ことがよくあります.そのため,一見すると,数式は単純な一次式や
総和記号の集まりに見えるかもしれません.

しかし,実務で扱う問題をモデル化しようとすると,変数の添字が
増えたり,条件が複雑になったりして,式の意味を読み取るのが難しく
なることがあります.

そのようなときに役立つのが,今回紹介する「頻出する式構造」という
考え方です.

# そもそも定式化技法集とは

定式化技法集は,数理最適化モデルを作成する際に役立つテクニックを
まとめたドキュメントです.

数理最適化では,現実の業務課題を,変数・制約条件・目的関数として
表現する必要があります.しかし,単に数式として書くだけでなく,
計算機で実際に解きやすい形にすることや,後から見て意味が分かり
やすい形にすることも重要です.

定式化技法集では,そのような実践的なモデリングのヒントが紹介されて
います.

# 「頻出する式構造」では何を紹介しているか

「頻出する式構造」の記事では,線形な定式化でよく現れる特徴的な
式の形が紹介されています.

たとえば,記事では次のような話題が取り上げられています.

- SOS,特殊順序集合
- 疎な記述
- 目的関数による制約式の代用

これらは,単なる数式上のテクニックというより,モデルの意図を
読み解くためのパターンです.

数式だけを見ると似たような総和や不等式に見えても,そこには  
  「候補のうち高々一つを選ぶ」  
  「実際に存在する組合せだけを扱う」  
  「目的関数の性質を利用して制約式を減らす」  
といった意味が隠れていることがあります.

このような式構造を知っておくと,自分でモデルを書くときだけでなく,
他の人が書いた定式化を読むときにも役立ちます.

本記事では,この中でも特に実務で重要だと感じる「疎な記述」を
取り上げて紹介します.

# 疎な記述とは

まず,「疎」という言葉について整理しておきます.

「疎(そ)」とは,考えられるすべての組合せのうち,実際に意味を
持つものがごく一部しかない状態を指す言葉です.

反対に,すべての組合せが意味を持ち,すき間なく埋まっている状態を
「密(みつ)」といいます.

この「疎」という考え方を,モデルの書き方に取り入れたものが
「疎な記述」です.

数理最適化モデルでは,複数の添字を持つ変数がよく現れます.
たとえば,拠点 `i` から拠点 `j` へ物を運ぶかどうかを表す変数を
考える場合,ついすべての組合せ `(i, j)` に対して変数を作りたく
なります.

しかし,実務では,すべての組合せが意味を持つとは限りません.

  物流計画であれば,すべての拠点間に輸送経路があるとは限りません.
  生産計画であれば,すべての工程間に品目の移動があるとは限りません.
  勤務計画であれば,すべての人がすべてのシフトに入れるとは限りません.

このような場合に,すべての組合せを対象にして変数を作ると,
モデルが必要以上に大きくなってしまいます.

そこで,実際に意味のある組合せだけを集合として定義し,その集合の
上で変数や制約式を記述するのが,疎な記述の考え方です.

# このテクニックが重要な理由

疎な記述は,モデルの規模が大きくなるほど重要になります.

たとえば,出発拠点が 1,000,到着拠点が 1,000 ある場合,すべての
組合せを考えると 1,000,000 通りの候補が生じます.  
しかし,現実に利用可能な経路がその一部だけであれば,すべての
組合せを変数として持つ必要はありません.

実際に存在する経路だけを変数として持つようにすれば,不要な変数を
作らずに済みます.その結果,モデルの規模を抑えられ,計算時間や
メモリ使用量の面でも有利になる可能性があります.

また,疎な記述は,モデルの説明性にも関係します.

「すべての組合せを考えています」と説明するよりも,「実際に
利用可能な候補だけを考えています」と説明できる方が,業務上の
意味とモデルの構造が対応しやすくなります.

つまり,疎な記述は,単にモデルを小さくするためだけでなく,現実の
業務条件を自然に表現するためにも重要な考え方です.

# 実務での利用イメージ

私自身も,ネットワーク構造を持つモデルや,複数の添字を持つ変数を扱う
案件では,疎な集合をどのように定義するかを意識することがあります.

たとえば,拠点間の移動や,工程間の接続,候補となる組合せを扱う場合,
最初に直積集合ですべての組合せを考えてしまうと,変数や制約式が
必要以上に増えてしまうことがあります.

そのような場合には,
  - 本当にこの組合せは業務上あり得るのか
  - この候補はあらかじめ除外できないか
  - 実際に意味のある組合せだけを集合として持てないか
という観点でモデルを見直します.

この考え方を取り入れることで,モデルの規模を抑えられるだけでなく,
式の意味も分かりやすくなります.

# 式の形から意図を読み取る

数理最適化のモデルでは,同じような総和や不等式がたくさん並ぶことが
あります.  
しかし,それぞれの式には,選択,割当,接続,保存,候補の絞り込みなど,
何らかの意図があります.

「頻出する式構造」を知っておくと,
  - この制約は何を選ばせているのか
  - この添字集合はなぜ直積ではないのか
  - この変数はどの候補だけに定義されているのか
  - この制約は本当に必要なのか
といった観点で,モデルを読み解けるようになります.

これは,自分でモデルを作成するときだけでなく,既存のモデルを改修したり,
他の人が作成した定式化を確認したりする際にも役立ちます.

大規模なモデルや,添字が多いモデルを扱っていて,

  - 式の意味が追いにくい
  - 変数や制約式が増えすぎている
  - どの組合せを対象にすべきか迷う
と感じたときには,ぜひ「頻出する式構造」の記事を参考にしてみてください.

このように,定式化技法集には,実務で数理最適化モデルを作成する際に
役立つ魅力的な記事が多数掲載されています.  
皆さんもぜひ,モデル作成時のヒントとして活用してみてください.

## 参考リンク

- 定式化技法集
    https://www.msi.co.jp/solution/nuopt/docs/techniques/index.html
- 頻出する式構造
    https://www.msi.co.jp/solution/nuopt/docs/techniques/articles/frequent-expression-structure.html

                                                (加瀬 力)

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

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

第 20 回では最低連続稼働時間制約の書き方を紹介しました.
今回は最大連続稼働時間制約とその応用について紹介します.

最大連続稼働時間制約は最低連続稼働時間制約に比べると単純です.
機器が連続して稼働するのは最大 k 時間まで,という制約は,任意の
「連続する k+1 区間ですべて稼働」を除外すれば OK です.

------------------------------------------------------------------
t = Element(value=range(T))  # 時刻.0, .., T-1
tt = Element(value=range(T-k))     # 0, .., T-k-1
i = Element(value=range(k+1))      # 0, .., k
z = BinaryVariable(index=t)  # 0: 稼働しない,1: 稼働する
Sum(z[tt+i], i) <= k  # 最大連続稼働時間制約
------------------------------------------------------------------

今回は応用として次のケースを考えます.

- 機器の稼働は時刻 0, .., T-1 の範囲外でも発生し,稼働状況は不明

この状態での最大連続稼働時間制約を考えてみます.T=4, k=2 のときは
以下のようなイメージです.

時刻     | -2 -1 |  0  1  2  3 |  4  5
---------+-------+-------------+------
ケース 1 |  ?  ? | ○          |  ?  ?
ケース 2 |  ?  ? | ○ ○       |  ?  ?
ケース 3 |  ?  ? |    ○ ○    |  ?  ?
ケース 4 |  ?  ? |       ○ ○ |  ?  ?
ケース 5 |  ?  ? |          ○ |  ?  ?

ここで時刻 -2, -1, 4, 5 の稼働状態は不明のため,最大連続稼働時間が
k=2 を超える可能性のあるケースを除外すると,ケース 3 のみが許容
されることになります.
最悪ケースとして「?」部分が稼働していると考えると,愚直な定式化は
次のようになります.

------------------------------------------------------------------
t = Element(value=range(T))  # 0, .., T-1
z = BinaryVariable(index=t)
   1 +    1 + z[0] <= 2
   1 + z[0] + z[1] <= 2
z[0] + z[1] + z[2] <= 2
z[1] + z[2] + z[3] <= 2
z[2] + z[3] +    1 <= 2
z[3] +    1 +    1 <= 2
------------------------------------------------------------------

さて,この定式化を汎用的に記述するにはどうすればよいでしょうか.
第 30 回でも紹介した境界条件やフロー保存則の記述テクニックを使って
Sum(z.get(t+i), i) <= k のように記述できそうですが,デフォルト値の
1 を表現することができません.そこで,少し面倒ですが,デフォルト値
用のパラメータ default を用意することで,以下のように記述することが
できます.

------------------------------------------------------------------
t1 = Element(value=range(-k, 0))    # -k, .., -1
t = Element(value=range(T))         # 0, .., T-1
t2 = Element(value=range(T, T+k))   # T, .., T+k-1
tall = Element(set=t1.set | t.set)  # -k, .., T-1
i = Element(value=range(k+1))       # 0, .., k
z = BinaryVariable(index=t)
default = Parameter(index=t1.set | t2.set, value=1)
Sum(z.get(tall+i) + default.get(tall+i), i) <= k  # 最大連続稼働時間制約
# Sum(z.get(tall+i, default=1), i) <= k  # こう書きたい
------------------------------------------------------------------

いかがでしたでしょうか.少し手間になってはしまうのですが,汎用的な
記述ができました.
get メソッドは辞書のそれのようにデフォルト値をとれると便利なのですが,
実は実装の都合で提供できておりません.
最小・最大連続稼働時間制約は運転計画問題以外でもスケジューリング
問題で頻出の制約です.今回のように応用のバリエーションも豊富なため,
しっかりと押さえておきましょう.

マニュアル版はこちら:
    https://www.msi.co.jp/solution/nuopt/docs/pysimple/guide/continuousoperation.html

第 20 回「最低連続稼働時間制約の書き方」はこちら:
    https://www.msi.co.jp/solution/nuopt/mailmagazine/backnumber2209.html#4

第 30 回「初期条件やフロー保存則の記述テクニック」はこちら:
    https://www.msi.co.jp/solution/nuopt/mailmagazine/backnumber2405.html#5

                                                (池田 悠)

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

「Claude Code x 最適化」をテーマにセミナーを開催いたします.

AI(Claude Code)を活用することで,数理最適化の一連の流れ(定式化
から実装まで)がどのように変わるのか,デモンストレーションを含めて
紹介します.

【オンライン】は既に満席をいただいておりますが,
【対面】はまだ少しだけ席に余裕がございますので,是非ご検討ください.

これから最適化に取り組まれる方はもちろん,すでに最適化に取り組まれて
いる方も是非ご参加いただき,最適化ソリューション検討の参考にして
いただければと思います.

日時 : 2026 年 8 月 7 日(金)13:30 - 15:00
形式 : ハイブリッド(対面およびオンライン)
詳細 : https://www.msiism.jp/event/mathematical-modeling-hybrid.html

対面とオンラインで申込のフォームが異なりますので,ご注意ください.

                                                (保科 拓紀)

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