seegongsik
アルゴリズム

わかりやすく 近似アルゴリズム とは

前のレッスンで見たように、ある問題は場合の数が爆発するので、完璧な答えを最後まで調べると一生かかります。では、あきらめるしかないのでしょうか。そうとは限りません。完璧な答えは出せなくても、「十分によい答え」ならすぐに出せることが多いのです。少し損をして、時間を大きくかせぐわけです。

01

完璧はいったん置いておく

難しい問題があります。完璧な答えを見つけるにはすべての場合を調べなければならず、その数はとほうもありません。
最後まで行けば、たしかにいちばんよい答えは出ます。でも、それはいつ終わるのでしょうか。
押して数えてみましょう。

1
2
2
3
4
5
6
7
入力の大きさ: 1 - 調べる場合の数: 2
まだ数えられます。

完璧な答えを最後まで調べるとこうなります。(場合の数がふくらんで時間が爆発 → 終わりが見えない)

数があまりにも速くふくらみます。少し増えるだけで、調べることが何倍にもなります。
だから完璧な答えを最後まで待つのは、現実的でないこともあります。だからといって、手をこまねいているわけにもいきません。

02

十分によい答えを、速く

ここで一つの考えがあります。必ずしも最高でなくてもかまわないとしたら、どうでしょう。
完璧をねらうかわりに、さっと「そこそこよい答え」を出してみるのです。貪欲でやったように、目の前のよいものをてきぱき選んでいきながら。

ざっくりした答え
あっという間
?
完璧な答え
かなりかかる
?

速いざっくりした答え vs 完璧な答え。(ざっくりした答えはあっという間 · 差はわずか)

ざっくりした答えはあっという間に出たのに、完璧な答えとあまり差がありません。
少し足りないけれど、十分使えます。多くの場合、これで十分です。

03

どれくらいよいかを保証する

でも、一つ心配があります。「そこそこよい答え」を信じてよいのでしょうか。もしとても悪い答えだったらどうしましょう。
そこで賢い方法は、約束もいっしょに出します。「この答えは、最高よりそれほど悪くはならない」という約束です。

最適
150
保証線(最適の1.5倍)

最適の1.5倍以内を保証します。(どんな答えが出てもこの線の内側 → 最悪がふさがれている)

これが本当にすばらしいところです。「最適の1.5倍以内」のように線を引いておけば、答えがどんなに悪くても、その線を越えられません。
完璧ではなくても、どれだけ足りなくなりうるかを私たちは正確に知っています。ばくぜんとした推測とはまったく違います。

04

正確さと時間を交換する

結局、これはてんびんです。時間を多く使えば答えはより正確になり、時間を節約すれば答えは少し粗くなります。
どちらがよいとは一概に言えません。急ぐなら速いほう、精密さが必要なら正確なほうです。
ボタンで時間を増やしたり減らしたりして、二つのあいだを選んでみましょう。

使った時間45%
正確さ89%
時間と正確さをほどよく合わせました。

時間を多く使えばより正確に、少なく使えばより粗く。(どこで止めるかは私たちが選ぶ)

このてんびんは、アルゴリズム全体を貫く心です。速い道と正確な道、簡単な道と念入りな道。
私たちは毎回、何を手放して何を得るかを選んできました。よい方法を知るとは、このてんびんをうまく読むことです。

05

ここまで来た道

長い道を歩いてきました。順番どおりに解くことから始めて、並べ、探し、コストを測り、分け、つなぎ、選びました。
本当に難しい問題があることも、それでも十分によい答えがあることも見ました。
押して、その道を一度に振り返りましょう。

この領域がくれたものを順に押してまとめます

この領域がくれた四つのものを順にまとめます。(よい方法 · 速さ · 戦略 · 限界を知って折り合う)

すべての問題を完璧に解くことはできません。でも、それは無力だという意味ではありません。
速い方法と賢い戦略を使い、限界を知って上手に折り合えば、難しい問題を前にしても使える答えを手にできます。
それが、アルゴリズムが私たちにくれる力です。

一言でいうと完璧な答えをすぐに出せない難しい問題でも、「十分によい答え」ならすぐに出せることが多いのです。さらに一歩進んで、その答えが「最適の何%以内」だと保証してくれる方法もあります。正確さを少し手放して、時間を得る折り合いです。時間を多く使えばより正確に、少なく使えばより粗くなり、どこで止めるかは私たちが選びます。これでこの領域全体のしめくくりです。すべての問題を完璧に解くことはできませんが、速い方法と賢い戦略で、限界を知って上手に折り合えば、難しい問題を前にしても使える答えを手にできます。
← アルゴリズム
このページがお役に立ったなら支援する