web-dev-qa-db-ja.com

値の反復がわかりません

クラスでは、値の反復とマルコフ決定問題について学んでいます。私たちはUC Berkley pac-manプロジェクトを通じて行っているので、そのための値イテレーターを作成しようとしています。すべての州を訪問し、最終的な状態に追跡してその値を取得します。

pythonで試してみると、再帰的な深さの超過が発生するので、私は正しくないと感じています。そのため、疑似コードに戻り、Vk[s]があります。とVk-1[s']は、状態の値とnewStateの値を意味すると考えていましたが、何か不足しているに違いありません。

では、kk-1の意味は何ですか?

私のコード:

 def val(i, state):
        if mdp.isTerminal(state) or i == 0:
            return 0.0
        actionCost = {}
        for action in mdp.getPossibleActions(state):
            actionCost[action] = 0
            for (nextState, probability) in mdp.getTransitionStatesAndProbs(state, action):
                reward = mdp.getReward(state, action, nextState)
                actionCost[action] += probability * reward + discount * val(i - 1, nextState)        
        return actionCost[max(actionCost, key=actionCost.get)]

    for i in range(iterations):
        for state in mdp.getStates():  
            self.values[state] = val(i, state)

疑似コード:

k ←0 
repeat
      k ←k+1 
      for each state s do 
          Vk[s] = maxa ∑s' P(s'|s,a) (R(s,a,s')+ γVk-1[s']) 
until ∀s |Vk[s]-Vk-1[s]| < θ
1
EasilyBaffled

VkとVk-1は、Vの近似の異なる反復です。疑似コードを次のように書き直すことができます。

V ← 0
V' ← 0
while true
  for each state s do
      V ← V'
      V = maxa ∑s' [ P(s'|s,a) R(s,a,s')+ γV'[s'] ]
  if ∀s |V[s]-V'[s]| < θ
      return V

疑似コードは再帰的ではないことに注意してください。これは、それを効率的にする価値反復/動的プログラミングのアイデアです:

  • 0タイムステップの最適値関数を計算:V0 = 0
  • then 1タイムステップの最適値関数を計算:V1 = H(V0)
  • then 2つのタイムステップの最適値関数を計算:V2 = H(V1)
  • then 3つのタイムステップの最適値関数を計算:V3 = H(V2)
  • ...
  • then nタイムステップの最適値関数を計算:Vn = H(Vn-1)

hを次のように定義:

 H(V) = max_a ( Pa [ Ra + γ V ] )

あなたのコードは再帰的(valはvalを呼び出します)で、スタックオーバーフローエラーを引き起こします。値の反復は再帰的ではなく反復的です。あなたの「評価」関数はこれを行います:

actionCost[action] += probability * reward + discount * val(i - 1, nextState)

これは、前の反復(k-1)ですでに計算した値を再帰的に再計算します。 val(i-1、nextState)は実際には次のとおりです。

 self.previous_values[nextState]

(previousValueのコピーを保持するとします)。

2
ysdx