🎓 レベル:標準 | 重要度:B(標準)
要点(BLUF)
- タブー探索は 「改善が無くても常に最良の近傍へ動き続け、直近に訪れた解をタブー(禁止)にする」 記憶ベースの探索。
- タブーリストが 来た道を塞ぐので、局所最適から押し出され、同じ場所を堂々巡りしない。
- 焼きなまし(焼きなまし法)が確率で脱出するのに対し、タブー探索は 決定論的な記憶で脱出する。
概念 ── 「来た道を禁じる」
山登り(局所探索と近傍)は局所最適で止まる。焼きなまし(焼きなまし法)は確率で抜ける。タブー探索(Glover)は第3の道 ── 常に近傍の最良へ動く(悪化も受け入れる)が、最近訪れた解を「タブーリスト」に入れて一定期間禁止する。
局所最適に来ても、そこから最良の隣(=少し悪化する隣)へ強制的に動き、その動きをタブーにする。すると元の局所最適へ戻れず、坂を登り切って別の谷へ抜けられる。記憶(短期メモリ)が、確率の代わりに脱出を生む。
graph TD
A["現在解"] --> B["近傍を全部評価"]
B --> C["タブーでない最良の隣を選ぶ (悪化も可)"]
C --> D["そこへ移動し タブーリストに追加"]
D --> E{"タブーリスト満杯?"}
E -->|"はい"| F["最古のタブーを解除"]
F --> B
E -->|"いいえ"| B
主要素
- タブーリスト(短期記憶):直近 手(または属性)を禁止。長さ が探索の粘りを決める。
- アスピレーション基準:タブーでも「これまでの最良を更新する手」なら例外的に許す。
- 多様化・集中化(長期記憶):未探索領域へ飛ばす/良い領域を深掘りする戦略を足す版もある。
Pythonで脱出を確認
山登りが で止まる初期点(局所探索と近傍 の )から、タブー探索を走らせる。タブー探索は乱数を使わず 決定論的(同じ初期点なら同じ結果)。
import numpy as np
xs = np.linspace(-15, 15, 601)
def f(x): return 0.1*x**2 + 2*np.sin(x)
fvals = f(xs)
def tabu_search(start_idx, tabu_len=20, steps=500, nbhd=4):
i = start_idx
best_i = i
tabu = [i]
for step in range(steps):
# 近傍(前後nbhd)で、タブーでない最良の隣を選ぶ(悪化も許す)
cands = [j for j in range(i-nbhd, i+nbhd+1)
if 0 <= j < len(xs) and j != i and j not in tabu]
if not cands:
tabu = tabu[-(tabu_len//2):] # 行き詰まったらタブーを一部解除
continue
i = min(cands, key=lambda k: fvals[k]) # タブー外の最良へ移動
tabu.append(i)
if len(tabu) > tabu_len:
tabu.pop(0) # 最古のタブーを解除
if fvals[i] < fvals[best_i]:
best_i = i # 最良解を記録
return best_i
print(f"参照(全探索)最小: x={xs[np.argmin(fvals)]:.3f}, f={fvals.min():.4f}")
r = tabu_search(60)
print(f"タブー探索(初期x=-12): x={xs[r]:+.3f}, f={fvals[r]:.4f}")
実行結果:
参照(全探索)最小: x=-1.450, f=-1.7752
タブー探索(初期x=-12): x=-1.450, f=-1.7752
山登りなら で止まる初期点から、タブーリストが「来た道」を塞ぐことで局所最適を抜け、大域最適 に到達。乱数なしで脱出できるのがタブー探索の特徴で、再現性が高い。
焼きなまし vs タブー探索
| 焼きなまし法 | タブー探索 | |
|---|---|---|
| 脱出の仕組み | 確率的に悪化を受理 | 記憶で来た道を禁止 |
| 乱数 | 必須(確率) | 基本は決定論的 |
| 主パラメータ | 温度・冷却スケジュール | タブーリスト長・近傍 |
| 近傍の見方 | ランダムに1つ | 全近傍を評価し最良 |
| 向く問題 | 連続・大きな探索空間 | 組合せ(スケジューリング等) |
数式の直観的意味
タブー探索の核心は「探索の軌跡そのものを状態に持つ」こと。山登りや SA が現在解だけを見る 記憶なし(マルコフ的) なのに対し、タブー探索は直近の履歴を記憶し、それを使って探索を制御する 非マルコフ的な手法。局所最適に来たとき、SA は「サイコロを振って運良く登る」が、タブー探索は「最良の隣(=最も浅い登り)へ確実に進み、戻り道を塞ぐ」。これは盆地の縁を確実に乗り越える効率的な戦術で、特に組合せ問題(ジョブショップ・配車)で強い。タブーリスト長は「どれだけ過去を覚えるか」で、短いと堂々巡り、長いと自由度を失う ── このメモリ長の調整が、探索の粘り強さを決める。
⚠️ よくある誤解・落とし穴
- タブーリストが短すぎると堂々巡り(局所最適の周りを循環)、長すぎると良い手まで禁じて停滞。
- アスピレーション基準を忘れない:最良更新する手はタブーでも許さないと、良い解を取り逃す。
- 「解」全体をタブーにすると重い:実務は「手の属性」(交換した2要素など)をタブーにする。
- 決定論的なので初期解依存が残る。多スタートや長期記憶(多様化)で補う。
関連ノート
- 前提:局所探索と近傍
- 確率で脱出する対:焼きなまし法
- 集団で探索:遺伝的アルゴリズム
- 適用(スケジューリング):スケジューリング・配送のモデル化
- 章のハブ:メタヒューリスティクス 章目次