我必须使用Bellman动态编程实现一种算法,该算法使用有限数量的移动(例如4个吊舱,10个环,50个移动)来解决河内塔式游戏的k pod和d环方程式(如果问题当然可以解决)。
现在,我理解了等式背后的逻辑:
其中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个振铃)的移动次数。
我不能得到的是:我如何编写目标函数?
答案 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个钉子的最佳选择。移动数量的限制可以很容易地实现。
在这种情况下,值函数是从初始配置到结束配置所需的步骤数,需要将其最小化。谢谢大家的贡献。