NOTE: この資料について
この資料は組合せ最適化の導入をまとめた学習用テキストである。
図や式は補足説明とあわせて読むと理解しやすい。
0. この授業で何を学ぶか¶
本授業では、 「選択肢が非常に多い問題の中から、制約を守りつつ最も良い解を見つける方法」 を学ぶ。
特に後半では、進化計算・群知能に属する手法(GA, PSO など)を中心に扱う予定である。
この科目の到達目標(再掲)¶
組合せ最適化アルゴリズムの理論を理解し、実社会の問題に適用できる。
第1回の到達目標¶
第1回終了時に、次を説明できる状態を目指す。
「最適化問題」「組合せ最適化問題」「制約」の違い
なぜ全探索が難しいのか(組合せ爆発)
典型的な組合せ最適化問題の例(巡回セールスマン問題、割当問題、スケジューリング)
厳密解法と近似解法・メタヒューリスティクスの立ち位置
本授業で扱う内容と評価方法
1. 最適化問題の基本¶
1.1 最適化問題とは¶
最適化問題は、一般に次の形で記述できる。
: 解(意思決定変数)
: 目的関数(評価指標)
: 制約条件
: 解候補の集合
NOTE: 数式表現の読み方
ここでの英語表現は次の意味です。
minimize (or maximize): 「目的関数 をできるだけ小さく(または大きく)する」という意味です。subject to: 「次の条件を満たしながら」という意味で、後ろに続くものが制約条件です。
したがって、式全体は
「制約 を満たす の中で、 をできるだけ小さく(または大きく)する」
という意味になります。
また、似た記号として argmin / argmax がありますが、役割が少し異なります。
minimize f(x): 「 を小さくしたい」という 問題の型(目標) を書いています。: 「 を最小にする 解そのもの 」を表しています。
この資料の式は「どんな問題を解きたいか」を宣言しているので minimize / subject to を使っており、後で「見つかった最適解」を記号で書くときに argmin / argmax を使う、という使い分けをします。
1.2 組合せ最適化とは¶
組合せ最適化は、解が 離散的な組合せ で表される最適化問題である。
例として次がある。
都市の訪問順序(TSP: Traveling Salesman Problem)
品物選択(KP: Knapsack Problem)
作業の割当(AP: Assignment Problem)
時間割の作成(Timetabling Problem)
変数が連続値ではなく、離散値(0/1、順列、集合選択)
解空間が有限だが、規模が大きいと現実的に全探索できない
制約が複雑になりやすい(実務要件を反映しやすい)
1.3 組合せ爆発¶
選択肢の数は、要素数 の増加に対して指数関数的・階乗的に増える場合が多い。
0/1選択問題: 候補数
順列問題: 候補数
例:20都市の巡回順序(始点固定)
1秒あたり1億通りを評価できても、全探索には現実的でない時間が必要になる。
2. 典型問題のイメージ¶
2.1 巡回セールスマン問題(TSP)¶
複数都市を1回ずつ訪問して出発点に戻る
総移動距離(または時間)を最小化
解は都市の順列で表される
応用例:
配送ルート最適化
点検巡回計画
基板穴あけ順序最適化
2.2 ナップサック問題¶
重さ制限以内で価値が最大となる品物集合を選ぶ
0/1の選択変数で表現しやすい
多くの実務問題の簡略モデルになる
応用例:
限られた予算での施策選択
計算資源制限下での機能選択
在庫制約下での積載計画
2.3 割当問題・スケジューリング¶
人員や機械をタスクへ割り当てる
納期、優先度、能力差、連続作業制約などが関与
現場の要求を制約としてモデル化しやすい
応用例:
時間割編成
シフト作成
生産計画
3. どう解くか:解法の全体像¶
3.1 厳密解法と近似解法¶
厳密解法¶
最適解を保証する
問題規模が大きいと計算時間が急増しやすい
例: 分枝限定法、動的計画法、整数計画ソルバ
近似解法・ヒューリスティクス¶
計算時間を実用的に抑え、良い解を得る
最適性保証は弱くなる(またはない)
現場では「短時間で十分良い解」が重要になる場面が多い
3.2 メタヒューリスティクス¶
メタヒューリスティクスは、特定問題に依存しない汎用的な探索枠組みである。
代表例:
局所探索(ヒルクライム、焼きなまし法、タブーサーチ)
遺伝的アルゴリズム(GA)
粒子群最適化(PSO)
アリコロニー最適化(ACO)
遺伝的プログラミング(GP)・進化戦略(ES)
4. 産業・社会での活用例¶
物流最適化
配送順序、積載、車両台数、時間帯制約を考慮して総コストを削減する。
製造計画
段取り替え時間・機械能力・納期を考慮し、遅延と在庫を低減する。
情報システム運用
サーバ資源割当、ジョブスケジューリング、ネットワーク経路選択を最適化する。
教育現場
時間割編成、試験監督割当、教室利用計画を制約付きで調整する。
AIモデル設計
ハイパーパラメータ探索、NAS、進化的探索により設計を効率化する。
5. この授業の進め方(第1回時点)¶
5.1 週ごとの流れ(概要)¶
1週: 導入(本日)
2〜3週: 数学的最適化・局所探索の基礎
4〜9週: GA・群知能(PSO, ACO 等)
10〜12週: 深層学習への接続・進化的NAS
13〜15週: 演習・発表・まとめ
5.2 成績評価¶
課題: 60%
レポート: 30%
発表: 10%
合計60点以上で単位修得
評価観点:
理論理解 30%
実装能力 30%
プロジェクト演習 40%
5.3 提出物の基本方針¶
使用言語は Python / R / Julia のいずれか
再現可能な形で提出(実行手順・依存関係・入力データを明記)
「動いた」だけでなく、設計意図・評価指標・結果解釈を示す
6. 第1回ミニ演習(授業内)¶
手順¶
問題を1つ選ぶ(例: 時間割調整、課題実施順、移動ルート)
目的関数を1つ決める(例: 時間最小、移動距離最小、満足度最大)
制約を3つ以上書く(例: 時間上限、優先科目、連続作業禁止)
解の表現を定義する(例: 順列、0/1ベクトル、割当表)
その問題で全探索が難しい理由を書く
提出フォーマット(授業内メモ)¶
以下のテンプレートを利用すること。
[問題名]
1. 目的関数:
2. 制約:
- C1:
- C2:
- C3:
3. 解の表現:
4. 解候補数の見積もり:
5. 全探索が難しい理由:7. 実装に向けた準備(次回まで)¶
次回以降は簡単な実装を始めるため、次を準備すること。
開発環境(Python / R / Julia いずれか)
乱数・配列操作・可視化の基本ライブラリ
コード再実行可能な構成(Notebook または script + README)
Pythonを選ぶ場合の最小例(参考):
import random
def objective(x: list[int]) -> int:
"""目的関数の最小例(ダミー)。
Args:
x: 整数のリスト。
Returns:
``x`` の要素の和。
"""
return sum(x)
candidate = [random.randint(0, 1) for _ in range(10)]
print(candidate, objective(candidate))NOTE: サンプルコードの位置づけ
上記コードは「最適化アルゴリズム」ではなく、目的関数評価の最小例である。
次回以降で探索アルゴリズムを追加する。
8. まとめ¶
組合せ最適化は、離散的な解候補から制約を満たす最良解を探す問題である。
実問題では組合せ爆発が起こるため、全探索は多くの場合非現実的である。
そのため厳密解法と近似解法を使い分ける。
本授業では特にGA・PSOなどのメタヒューリスティクスを中心に扱う。
第2回以降は、モデル化の精度と実装力の両方を段階的に強化する。
9. 確認問題¶
組合せ最適化における「解」「目的関数」「制約」をそれぞれ説明せよ。
20都市のTSPで全探索が難しい理由を、解候補数の観点から述べよ。
厳密解法とメタヒューリスティクスの違いを、計算時間と最適性保証の観点で述べよ。
自分が興味を持つ実問題を1つ挙げ、解表現の案を示せ。