計算の限界とNP完全 — 総当たりが爆発するとき
巧妙なアルゴリズムを積み上げてきましたが、世の中にはどう工夫しても速く解けそうにない問題があります。都市を1つ増やすだけで経路の数が桁違いに膨らむ巡回セールスマン、答えを見つけるのは絶望的なのに答え合わせは一瞬という不思議。P対NPという計算機科学最大の難問と、それでも実務を回す近似の知恵まで、爆発を目で見ながらたどります。
1. 総当たりの爆発 — 巡回セールスマン問題
巡回セールスマン問題(TSP):すべての都市をちょうど1回ずつ回って戻る、最短の巡回路を見つけよ。単純そのものですが、都市が n 個なら回り方は出発点を固定して (n−1)! / 2 通り。総当たりで最短を探すと、この数だけ経路長を計算することになります。
下のデモでスライダーを動かして都市を増やしてみてください。全経路を1本ずつ試す様子と、右上のカウンタが跳ね上がる速さを見れば、「総当たり」がいかに脆いかが体感できます。
2. 多項式と指数・階乗 — 成長の桁が違う
アルゴリズムの速さは「入力 n が増えたとき計算量がどう伸びるか」で分類します。O(n) や O(n²) のような多項式時間は、n が増えても伸び方が穏やか。対して O(2n) の指数時間や O(n!) の階乗時間は、ある一点から爆発します。
下のグラフは縦軸が対数(1目盛りで1000倍)であることに注意。それでも階乗と指数の曲線は画面を突き抜けます。スライダーで n を選ぶと、各アルゴリズムの計算回数と「毎秒10億回の計算機での所要時間」が出ます。多項式と指数の間には、埋めようのない壁があります。
3. P対NP — 見つけるのは大変、確かめるのは一瞬
ここで計算機科学最大の謎が現れます。部分和問題:与えられた数の中から、選んで足すとちょうど目標値になる組を見つけよ。見つけるには最悪 2n 通りの部分集合を総当たりするしかない。ところが、誰かに「この組だよ」と答えを渡されたら、足し算 n 回で正しさを確かめるのは一瞬です。
下のデモで「探す(総当たり)」と「確かめる」を切り替えてください。探すときのカウンタと、確かめるときの手数を比べると、この問題の非対称性がはっきり見えます。
4. あきらめずに近づく — 近似とヒューリスティック
厳密な最適解が指数時間なら、実務ではどうするか。答えは「最適はあきらめ、十分よい解を高速に得る」。TSPなら最近傍法:今いる都市から一番近い未訪問の都市へ進むのをくり返すだけ。O(n²) で一瞬に巡回路が1本引けます。
下で最近傍法が瞬時に引く経路と、総当たりで求めた真の最短を比べてください。最適ではないけれど、そう悪くもない——この「そこそこ」を保証つきで速く出すのが近似アルゴリズムの世界です。
5. まとめ — 限界を知って、賢くあきらめる
- 総当たりは (n−1)! や 2n で爆発する。多項式時間 P と指数・階乗時間の間には実務上埋められない壁がある。
- NP は「答えを検証するのは速いが、見つけるのは速いと分かっていない」問題のクラス。TSP・部分和・数独などが住む。
- P = NP かは未解決の大問題。多くの人は P ≠ NP(=速く解けない問題が本当にある)と信じているが、証明はない。
- 厳密解が非現実的でも、近似・ヒューリスティックで「十分よい解を高速に」得られる。限界を知ることが、賢い設計の第一歩。