Aritalab:Lecture/Algorithm/Towers of Hanoi

From Metabolomics.JP
< Aritalab:Lecture | Algorithm(Difference between revisions)
Jump to: navigation, search
m
Line 7: Line 7:
 
* 常に大きい方の円盤が下になるようにする。(移動の途中で円盤の大小を逆に積んではいけない。)
 
* 常に大きい方の円盤が下になるようにする。(移動の途中で円盤の大小を逆に積んではいけない。)
  
 +
===必要手数の解===
 
この問題を解くには漸化式(ぜんかしき)を使います。
 
この問題を解くには漸化式(ぜんかしき)を使います。
 
;解
 
;解
n (>0) 枚の円盤を移動する手数を T<sub>n</sub> と書きます。上から n-1 枚の円盤をまず B の棒に移し、一番大きい円盤を C に移してから、B にある n-1 枚をもう一度全て C に移せばよいので、以下の漸化式を得ます。
+
n (>0) 枚の円盤を移動する手数を T<sub>n</sub> と書きます。上から n - 1 枚の円盤をまず B の棒に移し、一番大きい円盤を C に移してから、B にある n - 1 枚をもう一度全て C に移せばよいので、以下の漸化式を得ます。
 
* T<sub>0</sub> = 0
 
* T<sub>0</sub> = 0
 
* T<sub>n+1</sub> = 2 T<sub>n</sub> + 1 (n > 0)
 
* T<sub>n+1</sub> = 2 T<sub>n</sub> + 1 (n > 0)
Line 18: Line 19:
 
* 3 枚の円盤があるとき T<sub>3</sub> = 3 * 2 + 1 = 7 回
 
* 3 枚の円盤があるとき T<sub>3</sub> = 3 * 2 + 1 = 7 回
 
の移動が必要なことを確認しましょう。
 
の移動が必要なことを確認しましょう。
ここでS<sub>n</sub> = T<sub>n</sub>/2<sup>n</sup>とおきます。
+
ここで手数を計算するテクニックとして S<sub>n</sub> = T<sub>n</sub>/2<sup>n</sup> とおきます。
  
 
* S<sub>0</sub> = 0
 
* S<sub>0</sub> = 0
Line 27: Line 28:
 
* 2 枚の円盤があるとき S<sub>2</sub> = 3 / 2<sup>2</sup> = 3/4
 
* 2 枚の円盤があるとき S<sub>2</sub> = 3 / 2<sup>2</sup> = 3/4
 
* 3 枚の円盤があるとき S<sub>3</sub> = 7 / 2<sup>3</sup> = 7/8
 
* 3 枚の円盤があるとき S<sub>3</sub> = 7 / 2<sup>3</sup> = 7/8
となっています。分母が分子よりも常に大きいので 1 より少し小さい数になっています。続けていくと、規則性がわかるでしょう。
+
となっています。分母が分子よりも常に大きいので 1 より少し小さい数です。続けていくと、規則性がわかります。
 
* 4 枚の円盤があるとき S<sub>4</sub> = 15 / 2<sup>4</sup> = 15/16
 
* 4 枚の円盤があるとき S<sub>4</sub> = 15 / 2<sup>4</sup> = 15/16
 
* 5 枚の円盤があるとき S<sub>5</sub> = 31 / 2<sup>5</sup> = 31/32
 
* 5 枚の円盤があるとき S<sub>5</sub> = 31 / 2<sup>5</sup> = 31/32
Line 36: Line 37:
 
:: = 2<sup>-1</sup>(1 - 2<sup>-n</sup>) / ( 1 - 1/2 ) = 1 - 2<sup>-n</sup>
 
:: = 2<sup>-1</sup>(1 - 2<sup>-n</sup>) / ( 1 - 1/2 ) = 1 - 2<sup>-n</sup>
  
従って T<sub>n</sub> = 2<sup>n</sup>S<sub>n</sub> = 2<sup>n</sup>-1 となります。
+
元々の漸化式との関係を使うと T<sub>n</sub> = 2<sup>n</sup>S<sub>n</sub> = 2<sup>n</sup>-1 となります。
 
上の円盤の動かし方をよくみても、これが円盤を動かすのに最低限必要な手数であることがわかります。
 
上の円盤の動かし方をよくみても、これが円盤を動かすのに最低限必要な手数であることがわかります。
 
つまりこの数より少ない回数で円盤を動かすことはできません。
 
つまりこの数より少ない回数で円盤を動かすことはできません。
Line 42: Line 43:
 
まとめると、 n 枚の円盤を動かすのに最低限必要な手数は 2<sup>n</sup>-1 、つまり n に対して指数的に増加していくことがわかりました。問題のサイズ (つまり n ) が大きくなると、かかる時間は急速に増えていきます。
 
まとめると、 n 枚の円盤を動かすのに最低限必要な手数は 2<sup>n</sup>-1 、つまり n に対して指数的に増加していくことがわかりました。問題のサイズ (つまり n ) が大きくなると、かかる時間は急速に増えていきます。
  
例えば 8 枚の円盤が棒にささっている場合、最短の手数で移動させても 2<sup>8</sup> - 1 = 255 手が必要だということです。面白半分に 20 枚の円盤が棒にささっているパズルを作ったら、最短の手数でも 1048576 手、1 秒に一枚動かしても 12 日以上かかります。ウェブ上で画像を検索すると、多くのパズルは7枚か8枚の円盤があるようです。枚数がこれ以上の場合挑戦しないほうが時間を有効に使えそうですね。
+
===教訓===
 +
パズルでも規模が大きくなると急速に(指数的に)時間を要する、つまり難しくなる問題があります。
 +
 
 +
ハノイの塔の場合、 8 枚の円盤が棒にささっていると最短の手数で移動させても 2<sup>8</sup> - 1 = 255 手が必要です。 20 枚の円盤が棒にささっている場合、最短の手数でも 1,048,576 手です。つまり 1 秒に一枚動かしても 12 日以上かかります。ウェブ上で画像を検索すると、多くのパズルは7枚か8枚の円盤があるようです。枚数がこれ以上の場合、挑戦しないほうが時間を有効に使えそうです。

Revision as of 12:52, 6 August 2015

ハノイの塔

(フランスの数学者 エドゥアール リュカ によるパズル, 1883)

TowersOfHanoi.jpg

台の上に3本の棒が固定されていて、一番左の棒をA、真ん中の棒をB、一番右の棒をCとします。Aにはn枚の円盤がはまっており、円盤は下へいくほど半径が大きくなっています。次のルールに従い、棒Bを利用して全ての円盤をAからCに移すとき、何回の移動が必要になるでしょうか。

  • 一回に一枚の円盤しか動かしてはいけない。
  • 常に大きい方の円盤が下になるようにする。(移動の途中で円盤の大小を逆に積んではいけない。)

必要手数の解

この問題を解くには漸化式(ぜんかしき)を使います。

n (>0) 枚の円盤を移動する手数を Tn と書きます。上から n - 1 枚の円盤をまず B の棒に移し、一番大きい円盤を C に移してから、B にある n - 1 枚をもう一度全て C に移せばよいので、以下の漸化式を得ます。

  • T0 = 0
  • Tn+1 = 2 Tn + 1 (n > 0)

実際に

  • 1 枚の円盤があるとき T1 = 1 回、
  • 2 枚の円盤があるとき T2 = 2 + 1 = 3 回、
  • 3 枚の円盤があるとき T3 = 3 * 2 + 1 = 7 回

の移動が必要なことを確認しましょう。 ここで手数を計算するテクニックとして Sn = Tn/2n とおきます。

  • S0 = 0
  • Sn+1 = Sn + 2-(n+1) (n > 0)

この式は

  • 1 枚の円盤があるとき S1 = 1 / 2
  • 2 枚の円盤があるとき S2 = 3 / 22 = 3/4
  • 3 枚の円盤があるとき S3 = 7 / 23 = 7/8

となっています。分母が分子よりも常に大きいので 1 より少し小さい数です。続けていくと、規則性がわかります。

  • 4 枚の円盤があるとき S4 = 15 / 24 = 15/16
  • 5 枚の円盤があるとき S5 = 31 / 25 = 31/32

分子は分母の数よりちょうど 1 だけ小さい数ですね。これを数学的に解くには等比数列の和の公式を利用します。

Sn = 2-1 + 2-2 + ... 2-n
= 2-1(1 + 1/2 + 1/4 + 1/8 ... 2-(n-1))
= 2-1(1 - 2-n) / ( 1 - 1/2 ) = 1 - 2-n

元々の漸化式との関係を使うと Tn = 2nSn = 2n-1 となります。 上の円盤の動かし方をよくみても、これが円盤を動かすのに最低限必要な手数であることがわかります。 つまりこの数より少ない回数で円盤を動かすことはできません。

まとめると、 n 枚の円盤を動かすのに最低限必要な手数は 2n-1 、つまり n に対して指数的に増加していくことがわかりました。問題のサイズ (つまり n ) が大きくなると、かかる時間は急速に増えていきます。

教訓

パズルでも規模が大きくなると急速に(指数的に)時間を要する、つまり難しくなる問題があります。

ハノイの塔の場合、 8 枚の円盤が棒にささっていると最短の手数で移動させても 28 - 1 = 255 手が必要です。 20 枚の円盤が棒にささっている場合、最短の手数でも 1,048,576 手です。つまり 1 秒に一枚動かしても 12 日以上かかります。ウェブ上で画像を検索すると、多くのパズルは7枚か8枚の円盤があるようです。枚数がこれ以上の場合、挑戦しないほうが時間を有効に使えそうです。

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox