欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 24/8/15算法笔记 项目练习冰湖

24/8/15算法笔记 项目练习冰湖

2024/10/25 2:26:51 来源:https://blog.csdn.net/yyyy2711/article/details/141231591  浏览:    关键词:24/8/15算法笔记 项目练习冰湖
import gym
from matplotlib import pyplot as plt
%matplotlib inline
import os
os.environ['SDL_VIDEODRIVER']='dummy'
#设置环境变量 SDL_VIDEODRIVER='dummy' 是在使用基于 SDL (Simple DirectMedia Layer) 的应用程序时,告诉应用程序不使用任何视频驱动程序。这通常用于无头环境(headless environment)或自动化脚本,其中不需要图形界面。
#创建环境
#is_slippery控制会不会滑
#map_name决定地图的尺寸,还可以取8X8
#desc决定地形
env = gym.make('FrozenLake-v1',is_slippery=False,map_name='4X4',desc=['SFFF','FHFH','FFFH','HFFG'])
env.reset()   #用于重置环境状态到其初始状态的方法,并准备开始一个新的周期(episode)。#解封装才能访问状态转移矩阵p
env.env.unwrapped#打印游戏
def show():plt.imshow(env.render(mode='rgb_array'))plt.show()

游戏信息

#查看冰湖这个游戏的状态列表
#一共4*4=16个状态
#每个状态下都可以执行4个动作
#每个动作执行完,都有概率得到3个结果
#(0.333333333333,0,0.0,False)这个数据结构表示(概率,下个状态,奖励,是否结束)
len(env.P),env.P[0]

初始化values和pi

import numpy as np#初始化每个格子的价值
values = np.zeros(16)#初始化每个格子下采用动作的概率
pi = np.ones([16,4])*0.25#两个算法都是可以的
algorithm = '策略迭代'
algorithm = '价值迭代'values,pi

Q函数

#计算qsa
def get_qsa(state,action):value = 0.0#每个动作都会有三个不同的结果,这里要按概率把他们加权求和for prop,next_state,reward,over in env.P[state][action]:#计算下个状态的分数,取values当中记录的分数,再打个折扣next_value = values[next_state]*0.9#如果下个状态是终点或者陷阱,则下个状态的分数是0if over:next_value = 0#动作的分数就是reward,和下个状态的分数相加就是最终分数next_value+=reward#因为下个状态是概率出现了,所以这里要乘以概率next_value*=propvalue+=next_valuereturn value
get_qsa(0,0)
#策略评估
def get_values():#初始化一个新的values,重新评估所有格子的分数new_values = np.zeros([16])#遍历所有格子for state in range(16):#计算当前格子4个动作分别的分数action_value = np.zeros(4)#遍历所有动作for action in range(4):action_value[action] = get_qsa(state,action)if algorithm =='策略迭代':#每个动作的分数和它的概率相乘action_value*=pi[state]#最后这个格子的分数,等于该格子下所有动作的分数求和new_values[state] = action_value.sum()if algorithm=='价值迭代':#求每一个格子的分数,等于该格子下所有动作的最大分数new_values[state] = action_value.max()return new_values
get_values()

#策略提升算法
def get_pi():#重新初始化每个格子下采用动作的概率,重新评估new_pi = np.zeros([16,4])#遍历所有格子for state in range(16):#计算当前格子4个动作分别的分数action_value = np.zeros(4)#遍历所有动作for action in range(4):action_value[action] = get_qsa(state,action)#计算当前state下,达到最大分数的动作有几个count = (action_value ==action_value.max()).sum()#让这些动作均分概率for action in range(4):if action_value[action] ==action_value.max():new_pi[state,action] = 1/countelse:new_pi[state,action] = 0return new_pi
#循环迭代策略评估和策略提升,寻找最优解
for _ in range(10):for _ in range(100):values = get_values()pi = get_pi()
values,pi

#打印每个格子的策略
def print_pi():#遍历所有格子for row in range(4):line=' 'for col in range(4):state = row*4+colif(row==1 and col==1)or(row==1 and col==3)or(row ==2 and col ==2)or(row ==3 and col==0):line+='O'continueif row==3 and col==3:line+='*'continueline+='上下左右'[pi[state].argmax()]print(line)print_pi()

测试函数

from IPython import display
import timedef play():env.reset()#起点在0index= 0#最多玩N步for i in range(200):#选择一个动作action =np.random.choice(np.arange(4),size= 1,p=pi[index])[0]#执行动作index,reward,terminated,truncated,_=env.step(action)#打印动画display.clear_output(wait=True)time.sleep(1)show()#获取当前状态,如果状态时终点或者陷阱则终止if terminated or truncated:breakprint(i)
play()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com