Chapter 4

局所最適から逃げる 5 つの流派

山登り法で「もう動けない」場所に来てしまった。
谷の底だが、地図を見ると遠くにもっと深い谷がある気がする。

さあ、どう逃げる?

この問いに、研究者たちは半世紀かけて 5 つの流派を編み出した。
それぞれ性格がまるで違って、登場人物として読めるくらい個性がある。

5 つの流派、性格でひとことに:

  • 🌡 焼きなまし: 「酔っ払いほど自由」。確率的に悪い方にも進む
  • 📝 タブー: 「メモ魔」。最近行ったところは禁止
  • 💢 反復局所探索: 「ちゃぶ台返し」。固まったら部屋ごとシャッフル
  • 🔭 可変近傍: 「望遠鏡」。視界を広げて再挑戦
  • 🎲 GRASP: 「毎日違うスタート」。多数決で勝つ

順番に会いに行こう。

4.1 焼きなまし法 — 酔っ払いほど自由

鍛冶屋を想像してほしい。
金属を高温に熱したあと、ゆっくり冷ますと、内部の歪みが取れて美しい結晶構造になる。
これが「焼きなまし」。

1983 年、物理学者 Kirkpatrick はこれを最適化に持ち込んだ。

アイデア

山登り法は「改善する移動」しか許さない。
焼きなまし法 (Simulated Annealing, SA) は、悪化する移動も確率で許す
ただし、温度 T が高いときほど許しやすい。

悪化量 Δ (Δ > 0) の移動を受け入れる確率:

P(受入) = exp(−Δ / T)

最初は T が高くて「酔っ払い」みたいに自由に動く。 徐々に T を下げると、しだいにシラフに戻り、最後は完全な山登りになる。
これで「序盤に景観全体を把握 → 終盤に細部を磨く」が両立する。

反復回数 → T 高温: ふらふら歩く 低温: 山登り化 悪化量 Δ → P(受入) 1.0 0 高温: 緩やか 低温: 急峻
図 4.1 — SA: 温度が下がるにつれて、同じ Δ に対する受入確率が急峻になっていく。
def simulated_annealing(x, T0, T_min, alpha):
    best = x
    T = T0
    while T > T_min:
        x_new = random_neighbor(x)
        delta = f(x_new) - f(x)
        if delta < 0 or random() < exp(-delta / T):
            x = x_new
            if f(x) < f(best): best = x
        T *= alpha       # 幾何冷却
    return best

SA の使いどころ

  • 実装が 20 行で済む。新規問題の最初のメタヒューリスティクスとして優秀。
  • パラメータは 3 つだけ (T₀, T_min, α)。直感的に調整可能。
  • 近傍と差分計算さえあれば、どんな問題にも適用できる。
落とし穴

T₀ の決め方を雰囲気でやると、ほぼ確実にハマる。
「初期解からランダム移動 100 回」して平均 Δ を測り、 受入確率 50〜80% になるよう T₀ を逆算する、を必ずやる。

4.2 タブー探索 — メモ魔の決定論

迷子になったとき、地面に小石を置いていけば「同じ場所に戻ってない」のがわかる。
Glover (1989) は「最近やった操作を、しばらく禁止する」というアイデアを提案した。

アイデア

山登り法で局所最適に達したら、近傍で最も悪化の小さい解に移る。
それでは元に戻ってしまうので、「直近 t 回でやった操作の逆」を禁止する。
これで「悪化 → 逆戻り → ループ」を防げる。

def tabu_search(x, tabu_length, max_iter):
    best = x
    tabu = deque(maxlen=tabu_length)
    for _ in range(max_iter):
        candidates = [n for n in neighbors(x) if move(x, n) not in tabu]
        x_new = min(candidates, key=f)     # 悪化してもベスト候補を採用
        tabu.append(move(x, x_new))
        x = x_new
        if f(x) < f(best): best = x
    return best
現在解 (赤) の周りに、禁止された近傍 (灰色) と、行ける近傍 (実線) がある x タブー タブー 最良 (悪化していても採用)
図 4.2 — タブー探索の一手: 直近の動きの逆方向は禁止。残った候補から (たとえ悪化でも) ベストを選ぶ。

「アスピレーション基準」という妙技

「禁止だけど、もしそれを採用したら過去最高記録を更新するなら、特別に許可」。
これがアスピレーション基準 (aspiration criterion)。ルールに例外を持たせるエレガントな設計だ。

SA は確率で悪化を許す。
タブー探索は決定論で悪化を許す。
正反対のアプローチで同じ問題 (局所最適トラップ) を解いている。

4.3 反復局所探索 (ILS) — ちゃぶ台返し

プラモを組み立てていて、どうしても完成しない。
あるとき思い切って、半分壊して組み直す。
すると突然、すっと組める。

これが ILS (Iterated Local Search)。

  1. 局所探索で谷の底に達する
  2. 解をがっと壊す (摂動)
  3. そこからまた局所探索
  4. 改善したら採用、ダメなら捨てる
  5. 1 に戻る
解空間 f 初期解 局所最適 1 摂動 (ちゃぶ台返し) 局所最適 2 global ★
図 4.3 — ILS: 谷で固まったら、摂動で大ジャンプ → また谷に落とす。これを繰り返す。

ILS の核心は 「摂動の強さ」
弱すぎる → 同じ局所最適に戻る (意味なし)
強すぎる → ランダム再開と一緒 (せっかくの構造を捨てる)
ちょうどよく、**「現解の半分くらいは残す」**のがコツ。

TSP では「ダブルブリッジ」(4 本の辺を切って繋ぎ直す) が経験的に最強の摂動として知られている。 2-opt や 3-opt の局所最適から確実に逃げ出せる。

4.4 可変近傍探索 (VNS) — 望遠鏡を取り換える

近視の人がスーパーで欲しい商品を探すとき、まず近い棚を見て、なければ少し離れて見て、それでもなければ店内全体を見渡す。
これが VNS。

VNS (Variable Neighborhood Search) は複数の近傍 N₁, N₂, N₃ を用意し、 段階的に大きくして使う。

x N₁ (近い) N₂ (中) N₃ (広い) ① N₁ で局所探索 → 改善あれば継続 ② 改善なし → N₂ に広げる ③ ダメなら N₃ 改善が出たら N₁ に戻る →「局所最適は近傍に依存」
図 4.4 — VNS: N₁ の局所最適は N₂ では改善できるかもしれない、を利用。

ILS の摂動がランダムにかき乱すのに対し、VNS は近傍そのものを取り替える
似ているけど思想が違う。

4.5 GRASP — 毎日違うスタートで多数決

試験勉強で「最後の山かけ」をするとき、同じ範囲だけ繰り返し勉強しても点は上がらない。 違うアプローチを並列に試す方がいい。

GRASP (Greedy Randomized Adaptive Search Procedure) の発想はこう:

1. ランダム化貪欲で初期解を作る (毎回違う解) 2. 局所探索で磨く 3. これを 100 回繰り返して、最良を採用

キモは「ランダム化貪欲」。
普通の貪欲は最良の候補だけ取るが、GRASP は上位 α% からランダムに取る
だから毎回違う解が出る。

他の手法と違って、各反復が完全に独立なので並列化が爆速。 クラウドで 100 コア並べたら 100 倍速。

4.6 5 つの流派、横に並べる

流派悪化の許容記憶近傍性格
山登り (比較用)なしなし固定真面目で諦め早い
🌡 SA確率で許すなし固定序盤は酔っ払い、終盤はシラフ
📝 Tabu決定論的に許す短期+長期固定メモ魔、合理派
💢 ILS採用基準による最良解局所 + 摂動固まるとちゃぶ台返し
🔭 VNS採用基準による最良 + 近傍 idx複数切替視野を広げては戻る
🎲 GRASP(反復内では) なし最良解局所探索多数決で勝つ

4.7 で、どれを最初に試すべき?

新しい問題に向き合うとき、私 (筆者) なら次の順序で試す。

  1. まず CP-SAT で問題を書いてみる (第6章)。サイズが小さければそれで終わる。
  2. 解けないと分かったら、貪欲 + SA の粗い実装で基準線を作る (半日)。
  3. SA が頭打ちになったら、ALNS (第5章) に移行する。
  4. 本気を出すなら、CP-SAT × ALNS のハイブリッド。
忠告

「Whale Optimization」「Firefly Algorithm」「Salp Swarm」などの動物名アルゴリズム論文に出会っても、 すぐに飛びつかないこと。多くは PSO や SA の表面的な変種で、 ベンチマークも著者陣の身内同士の比較。
本物のチャンピオンは古典 (SA, Tabu, ILS, ALNS, LK) の改良の中にいる。

4.8 ここで一旦立ち止まる

5 つの流派は全部「解を 1 つ持って動かす」アプローチだ。
だが、別の発想もある。

解をたくさん持って、一斉に動かす」 → 集団型 (GA など)
解を大胆に壊して作り直す」 → LNS / ALNS

次の章でこの 2 系統に行く。特に ALNS は現代の主役、ぜひ味わってほしい。

4.9 この章の振り返り