具有值迭代的马尔可夫决策过程的动态规划

时间:2017-08-26 02:24:53

标签: algorithm reinforcement-learning markov-decision-process value-iteration

我正在自学中学习MDPvalue iteration,我希望有人可以提高我的理解。

考虑具有数字1, 2, 3的3面骰子的问题。如果您滚动12,则会在$中获得该值,但如果您滚动3,则会放弃所有资金并且游戏结束({{1} })

从概念上讲,我理解这是如何通过以下论坛来完成的:

enter image description here

所以让我们打破这个:

由于这是finite horizon problem问题,我们可以忽略finite horizon

如果我gamma,我可以observe 1go。其中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 2go

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)而滚动一个结束游戏,那将影响你的决定,因为实用程序已经改变。

但我不知道如何编写代码来计算它。

有人可以解释动态编程在这方面的作用吗?如果$3Q(1,g)符合自己的定义,该如何解决?

1 个答案:

答案 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

我很高兴这两种方法产生了相同的结果!