[英]How to build Markov Decision Processes model in Python for string data?
[英]Understanding The Value Iteration Algorithm of Markov Decision Processes
在了解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不好,但也许我对伪代码的理解是错误的。 尽管贝尔曼方程对我有意义。
我borrowed
Berkley代码进行value iteration
并将其修改为:
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.1998456790123457, 2: -2.3996913580246915, 3: -3.599537037037037, 4: 4.799382716049383, 5: 5.999228395061729, 6: 7.199074074074074}
这是错误的答案。 这段代码中的错误在哪里? 或者这是我对算法的理解问题?
设B
为您当前的余额。
如果您选择滚动,预期奖励为2.5 - B * 0.5
。
如果您选择不滚动,则预期奖励为0
。
所以,政策是:如果B < 5
,滚动。 否则,不要。
遵循该政策时每一步的预期回报是V = max(0, 2.5 - B * 0.5)
。
现在,如果你想用贝尔曼方程表达它,你需要将平衡结合到状态中。
让状态<Balance, GameIsOver>
由当前余额和定义游戏是否结束的标志组成。
stop
:
<B, false>
转换为<B, true>
roll
:
<B, false>
转换为<0, true>
,概率为1/2
<B, false>
变为<B + 4, false>
,概率为1/6
<B, false>
变为<B + 5, false>
,概率为1/6
<B, false>
变为<B + 6, false>
,概率为1/6
<B1, true>
转换为<B2, false>
使用此处的符号:
π(<B, false>) = "roll", if B < 5
π(<B, false>) = "stop", if B >= 5
V(<B, false>) = 2.5 - B * 0.5, if B < 5
V(<B, false>) = 0, if B >= 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.