算法設計與分析3 - 動態規劃解決四柱漢諾塔問題

三、四柱漢諾塔問題

3、四塔問題:設有ABCD四個柱子(有時稱塔),在A柱上有由小到大堆放的n個盤子,如圖所示。


今將A柱上的盤子移動到D柱上去。可以利用BC柱作爲工作棧用,移動的規則如下:
每次只能移動一個盤子。
在移動的過程中,小盤子只能放到大盤子的上面。

設計並實現一個求解四塔問題的動態規劃算法,並分析時間和空間複雜性。

 

  算法思想:

用如下算法移動盤子(記爲FourPegsHanoi):

1)、將A柱上n個盤子劃分爲上下兩部分,下方部分共有k(1kn)個盤子,上方部分共有n - k個盤子。

2)、將A柱上面部分n–k個盤子使用FourPegsHanoi算法經過CD柱移至B柱。

3)、將A柱剩餘的k個盤子使用ThreePegsHanoi算法經過C柱移至D柱。

4)、將B柱上的n–k個盤子使用FourPegsHanoi算法經過AC柱移至D柱。

 

ThreePegsHanoi算法如下(設三個柱子分別爲ABCA柱上共有k個盤子):

1)、將A柱上方k-1個盤子使用ThreePegsHanoi算法經過B柱移至C柱。

2)、將C柱上最後一個盤子直接移至C盤。

3)、將B柱上k-1個盤子使用ThreePegsHanoi算法經過A柱移至C柱。

 

 

 

  算法步驟:

根據動態規劃的四個步驟,求解如下:

1)、最優子結構性質:

   四柱漢諾塔問題的最優解是用最少的移動次數將A柱上的盤子全部移到D柱上。當盤子總數爲i時,我們不妨設使用FourPegsHanoi的最少移動次數爲f(i)。相應的ThreePegsHanoi 算法移動次數爲g(k),由於g(k)=2g(k-1)+1=2k -1,k確定時,g(k)也是不變的。

   f(i)爲最優解時,其子問題f(i-k)也必爲最優解。如果f(i-k)不是最優解,那麼存在f(i-k) < f(i-k)。用f(i-k)替換f(i-k)將產生一個比f(i)更優的解。這與f(i)爲最優解是矛盾的。所以本問題具有最優子結構性質。

 

2)、遞歸地定義問題的最優解:

根據上述FourPegsHanoi算法得到最少移動次數f(i):

3)、自底向上地計算最優解的值: (相應的Java源程序在Hanoi.java中。)

f(i)對應算法中的m[i , s[i]]

-----------------------------------------------------------------------------------------

求四柱漢諾塔最小移動次數僞代碼:

組下標從0開始,數組m,s大小爲n+1數組m存儲計算最小移動次數的中間值。數組s存儲每步最小移動次數所對應的分割值k

MinMovements ( n ):

      m[0,0] ← s[0] ← 0 ▹爲了方便計算增加了f(0) = m[0,s[0]] = 0   

      for i ← 1 to n

           do min ←

                 for k ← 1 to i

                      do m[i , k] ← 2 * m[i – k , s[i – k]] + 2k – 1

                            if m[i , k] < min

                                  then min ← m[i , k]

                                        s[i] = k

      return m[n , s[n]] & s

4)、根據計算信息構造最優解:

MinMovements求出的數組s中,s[i]f(i)所對應的最優分割位置。根據數組s來構造移動盤子的最佳序列,僞代碼如下:

-----------------------------------------------------------------------------------------

FourPegsHanoi (i , src, temp1, temp2, dest):

if i = 1

then move(src , dest)

else FourPegsHanoi(i – s[i] , src , temp2 , dest , temp1)

ThreePegsHanoi(s[i] , src , temp2 , dest)

                  FourPegsHanoi(i – s[i] , temp1 , src , temp2 , dest)

----------------------------------------------------------------------------------------

ThreePegsHanoi(k , src , temp, dest):

           if k = 1

then move(src , dest)

                 else ThreePegsHanoi(k - 1, src , dest , temp)

                        move(src , dest)

                        ThreePegsHanoi(k - 1, temp , src , dest)

-----------------------------------------------------------------------------------------

   時間空間複雜度分析:

1、時間複雜度

MinMovements算法的時間複雜度爲:

T(n) = 1 + 2 + ... + n = n(n+1)/2 = O(n2)

2、空間複雜度

MinMovements算法佔用的空間爲m s數組的大小:

(n+1)2 + (n+1) = O(n2)

通過分析m數組中記錄了一些與結果不相關的數據,所以通過對MinMovements進行改進,可使佔用空間減小爲O(n)

MinMovements ( n ):

      m[0] ← s[0] ← 0      

      for i ← 1 to n

           do m[i] ←

                 for k ← 1 to i

                      do q ← 2 * m[i – k] + 2k – 1

                            if q < m[i]

                                  then m[i] ← q

                                        s[i] ← k

      return m[n] & s


   算法測試

n=10時,最小移動次數49 移動序列如下:

1    A->D

2    A->B

3    A->C

4    B->C

5    D->C

6    A->B

7    A->D

8    B->D

9    A->B

 

10  D->A

11  D->B

12  A->B

13  C->A

14  C->D

15  C->B

16  D->B

17  A->B

18  A->C

19  A->D

 

20  C->D

21  A->C

22  D->A

23  D->C

24  A->C

25  A->D

26  C->D

27  C->A

28  D->A

29  C->D

 

30  A->C

31  A->D

32  C->D

33  B->C

34  B->D

35  B->A

36  D->A

37  C->A

38  B->D

39  B->C

40  D->C

41  B->D

42  C->B

43  C->D

44  B->D

45  A->B

46  A->C

47  A->D

48  C->D

49  B->D

 

n=15時,最小移動次數129。移動序列如下:

1    A->B

2    A->C

3    A->D

4    C->D

5    B->D

6    A->C

7    A->B

8    C->B

9    A->C

10  B->A

11  B->C

12  A->C

13  D->A

14  D->B

15  D->C

16  B->C

17  A->C

18  A->D

19  A->B

20  D->B

21  A->D

22  B->A

23  B->D

24  A->D

25  A->B

26  D->B

 

27  D->A

28  B->A

29  D->B

30  A->D

31  A->B

32  D->B

33  C->D

34  C->B

35  C->A

36  B->A

37  D->A

38  C->B

39  C->D

40  B->D

41  C->B

42  D->C

43  D->B

44  C->B

45  A->C

46  A->D

47  A->B

48  D->B

49  C->B

50  A->D

51  A->C

52  D->C

 

53  A->D

54  C->A

55  C->D

56  A->D

57  A->C

58  D->C

59  D->A

60  C->A

61  D->C

62  A->D

63  A->C

64  D->C

65  A->D

66  C->A

67  C->D

68  A->D

69  C->A

70  D->C

71  D->A

72  C->A

73  C->D

74  A->D

75  A->C

76  D->C

77  A->D

78  C->A

 

79  C->D

80  A->D

81  B->D

82  B->A

83  B->C

84  A->C

85  D->C

86  B->A

87  B->D

88  A->D

89  B->A

90  D->B

91  D->A

92  B->A

93  C->B

94  C->D

95  C->A

96  D->A

97  B->A

98  B->C

99  B->D

100C->D

101B->C

102D->B

103D->C

104B->C

 

105      B->D

106      C->D

107      C->B

108      D->B

109      C->D

110    B->C

111   B->D

112    C->D

113    A->C

114    A->D

115    A->B

116    D->B

117   C->B

118    A->D

119    A->C

120      D->C

121      A->D

122      C->A

123      C->D

124      A->D

125      B->A

126      B->C

127      B->D

128      C->D

129      A->D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章