news 2026/8/8 8:34:24

强化学习蒙特卡洛策略迭代方法求最优策略的代码实现(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强化学习蒙特卡洛策略迭代方法求最优策略的代码实现(一)

基本思想:

MC_basic.py

注意:由于使用贪心策略,因此不支持stochastic策略。

from collections import defaultdict import numpy as np from env import GridWorldEnv from utils import drow_policy class MonteCarloPolicyIteration(object): def __init__(self, env: GridWorldEnv, gamma=0.9, samples=1): self.env = env self.action_space_size = self.env.num_actions # 上下左右原地 self.reward_space_size = self.env.reward_space_size # 执行每个动作的reward self.state_space_size = self.env.num_states self.reward_list = self.env.reward_list self.gamma = gamma self.samples=samples self.policy = np.zeros((self.state_space_size, self.action_space_size)) self.policy[:,0]=1.0 # 初始动作都是向上 self.action_value = np.zeros((self.state_space_size, self.action_space_size, self.samples)) # action value q(s,a) self.state_value= np.zeros((self.env.size,self.env.size)) def solve(self, iterations=20): for i in range(iterations): for s in range(self.state_space_size): for a in range(self.action_space_size): for k in range(self.samples): # 从(s,a)出发,遵循策略policy采样若干个episodes,并获得return的平均值 episodes = self.generate_episodes(s, a) returns = self.compute_returns(episodes) self.action_value[s,a,k]=returns qvalues = self.action_value.mean(axis=2) # k次采样的平均值 shape: [state_size, 5] best_a = np.argmax(qvalues, axis=1) # 每个state使得平均return最大的action index shape: [state_size] for s in range(self.state_space_size): if s in self.env.terminal: self.policy[s] = np.eye(self.action_space_size)[4] continue else: a_star = best_a[s] # 当前状态 s 的最优动作 index self.policy[s] = np.eye(self.action_space_size)[a_star] self.state_value = np.sum(self.policy * qvalues, axis=1).reshape(self.env.size,self.env.size) def generate_episodes(self, start_state, start_action, max_steps=200): ''' :param start_state: 当前状态的state_id :param start_action: 当前动作 :return: [(state_id, action,reward),(...)] ''' episode = [] state = start_state action = start_action for _ in range(max_steps): next_state, reward, done = self.env.step(state, action) episode.append((state, action, reward)) if done: break state = next_state action = np.random.choice(self.action_space_size, p=self.policy[state]) # 从[0,action_space_size)随机选一个,每个action的概率为policy[state] return episode def compute_returns(self, episodes): ''' :param episodes: 一条轨迹 [(state_id, action,reward),(...)] :return: 一条轨迹的累计return ''' G = 0 for (_, _, r) in reversed(episodes): G = r + self.gamma * G # 最后一步->第一步 return G if __name__ == '__main__': # transition_prob = { # "forward": 0.8, # "left": 0.05, # "right": 0.15 # } env = GridWorldEnv( size=5, forbidden=[(1, 2),(2,4)], terminal=[(4, 4)], r_boundary=-10, r_other=0, r_terminal=1, r_forbidden=-1 ) vi = MonteCarloPolicyIteration(env=env, gamma=0.9) vi.solve(iterations=20) print("\n state value: ") print(vi.state_value) print("\n 策略 π(s):") print(vi.policy) drow_policy(vi.policy, env)

env.py修改地方:

1. self.terminal和self.forbidden存储termina和forbiddenl对应的state_id,而不是传入的list。修改后要修改其他是用到self.terminal和self.forbidden的地方。

self.terminal = {self.state_id(x, y) for (x, y) in terminal} self.forbidden = {self.state_id(x, y) for (x, y) in forbidden} def build_reward_list(self): reward = set() reward.add(self.r_forbidden) reward.add(self.r_other) reward.add(self.r_terminal) reward.add(self.r_boundary) self.reward_list = sorted(list(reward)) self.reward_space_size = len(self.reward_list)

2. 分别为边界、其他、forbidden、terminal设置reward,而不是使用传入的list列表。

def __init__(self, size: int, terminal, forbidden, r_forbidden=-1, r_other=0, r_terminal=1, r_boundary=-1, transition_prob=None): ... self.r_forbidden = r_forbidden self.r_other = r_other self.r_terminal = r_terminal self.r_boundary = r_boundary ...

3. 新增step方法。

def step(self, state, action): ''' :param action: 当前所在的state_id :param action: 当前采取的动作 :return: state,reward,done 到达的下一个状态的state_id,获取的奖励,是否走到了终点 ''' if state in self.terminal: return state, self.r_terminal, True i, j = divmod(state, self.size) moves = { 0: (-1, 0), # 上 1: (0, 1), # 右 2: (1, 0), # 下 3: (0, -1), # 左 4: (0, 0) # 原地 } di, dj = moves[action] ni, nj = i + di, j + dj if not (0 <= ni < self.size and 0 <= nj < self.size): next_state = self.state_id(i,j) else: next_state = self.state_id(ni,nj) reward = self.reward_func(state, next_state, action) done = next_state in self.terminal return next_state, reward, done

相同配置下,policy iteration, value iteration与MC PI运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 0:29:21

SGLang结构化生成语言:重塑大模型工具调用的新范式

SGLang结构化生成语言&#xff1a;重塑大模型工具调用的新范式 【免费下载链接】sglang SGLang is a structured generation language designed for large language models (LLMs). It makes your interaction with models faster and more controllable. 项目地址: https://…

作者头像 李华
网站建设 2026/8/7 11:38:28

Windows Insider免登录终极指南:轻松获取预览版更新

Windows Insider免登录终极指南&#xff1a;轻松获取预览版更新 【免费下载链接】offlineinsiderenroll 项目地址: https://gitcode.com/gh_mirrors/of/offlineinsiderenroll 想要体验最新Windows功能却不想注册Microsoft账户&#xff1f;OfflineInsiderEnroll脚本为您…

作者头像 李华
网站建设 2026/8/7 22:28:26

FluidNC运动控制固件:重新定义ESP32 CNC设备的智能控制

FluidNC运动控制固件&#xff1a;重新定义ESP32 CNC设备的智能控制 【免费下载链接】FluidNC The next generation of motion control firmware 项目地址: https://gitcode.com/gh_mirrors/fl/FluidNC FluidNC作为新一代开源运动控制固件&#xff0c;专为ESP32控制器深度…

作者头像 李华
网站建设 2026/8/7 22:26:48

【光照】Unity[PBR]环境光中的[漫反射]

漫反射辐照的核心作用漫反射辐照&#xff08;Diffuse Irradiance&#xff09;在URP PBR中用于模拟环境光对物体表面的均匀散射效果&#xff0c;通过预计算环境立方体贴图的低频光照信息&#xff0c;为动态物体提供间接漫反射光照。其核心公式为&#xff1a;$L_d\frac{c}{\pi}\i…

作者头像 李华
网站建设 2026/8/8 8:23:25

39、NFS与网络路由管理:配置、问题诊断及参数调优

NFS与网络路由管理:配置、问题诊断及参数调优 1. 网络路由配置 1.1 关闭IP转发 在系统启动时,如果存在 /etc/notrouter 文件,系统将不会执行IP转发。若想立即关闭IP转发,可执行以下命令: # touch /etc/notrouter # /usr/sbin/ndd -set /dev/ip ip_forwarding 01.2 …

作者头像 李华
网站建设 2026/8/7 7:09:50

CentOS7 磁盘扩容

1.在vm虚拟机中添加一个新的磁盘 在vm虚拟机中添加一个磁盘这里我添加了一个10GB的磁盘 2.对于磁盘进行分区 我们先运行 lsblk来查看我们刚刚新添加磁盘的代号可以看到我这里添加的新磁盘是sdf那么我们现在进行分区&#xff1a; fdisk /dev/sdf然后我们按n开始分区&#xff1a;…

作者头像 李华