參考自葉強《強化學習》第三講,方格世界—— 使用 動態規劃 求解隨機策略
動態規劃的使用條件時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
維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...