クラスでは、値の反復とマルコフ決定問題について学んでいます。私たちはUC Berkley pac-manプロジェクトを通じて行っているので、そのための値イテレーターを作成しようとしています。すべての州を訪問し、最終的な状態に追跡してその値を取得します。
pythonで試してみると、再帰的な深さの超過が発生するので、私は正しくないと感じています。そのため、疑似コードに戻り、Vk[s]
があります。とVk-1[s']
は、状態の値とnewState
の値を意味すると考えていましたが、何か不足しているに違いありません。
では、k
とk-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]| < θ
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
疑似コードは再帰的ではないことに注意してください。これは、それを効率的にする価値反復/動的プログラミングのアイデアです:
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のコピーを保持するとします)。