在了解MDP
的问题时,我遇到了value iteration
问题。从概念上讲这个例子很简单,是有道理的:了解马尔可夫决策过程的值迭代算法
如果你有一个6
面的骰子,你滚4
或5
或6
您保持$
这一数额,但如果你滚1
或2
或3
你放弃你的资金并结束游戏。
在开始的时候,你有这么$0
滚动,而不是滚动的选择是:
k = 1
If I roll : 1/6*0 + 1/6*0 + 1/6*0 + 1/6*4 + 1/6*5 + 1/6*6 = 2.5
I I don't roll : 0
since 2.5 > 0 I should roll
k = 2:
If I roll and get a 4:
If I roll again: 4 + 1/6*(-4) + 1/6*(-4) + 1/6*(-4) + 1/6*4 + 1/6*5 + 1/6*6 = 4.5
If I don't roll: 4
since 4.5 is greater than 4 I should roll
If I roll and get a 5:
If I roll again: 5 + 1/6*(-5) + 1/6*(-5) + 1/6*(-5) + 1/6*4 + 1/6*5 + 1/6*6 = 5
If I don't roll: 5
Since the difference is 0 I should not roll
If I roll and get a 6:
If I roll again: 6 + 1/6*(-6) + 1/6*(-5) + 1/6*(-5) + 1/6*4 + 1/6*5 + 1/6*6 = 5.5
If I don't roll: 6
Since the difference is -0.5 I should not roll
我有被转换到这Python代码什么麻烦。不是因为我对python不太好,但也许我对pseudocode的理解是错误的。尽管Bellman equation确实对我有意义。
我borrowed
为value iteration
的Berkley代码,并将其修改为:
isBadSide = [1,1,1,0,0,0]
def R(s):
if isBadSide[s-1]:
return -s
return s
def T(s, a, N):
return [(1./N, s)]
def value_iteration(N, epsilon=0.001):
"Solving an MDP by value iteration. [Fig. 17.4]"
U1 = dict([(s, 0) for s in range(1, N+1)])
while True:
U = U1.copy()
delta = 0
for s in range(1, N+1):
U1[s] = R(s) + max([sum([p * U[s1] for (p, s1) in T(s, a, N)])
for a in ('s', 'g',)])
delta = max(delta, abs(U1[s] - U[s]))
if delta < epsilon:
return U
print(value_iteration(6))
# {1: -1.199845679, 2: -2.3996913580246915, 3: -3.599537037037037, 4: 4.799382716049383, 5: 5.999228395061729, 6: 7.199074074074074}
这是错误的答案。这段代码中的错误在哪里?或者,这是我对算法的理解问题?
几个问题。 1)如果我滚动'5; 5; 5; 1',奖励是“10”还是“0”? 2)因为一旦我滚动'1',游戏就结束了,转换概率并不完全相等,对吗? 'P(1,6)= P(1,1)= 0'。 – Anton
我明白你的观点。我想到的方式是,如果我滚动'1'我放松了钱,所以奖励是'-10',对吧?并且'P(1,1)'是'1/6'。任何数字着陆的概率是'1/6'的权利? –
我明白你在说'P(1,1)'。一旦你登上'1',游戏结束,所以没有更多的转换概率 –