5.コンピュータ・アルゴリズムと黄金比について


アルゴリズム(algorithm)というのは算法と訳されていますが,解法への手順ということです。黄金比はアルゴリズムの世界の中でも重要な役割を果たしています。 ここではその2つの例、 を紹介します。

5−1 探索アルゴリズムにおける黄金分割

(1)探索とは何か

「探索」というのは、文字通り何かを探すことですが、そのときの手法は、暗中模索から高度なデータ処理を含む方法まで、千差万別ですが、コンピュータアルゴリズムにおける「探索」とは何かを規定しましょう。

たとえば、英語の単語「algorithm」を辞書で調べるとしましょう。このとき、まず「a」はアルファベットの最初だから、辞書の最初の方のページp1を開いてみます。そのページp1が、たとえば「b」ならば、それより前に在るはずです。次にその範囲内の適当なページp2を開けるでしょう。そしてそのページが、たとえば「ac・・」であれば、「algorithm」は、p1とp2の間に在るはずです。このように目標の単語に向かって、ページの範囲を絞り込んでいき、ついには目標と単語を見つけることができます。

この例のように、「探索」とは、ある区間内の目標物を、いくつかの情報を頼りに区間を縮小しながら、絞り込んでいく手法です。この手法は様々な方法が考案されていて、探す状況によって使い分けられています。ここでは、その手法の基本的なアルゴリズムとして、2分法と黄金分割法を紹介しましょう。


(2)2分法

2分法は私たちにとって最も馴染み深い方法でしょう。
2分法とは、区間を丁度半分に分けたとき、目標物がそのどちらに属するかが判断できるとき、その範囲をさらに半分にしていく、これを繰り返す方法です。この方法のポイントは「目標物がそのどちらに属するかが判断できるとき」に大変有効な方法であり、しかも大変単純な方法です。上記の辞書も2分法に近い方法です。正確に言うと、2分法と感覚的比例配分の併用です。

では、次の例で2分法を体感してみて下さい。

【例1】「2次関数の最小点(最小値を与える点)を2分法で探す。」
[0,1]区間内に2次関数の最小値(頂点)があるとします。私たちはもちろん2次関数の式は分かっていません。任意の点の関数値のみが入手できるとします。できる限り少ない回数で、最小点を含む区間をできる限り縮小したいわけです。 次のシミュレータでは、区間が縮小されていく過程を体験できます。

「2分法」による探索アルゴリズム体感シミュレータ

 「概要」
  2次関数y=(x−a)^2の最小点 a を2分法によって探索する過程を観察する。
  a(0<a<1)の値は、乱数によりその都度変更される。

 「操作方法」
  @[start]ボタンを押すと、乱数により a が決定され、グラフが表示される。
  A[next]ボタンを押すと、区間が縮小される様子を逐次表示する。


(3) 黄金分割法

この方法は、「目標物がそのどちらに属するかが判断できないとき」に有効な方法です。例えば,「太平洋の何処が一番深いか」を探るとします。ただし、東京とロサンジェルスを結ぶ大圏航路上の点であることと、海底地形の極小値は一カ所のみ(単峰性)であるとします。このとき、たとえば真ん中の点で深さを測ったとして、その日本側に最深点があるのか、アメリカ側に最深点があるのかは判断できません。このような場合、少なくとも区間内の2点で深さを測ることが必要です。

下図をみてください。
区間AB内の2点C,Dで深さ(下図の場合、関数値)を測定したとします。

赤と青の2点で測定したとき、赤の方が小さいとします。このとき、最小値の可能性は、上手のように2つありますが、いずれの場合も、その最小点は区間CB内に在ります。従って、区間をABからCBに縮小して、その区間内の2点で同様に測定します。このとき、赤の点を2点のうちの一つに選んだ方が、測定の回数を節約できますね。
この考え方による区間縮小法が、黄金分割法の根底にある考え方です。 黄金分割法は、この2点を黄金比1:(1+√5)/2と(1+√5)/2:1という内分点を利用する方法です。この方法は、測定回数が限られているとき、最も小さい区間に縮小できる方法であることが証明されています。

「黄金分割法」による探索アルゴリズム体感シミュレータ

 「概要」
  2次関数y=(x−a)^2の最小点 a を黄金分割法によって探索する過程を観察する。
  a(0<a<1)の値は、乱数によりその都度変更される。

 「操作方法」
  @[start]ボタンを押すと、乱数により a が決定され、グラフが表示される。
  A[next]ボタンを押すと、区間が縮小される様子を逐次表示する。


5−2 ゲームの中のフィボナッチ数列(必勝アルゴリズム)

「2.フィボナッチ数列と黄金比の関係」で見てきたように、黄金比とフィボナッチ数列は密接な関係がありました。そこで、そのフィボナッチ数列が潜むゲームを紹介しましょう。 そのゲームの名前は「一山崩し」と呼ばれています。

ゲームのルールは次の通りです。

「一山崩し」のルール
・n個の玉がある。2人が交互に玉を取り合って、最後に取り尽くした方が勝ちである。
・一番最初は、好きな数だけ玉を取ってもよいが、すべての玉を取ることはできない。
・各段階で、一つ前に相手が取った玉の数の2倍まで取ることができる。
このゲームを簡単な例でやってみましょう。


  • 最初の玉の数を5個とします。

  • A,Bふたりが取り合いますが、
    Aが先手とします。


  • 「2個取ると、Bは1〜4個まで取れるので、
    3個取り尽くしてしまい、Bの勝ちになる。
    だから、1個取ろう。」


  • 「Aが1個取ったから、1〜2個まで取れので、
    2個取ろう。
    (この考えは、浅はかですね)


  • 「Bが2個取ったから、1〜4個まで取れる。
    2個しか残ってないので、
    2個取れば勝ちだ。」

さて、このゲームの必勝法は何でしょうか。
この例の場合、実はBが次のように取れば必ず勝てます。

このように、ある法則で取っていくと必ず勝てる必勝法があります。その方法を見つけて下さい。ヒントは、フィボナッチ数列上の数をうまく使うことです。

下に、あなたとコンピュータが対戦する「一山崩しゲーム」がありますので、挑戦して腕を磨いてみてください。

「一山崩し」ゲーム

「概要」
あなたとコンピュータが、交互に玉を取り合います。
全部取り尽くした方が勝ちです。
相手が直前に取った玉の数の2倍まで、取ることができます。
あなたが先手です。

「操作方法」
@[reset]枠内に数字を入力し、最初の玉の数を決める。(2から100まで、あらかじめ100となっている)
A[You]欄の枠内に、あなたが取る玉の数を入力する。
Bコンピュータがすぐに取る。(コンピュータが取った玉が灰色の玉となるとともに、その数が [Computer]欄に I take ** と表示される)
C順次取り合う。(現在の玉の数が大きい数字で表示されている)

※もう一度対戦するには、[replay]を押す。

【注意】
枠内に数字を入力するには、マウスで枠内を左クリックすると、カーソル|が枠内に表示されるので、キーボードから数字を入力し、エンターキーを押す。[reset]枠の不要な数字を消すのは、[delete]キーで消すか、その数字をマウスでなぞって反転させてから、数字を上書きして入力する。


以上,「黄金比のいろいろ」は終わりです。楽しめましたか! 


メニューに戻る