河内塔 - 贝尔曼方程解

时间:2016-03-17 07:01:59

标签: algorithm towers-of-hanoi

我必须使用Bellman动态编程实现一种算法,该算法使用有限数量的移动(例如4个吊舱,10个环,50个移动)来解决河内塔式游戏的k pod和d环方程式(如果问题当然可以解决)。

现在,我理解了等式背后的逻辑:

Bellman equation - discrete time

其中V ^ T是时间T的目标函数,a ^ 0是时间0的动作,x ^ 0是起始配置,H_0是累积增益f(x ^ 0,a ^ 0)= x ^ 1。

状态空间的基数是$ k ^ d $,我得到一个状态的良好表示是基数k中的数字:d数字可以从0到k-1。每个数字代表一个环,数字可以从0到k-1,即k环的标签。

我希望尽量减少从初始配置(第一个吊舱上的10个振铃)到最后一个配置(最后一个吊舱上的10个振铃)的移动次数。

我不能得到的是:我如何编写目标函数?

2 个答案:

答案 0 :(得分:1)

您需要做的第一件事是选择一个奖励函数H_t(s,a)来定义您的目标。选择此函数后,将定义(最佳)值函数,您只需计算它即可。

Bellman方程的动态规划思想是你应该自下而上计算V_t(s):从t = T开始,然后t = T-1,依此类推,直到t = 0。

最初的案例简单地由:

V_T(s) = 0, ∀s

您可以从V_T计算V_ {T-1}(x)∀x:

V_{T-1}(x) = max_a [ H_{T-1}(x,a) ]

然后你可以从V_ {T-1}计算V_ {T-2}(x)∀s:

V_{T-2}(x) = max_a [ H_{T-2}(x,a) + V_{T-1}(f(x,a)) ]

你继续从V_ {t}计算V_ {t-1}(x)∀s:

V_{t-1}(x) = max_a [ H_{t-1}(x,a) + V_{t}(f(x,a)) ]

直到你达到V_0。

给出了算法:

forall x:
  V[T](x) ← 0
for t from T-1 to 0:
  forall x:
    V[t](x) ← max_a { H[t](x,a) + V[t-1](f(x,a)) }

答案 1 :(得分:0)

实际上要求的是:

def k_hanoi(npods,nrings):
    if  nrings == 1 and npods > 1: #one remaining ring: just one move 
        return 1
    if npods == 3:
        return 2**nrings - 1 #optimal solution with 3 pods take 2^d -1 moves
    if npods > 3 and nrings > 0:
        sol = []
        for pivot in xrange(1, nrings): #loop on all possible pivots
            sol.append(2*k_hanoi(npods, pivot)+k_hanoi(npods-1, nrings-pivot))
        return min(sol) #minimization on pivot


k = 4
d = 10

print k_hanoi(k, d)

我认为它是Frame算法,在枢轴上进行优化,选择将磁盘划分为两个子组。我还认为有人证明这对于4个钉子来说是最佳的(在2014年或类似的东西?不确定顺便说一句)并且猜测是超过4个钉子的最佳选择。移动数量的限制可以很容易地实现。

在这种情况下,值函数是从初始配置到结束配置所需的步骤数,需要将其最小化。谢谢大家的贡献。