策略迭代 二維狀態網格實現

2021-09-24 13:08:22 字數 3575 閱讀 7724

#參考:

#encoding:utf-8

#!/usr/bin/env python3

import random

#狀態states=[0,1,2,3,4,5]

#動作actions=["a", "b"]

# 獎勵的折扣因子

gama=0.9

""" 狀態值 v_value

v_value="""

v_value={}

for state in states:

v_value[state]=0

# 動作值 ("1", "a"):0

q_value={}

#狀態轉移

def p_state_reward(state, action):

# 輸入當前狀態,及行為

# return 跳轉概率,下一狀態, 獎勵

if state==0:

if action=="a":

return (0, 0, 0)

else:

return (0, 2, 0)

if state==1:

if action=="a":

return (1/2, 0, 1)

else:

return (1/2, 2, 0)

if state==2:

if action=="a":

return (1/2, 1, 0)

else:

return (1/2, 3, 0)

if state==3:

if action=="a":

return (1/2, 2, 0)

else:

return (1/2, 4, 0)

if state==4:

if action=="a":

return (1/2, 3, 0)

else:

return (1/2, 5, 5)

if state==5:

if action=="a":

return (0, 5, 0)

else:

return (0, 5, 0)

# q_value 初始值

"""q_value="""

def q_value_fun():

q_value.clear()

for state in states:

for action in actions:

psr=p_state_reward(state, action)

temp=0

temp+=psr[0]*(psr[2]+gama*v_value[psr[1]])

#for t in p_state_reward(state, action):總報錯

#temp+=t[0]*(t[2]+gama*v_value[t[1]])

q_value[(state, action)]=temp

#q_value初始化

q_value_fun()

#策略 pi 初始化 "1":

pi={}

for state in states:

temp={}

for action in actions:

temp[action]=1.0/len(actions)

pi[state]=temp

#print(v_value)

#print(pi)

#print(q_value)

#策略評估 得出 v_value 值

def policy_evalue():

global v_value

v_value_new = {}

def v_update():

nonlocal v_value_new

v_value_new = {}

for state in states:

temp = 0

for action, p in pi[state].items():

temp += p * q_value[(state, action)]

v_value_new[state] = temp

# print("v_value: "+str(v_value))

# print("v_value_new: "+str(v_value_new))

#迭代停止條件

def stop_judge():

flag=true

for state, value in v_value.items():

if abs(v_value_new[state]-value)>0.0001:

flag=false

return flag

# 計算 v_value_new

v_update()

while stop_judge()!=true:

# 更新 v_value

v_value=v_value_new

# 更新 q_value

q_value_fun()

# 再次迭代 計算v_value_new

v_update()

#策略改進 max

def policy_improve():

flag=true

for state in states:

#l=#for action in actions:

#action=max(l)[-1]

action=max((q_value[state, action], action) for action in actions)[-1]

for k in pi[state]:

if k==action:

if pi[state][k]!=1.0:

pi[state][k]=1.0

flag=false

else:

pi[state][k]=0.0

return flag

if __name__=="__main__":

"""policy_evalue()

print("*"*30)

print(v_value)

print("*"*30)

print(q_value)

print("*"*30)

print(pi)

"""policy_evalue()

flag = policy_improve()

i = 1

while flag != true:

i += 1

policy_evalue()

flag = policy_improve()

#print("*" * 30 + "\n")

print("總共執行次數:" + str(i) + "\n")

print("狀態值為:")

print(v_value)

print("")

print("狀態行為值為:")

print(q_value)

print("策略為:")

print(pi)

二維網格遷移

給你乙個 n 行 m 列的二維網格 grid 和乙個整數 k。你需要將 grid 遷移 k 次。每次 遷移 操作將會引發下述活動 輸入 grid 1,2,3 4,5,6 7,8,9 k 1 輸出 9,1,2 3,4,5 6,7,8 輸入 grid 3,8,1,9 19,7,2,5 4,6,11,10...

Grid 網格二維布局 筆記

首先,你必須使用 display grid 將容器元素定義為乙個 grid 網格 布局,使用 grid template columns 和 grid template rows 設定 列 和 行 的尺寸大小,然後通過 grid column 和 grid row 將其子元素放入這個 grid 網格...

二維瓦片網格邊界檢測

二維瓦片網格邊界檢測 1.每個網格只考慮enws四個相鄰格仔 四個相鄰格仔ensw編號為0 3 2.當前方向d 0 3 如果當前格仔是上乙個格仔選擇的ensw 0 3 中的乙個,則這個選擇就是當前方向 3.選擇下乙個的策略 按找以下優先順序判斷 d 3 4,d 4 4,d 5 4,d 6 4 第一優...