我正在自学中学习MDP
和value iteration
,我希望有人可以提高我的理解。
考虑具有数字1, 2, 3
的3面骰子的问题。如果您滚动1
或2
,则会在$
中获得该值,但如果您滚动3
,则会放弃所有资金并且游戏结束({{1} })
从概念上讲,我理解这是如何通过以下论坛来完成的:
所以让我们打破这个:
由于这是finite horizon problem
问题,我们可以忽略finite horizon
。
如果我gamma
,我可以observe 1
或go
。其中stop
是:
utility/value
我V(1) = max(Q(1, g), Q(1, s))
Q(1, g) = r + SUM( P( 2 | 1,g) * V(2) + P( 3 | 1,g) * V(3))
Q(1, s) = r + SUM( P( 2 | 1,s) * V(2) + P( 3 | 1,s) * V(3))
where r = 1
,我可以observe 2
或go
:
stop
我观察3,比赛结束。
直觉V(2) = max(Q(2, g), Q(2, s))
Q(2, g) = r + SUM( P( 1 | 2,g) * V(1) + P( 3 | 1,g) * V(3))
Q(2, s) = r + SUM( P( 1 | 2,s) * V(1) + P( 3 | 1,s) * V(3))
where r = 2
是V(3)
,因为游戏结束了,所以我们可以从0
等式中移除那一半。我们上面也定义了Q(1, g)
,因此我们可以将其替换为:
V(2)
事情发生了变化。如果Q(1, g) = r + SUM( P( 2 | 1,g) *
MAX ((P( 1 | 2,g) * V(1)) , (P( 1 | 2,s) * V(1))))
在解决方案中有自己的定义,我不知道如何解决。这可能是由于数学背景不佳。
我所理解的是,公用事业或州的价值将根据奖励而改变,因此决定将会改变。
具体来说,如果滚动三个给你Q(1, g)
而滚动一个结束游戏,那将影响你的决定,因为实用程序已经改变。
但我不知道如何编写代码来计算它。
有人可以解释动态编程在这方面的作用吗?如果$3
或Q(1,g)
符合自己的定义,该如何解决?
答案 0 :(得分:3)
特殊解决方案:
对于你的例子,很容易知道是应该选择“去”还是“停止”:有一个货币价值X
无论你是“去”还是“停止”它都是一样的“,对于所有较小的值,你应该”去“,对于所有更大的值,你应该停止。所以唯一的问题是,这个价值是什么:
X=E("stop"|X)=E("go"|X)=1/3(1+X)+1/3(2+x) =>
1/3X=1 =>
X=3
已经在第一行,我使用了即使我选择“go”并获胜,我会选择在下一轮停止。因此,知道应该做出什么样的决定,很容易用完美的策略来计算预期的胜利,这里是python:
def calc(money):
PROB=1.0/3.0
if money<3:#go
return PROB*calc(money+1)+PROB*calc(money+2)-PROB*0
else:#stop
return money
print "Expected win:", calc(0)
>>> Expected win: 1.37037037037
一般解决方案:
我不确定上述行动方案可以针对任意情况进行推广。但是,还有另一种可能性来解决这些问题。
让我们稍微改变一下游戏:不再有无限次转动,但最多只有N
转。然后你的递归变成:
E(money, N)=max(money, 1/3*E(money+1, N-1)+1/3*E(money+1, N-1))
您可以很容易地看到值E(money, N)
不再依赖于自身,而是取决于转弯次数较少的游戏的结果。
没有证据,我说,你要找的价值是E(money)=lim_{N->infinity} E(money, N)
。
对于你的特殊问题,python代码如下所示:
PROB=1.0/3.0
MAX_GOS=20#neglect all possibilities with more than 1000 decisions "GO"
LENGTH=2*MAX_GOS+1#per go 2$ are possible
#What is expected value if the game ended now?
expected=range(LENGTH)
for gos_left in range(1,MAX_GOS+1):
next=[0]*len(expected)
for money in range(LENGTH-gos_left*2):
next[money]=max(expected[money], PROB*expected[money+1]+PROB*expected[money+2])#decision stop or go
expected=next
print "Expected win:", expected[0]
>>> Expected win: 1.37037037037
我很高兴这两种方法产生了相同的结果!