news 2026/3/23 19:42:32

强化学习Q-learning求最优策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强化学习Q-learning求最优策略

理论基础:

on policy:behavior policy=target policy

off policy:behavior policy!=target policy

注意:

behavior policy的初始化最好具有较强的随机性,就能尽可能遍历到所有的(s, a)pair。

强化学习的数据基础这种书中有不同的behavior policy导致的不同的探索路径的图:

代码可运行:

import numpy as np from env import GridWorldEnv from utils import drow_policy class Q_Learning(object): def __init__(self, env: GridWorldEnv, gamma=0.9, alpha=0.001, epsilon=0.1, samples=1, start_state=(0, 0),mode="on policy"): ''' :param env: 定义了网格的基础配置 :param gamma: discount rate :param alpha: learning rate :param samples: 从起点到终点采样的路径数 :param start_state: 起点 :param mode: 模式 ''' self.env = env self.action_space_size = self.env.num_actions # 上下左右原地 self.state_space_size = self.env.num_states self.reward_list = self.env.reward_list self.gamma = gamma self.samples = samples self.alpha = alpha self.epsilon = epsilon self.mode=mode self.start_state = self.env.state_id(start_state[0], start_state[1]) self.behavior_policy = np.ones( (self.state_space_size, self.action_space_size)) / self.action_space_size # 探索性很强 self.target_policy = np.zeros((self.state_space_size, self.action_space_size)) self.qvalues = np.zeros((self.state_space_size, self.action_space_size)) def update_qvalues(self,s_t,a_t,s_next,r_next): max_q_next = np.max(self.qvalues[s_next]) td_target = r_next + self.gamma * max_q_next td_error = td_target - self.qvalues[s_t][a_t] # 负号提出去 self.qvalues[s_t][a_t] += self.alpha * td_error def solve(self): if self.mode=="off policy": for _ in range(self.samples): s = self.start_state a = np.random.choice(self.action_space_size, p=self.behavior_policy[s]) episode = self.env.generate_episodes(self.behavior_policy, s, a) for i in range(len(episode)): s_t, a_t, r_next_t, s_next_t= episode[i] self.update_qvalues(s_t,a_t,s_next_t,r_next_t) # greedy best_a = np.argmax(self.qvalues[s_t]) self.target_policy[s_t] = np.eye(self.action_space_size)[best_a] elif self.mode=="on policy": # target_policy=behavior_policy for _ in range(self.samples): s = self.start_state while s not in self.env.terminal: a = np.random.choice(self.action_space_size, p=self.behavior_policy[s]) # generate at following πt(st) next_s, next_r, _ = self.env.step(s, a) # generate rt+1, st+1 by interacting with the environment # updata q-value for (s_t,a_t) # qt+1(st, at) = qt(st, at) − αt(st, at) [ qt(st, at) − (rt+1 + γ max(qt(st+1, a)))] self.update_qvalues(s,a,next_s,next_r) # update policy for s_t: epsilon greedy 因为要用policy生成数据,因此需要策略具有一定的探索性,因此使用epsilon greedy best_a = np.argmax(self.qvalues[s]) self.behavior_policy[s] = self.epsilon / self.action_space_size self.behavior_policy[s, best_a] += 1 - self.epsilon self.target_policy=self.behavior_policy s = next_s else: raise Exception("Invalid mode") if __name__ == '__main__': env = GridWorldEnv( size=5, forbidden=[(1, 2), (3, 3)], terminal=[(4, 4)], r_boundary=-1, r_other=-0.04, r_terminal=1, r_forbidden=-1, r_stay=-0.1 ) # 注意samples要大一点,否则每个state被访问到的概率很小 vi = Q_Learning(env=env, gamma=0.8, alpha=0.01, samples=1000, start_state=(0, 0),mode="off policy") vi.solve() print("\n state value: ") print(vi.qvalues) drow_policy(vi.target_policy, env)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 1:49:30

pip遇到依赖冲突警告时候的排查办法

使用pip安装的时候遇到了以下的依赖冲突问题,解决流程记录一下,相似的过程可以进行排查: (hello-agent) tipriestUranus:~/Documents/hello-agents/code/chapter15/Helloagents-AI-Town/backend (main*) $ pip install -r requirements.txt Collecting …

作者头像 李华
网站建设 2026/3/23 15:34:05

Linux 线程(1)

1.线程概念线程是进程内的最小执行单元,一个进程可以包含多个线程,所有线程共享进程的资源(内存、文件句柄等),但有自己独立的执行栈和程序计数器。结合进程的核心区别可以这样理解:进程是资源分配的基本单…

作者头像 李华
网站建设 2026/3/20 16:49:59

医疗AI辅助诊断小程序:藏在便捷背后的技术底气

不用跑医院排队,打开手机小程序,上传症状描述或检查影像,几秒就能拿到AI辅助诊断建议——如今这样的医疗体验越来越常见。很多人觉得“好用”就够了,却不知道这些便捷背后,藏着好几项关键技术的支撑。作为深耕医疗数字…

作者头像 李华
网站建设 2026/3/19 11:16:42

mac 安装brew实战应用案例分享

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个mac 安装brew实战项目,包含完整的功能实现和部署方案。点击项目生成按钮,等待项目生成完整后预览效果 作为一名长期使用Mac进行开发的程序员&#x…

作者头像 李华
网站建设 2026/3/19 10:31:02

电商大屏:ResizeObserver实战案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个电商数据可视化仪表盘demo,使用ResizeObserver实现以下功能:1) 响应式图表自动重绘(ECharts实例resize) 2) 画布元素动态缩放 3) 字体大小自适应 4)…

作者头像 李华