Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

第1回:導入 — 組合せ最適化とは何か

NOTE: この資料について

この資料は組合せ最適化の導入をまとめた学習用テキストである。
図や式は補足説明とあわせて読むと理解しやすい。


0. この授業で何を学ぶか

本授業では、 「選択肢が非常に多い問題の中から、制約を守りつつ最も良い解を見つける方法」 を学ぶ。
特に後半では、進化計算・群知能に属する手法(GA, PSO など)を中心に扱う予定である。

この科目の到達目標(再掲)

第1回の到達目標

第1回終了時に、次を説明できる状態を目指す。

  1. 「最適化問題」「組合せ最適化問題」「制約」の違い

  2. なぜ全探索が難しいのか(組合せ爆発)

  3. 典型的な組合せ最適化問題の例(巡回セールスマン問題、割当問題、スケジューリング)

  4. 厳密解法と近似解法・メタヒューリスティクスの立ち位置

  5. 本授業で扱う内容と評価方法


1. 最適化問題の基本

1.1 最適化問題とは

最適化問題は、一般に次の形で記述できる。

minimize (or maximize)f(x)subject toxX, gi(x)0, hj(x)=0\text{minimize (or maximize)} \quad f(x) \\ \text{subject to} \quad x \in \mathcal{X}, \ g_i(x)\le 0,\ h_j(x)=0
NOTE: 数式表現の読み方

ここでの英語表現は次の意味です。

  • minimize (or maximize): 「目的関数 f(x)f(x) をできるだけ小さく(または大きく)する」という意味です。

  • subject to: 「次の条件を満たしながら」という意味で、後ろに続くものが制約条件です。

したがって、式全体は
「制約 xX, gi(x)0, hj(x)=0x \in \mathcal{X},\ g_i(x)\le0,\ h_j(x)=0 を満たす xx の中で、f(x)f(x) をできるだけ小さく(または大きく)する」
という意味になります。

また、似た記号として argmin / argmax がありますが、役割が少し異なります。

  • minimize f(x): 「f(x)f(x) を小さくしたい」という 問題の型(目標) を書いています。

  • x=argminf(x)x^{*} = \operatorname{argmin}\, f(x): 「f(x)f(x) を最小にする 解そのもの xx^{*}」を表しています。

この資料の式は「どんな問題を解きたいか」を宣言しているので minimize / subject to を使っており、後で「見つかった最適解」を記号で書くときに argmin / argmax を使う、という使い分けをします。

1.2 組合せ最適化とは

組合せ最適化は、解が 離散的な組合せ で表される最適化問題である。
例として次がある。

1.3 組合せ爆発

選択肢の数は、要素数 nn の増加に対して指数関数的・階乗的に増える場合が多い。

例:20都市の巡回順序(始点固定)

(201)!=19!1.216×1017(20-1)! = 19! \approx 1.216\times 10^{17}

1秒あたり1億通りを評価できても、全探索には現実的でない時間が必要になる。


2. 典型問題のイメージ

2.1 巡回セールスマン問題(TSP)

応用例:

2.2 ナップサック問題

応用例:

2.3 割当問題・スケジューリング

応用例:


3. どう解くか:解法の全体像

3.1 厳密解法と近似解法

厳密解法

近似解法・ヒューリスティクス

3.2 メタヒューリスティクス

メタヒューリスティクスは、特定問題に依存しない汎用的な探索枠組みである。

代表例:


4. 産業・社会での活用例

  1. 物流最適化

    • 配送順序、積載、車両台数、時間帯制約を考慮して総コストを削減する。

  2. 製造計画

    • 段取り替え時間・機械能力・納期を考慮し、遅延と在庫を低減する。

  3. 情報システム運用

    • サーバ資源割当、ジョブスケジューリング、ネットワーク経路選択を最適化する。

  4. 教育現場

    • 時間割編成、試験監督割当、教室利用計画を制約付きで調整する。

  5. AIモデル設計

    • ハイパーパラメータ探索、NAS、進化的探索により設計を効率化する。


5. この授業の進め方(第1回時点)

5.1 週ごとの流れ(概要)

5.2 成績評価

評価観点:

5.3 提出物の基本方針


6. 第1回ミニ演習(授業内)

手順

  1. 問題を1つ選ぶ(例: 時間割調整、課題実施順、移動ルート)

  2. 目的関数を1つ決める(例: 時間最小、移動距離最小、満足度最大)

  3. 制約を3つ以上書く(例: 時間上限、優先科目、連続作業禁止)

  4. 解の表現を定義する(例: 順列、0/1ベクトル、割当表)

  5. その問題で全探索が難しい理由を書く

提出フォーマット(授業内メモ)

以下のテンプレートを利用すること。

[問題名]

1. 目的関数:
2. 制約:
   - C1:
   - C2:
   - C3:
3. 解の表現:
4. 解候補数の見積もり:
5. 全探索が難しい理由:

7. 実装に向けた準備(次回まで)

次回以降は簡単な実装を始めるため、次を準備すること。

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. まとめ


9. 確認問題

  1. 組合せ最適化における「解」「目的関数」「制約」をそれぞれ説明せよ。

  2. 20都市のTSPで全探索が難しい理由を、解候補数の観点から述べよ。

  3. 厳密解法とメタヒューリスティクスの違いを、計算時間と最適性保証の観点で述べよ。

  4. 自分が興味を持つ実問題を1つ挙げ、解表現の案を示せ。