RL實踐1 動態規劃值迭代

2022-07-25 02:00:13 字數 3493 閱讀 3362

參考自葉強《強化學習》第三講,方格世界—— 使用 動態規劃 求解隨機策略

動態規劃的使用條件時mdp已知,在簡單遊戲中,這個條件時顯然成立的

使用value iteration的方法求解每個狀態的價值函式,迭代收斂之後,對應最優策略生成。

注意:動態規劃和強化學習都用的價值函式,區別在於

從方格狀態走到終止狀態(灰色標記)

值得注意的是,知乎原版的注釋是錯誤的,採用的是同步更新

有三個trick可以加快運算速度(對於大規模問題)

prioritised sweeping:state的影響力排序

real-time dp:遍歷過的才更新

# 狀態集合

states = [i for i in range(16)]

# 價值集合

values = [0 for _ in range(16)]

# 動作集:

actions = ["n", "e", "s", "w"]

# 動作字典:

ds_actions =

# 衰減率

gamma = 1.00

# 定義mdp

def nextstate(s, a):

next_state = s

if (s%4 == 0 and a == "w") or (s<4 and a == "n") or \

((s+1)%4 == 0 and a == "e") or (s > 11 and a == "s"):

pass

else:

ds = ds_actions[a]

next_state = s + ds

return next_state

# 定義獎勵

def rewardof(s):

return 0 if s in [0, 15] else -1

# 判斷是否結束

def isterminatestate(s):

return s in [0, 15]

# 獲取所有可能的next state 集合

def getsuccessors(s):

successors =

if isterminatestate(s):

return successors

for a in actions:

next_state = nextstate(s, a)

# if s != next_state:

return successors

# 更新當前位置的價值函式

def updatevalue(s):

sucessors = getsuccessors(s)

newvalue = 0 # values[s]

num = 4 # len(successors)

reward = rewardof(s)

for next_state in sucessors:

newvalue += 1.00 / num * (reward + gamma * values[next_state])

return newvalue

# 列印所有狀態對應價值函式

def printvalue(v):

for i in range(16):

print(''.format(v[i]), end=" ")

if (i + 1) % 4 == 0:

print("")

print()

# 一次迭代

# 這裡採用的是同步更新,不是非同步更新。建立了newvalues陣列,遍歷過states後,統一更新global values

def performoneiteration():

newvalues = [0 for _ in range(16)]

for s in states:

newvalues[s] = updatevalue(s)

global values

values = newvalues

printvalue(values)

# 主函式

def main():

max_iterate_times = 160

cur_iterate_times = 0

while cur_iterate_times <= max_iterate_times:

print("iterate no.".format(cur_iterate_times))

performoneiteration()

cur_iterate_times += 1

printvalue(values)

if __name__ == '__main__':

main()

iterate no.0

0.00 -1.00 -1.00 -1.00

-1.00 -1.00 -1.00 -1.00

-1.00 -1.00 -1.00 -1.00

-1.00 -1.00 -1.00 0.00

iterate no.1

0.00 -1.75 -2.00 -2.00

-1.75 -2.00 -2.00 -2.00

-2.00 -2.00 -2.00 -1.75

-2.00 -2.00 -1.75 0.00

...iterate no.158

0.00 -14.00 -20.00 -22.00

-14.00 -18.00 -20.00 -20.00

-20.00 -20.00 -18.00 -14.00

-22.00 -20.00 -14.00 0.00

iterate no.159

0.00 -14.00 -20.00 -22.00

-14.00 -18.00 -20.00 -20.00

-20.00 -20.00 -18.00 -14.00

-22.00 -20.00 -14.00 0.00

iterate no.160

0.00 -14.00 -20.00 -22.00

-14.00 -18.00 -20.00 -20.00

-20.00 -20.00 -18.00 -14.00

-22.00 -20.00 -14.00 0.00

0.00 -14.00 -20.00 -22.00

-14.00 -18.00 -20.00 -20.00

-20.00 -20.00 -18.00 -14.00

-22.00 -20.00 -14.00 0.00

動態規劃 迭代與遞迴

遞迴 好像相對高明,但其實效率而言遞迴並不是最佳方案。迭代 貌似複雜,其實效能更高效。分而治之 所謂動態規劃 就是通過遞迴,找出問題本質,並且給出乙個初步的解之後,再將其等效的轉換為迭代的形式。兩個栗子 1.斐波那契數列 青蛙跳台階 2.最長公共子串行 對序列a 0,n b 0,m lcs a,b ...

DP動態規劃 遞迴迭代

在刷leetcode的時候,因為對dp和遞迴不是很熟,對兩者界限也很模糊。所以看了一些概念以後來寫乙個日記 這是一類問題的定義,解決這類問題的核心在於找到遞推公式 f x f x 1 g n 得到遞推公式之後,如何計算遞推公式存在兩種方法 自頂向下和自底向上 自頂向下 能採用遞迴實現 int fib...

動態規劃1

維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...