强化学习--策略迭代如何解决01背包问题?内附代码

news/2024/11/20 2:32:31/文章来源:https://www.cnblogs.com/tylerw/p/18555969

背景

看Sutton的Reinforcement learning: An introduction,里面将策略迭代作为一种基于动态规划的方法。

书中举了个grid world的例子,非常符合书中的数学原理,有状态转移概率,每个时间步就是每个state等.....

动态规划作为一个常见的面试八股,经常出现于笔试题中,一般都是利用价值-动作表来去解决。

网上查了查,貌似目前全网所有的策略迭代的例子都是grid world这个例子,虽然很清晰,但是受限于这个问题框架,不舒服。

那么有意思的问题来了:如何使用策略迭代(Policy Iteration)解决01背包(knapsack 01)问题?

一、策略迭代

1、策略评估

给定策略\(\pi\),计算其价值函数,即为策略评估,有时也称其为预测问题。

根据贝尔曼方程:\(v_{\pi}(s) = \sum_{a}{\pi(a \mid s) \sum_{s', r}{P(s',r \mid s,a)(r + \gamma v_{\pi}(s'))}}\) 不断迭代,直至收敛,具体的伪代码算法如下:

2、策略改进

求解最优的策略和价值函数,即为策略改进,有时也称其为控制问题。

策略改进定理:如果对于任意 \(s \in S\)\(q_{\pi}(s, \pi'(s)) \geq v_{\pi}(s)\),那么策略 \(\pi'\) 不会比策略 \(\pi\) 差(一样好或者更好)。

构造一个贪心策略来满足策略改进定理:
\( q_{\pi}(s, a) = \sum_{s', r} P(s', r \mid s, a) \left[ r + \gamma v_{\pi}(s') \right] \)
\( \pi'(s) = \arg\max_{a} q_{\pi}(s, a) \)
可知通过执行这种贪心算法,我们就可以得到一个更好的策略。

3、策略迭代算法流程

二、策略迭代代码解决01背包问题

根据我调试的经验,解决01背包问题要比解决完全背包问题更加麻烦一点。

问题在于:01背包问题中每一个物品只能拿取一次,而完全背包可以多次重复拿取。
GitHub仓库中是代码,因为顺手打开的matlab就用matlab实现了,改一下语法就是python。

https://github.com/Tylerr77/Policy-Iteration-Solving-01-Knapsack-Problem?tab=GPL-3.0-1-ov-file

% 0/1 背包问题的策略迭代
clc;
clear;
%% 输入
w = [2, 3, 4, 5, 6, 7, 8]; % 物品的重量
r = [3, 1, 5, 6, 7, 8, 9]; % 物品的价值,奖励max_W = 9; % 背包容量n = length(w); % 物品数量P = 1; % 因为选取下一个物品是固定的,所以状态转换的概率是1gama = 1; % 衰减因子% 初始化策略
policies = randi([0, n],1, max_W + 1) % 策略数组,数值表示某状态时放入物品的index,0表示不选择% 初始化价值函数
% 代表V(s),也就是V的index代表了每个状态下所能得到的最大价值,
% V(s)表示 背包容量为s - 1 状态时的价值函数(matlab索引从1开始)
V = zeros(1, max_W + 1)  % 背包容量从 0 到 W,每个容量的最大价值初始化为 0% 策略迭代过程
while true% 步骤 1:策略评估% 使用当前策略计算每个状态的价值函数disp('策略评估');V_new = V; % 用于存储更新后的价值函数% 根据贝尔曼方程计算所有状态s的状态值函数% 迭代的方式进行策略评估,直到价值函数收敛while truef = 0;for s = 2:(max_W + 1)% ------------不同环境这段代码不同-------------- %% 评估当前策略下,s状态下的V(s)if policies(s) ~= 0 && w(policies(s)) <= s - 1V_new(s) = P * (r(policies(s)) + gama * V(s - w(policies(s))));elseV_new(s) = V_new(s - 1);end% --------------------------------------------- %f = max(f, abs(V_new(s) - V(s)));endif f < 1e-6break;elseV = V_new;endend% 步骤 2:策略改进% 根据当前值函数 V,选择每个状态下的最优动作disp('策略改进');policy_new = policies;policy_new(1) = 0; % s = 1背包没有空间,策略一定是不选择value_q = zeros(max_W + 1, n + 1); % q(s, a) 状态-动作对价值函数for s = 2:(max_W + 1)for a = 2:n + 1 % a = 1代表什么都不放,= 2放1号物品,= 3放2号物品....% ------------不同环境这段代码不同-------------- %% 01背包,物品仅仅可以被选中一次,但是什么都不放可以多次选中% 计算动作价值函数store = s; flag = 0;while store - w(a - 1) >= 1if policy_new(store - w(a - 1)) == a - 1flag = 1;break;endstore = store - w(a - 1);endif flag ~= 1 && w(a - 1) <= s - 1value_q(s, a) = r(a - 1) + V(s - w(a - 1));else % 什么都不放,或者放不进去,则继承上一个状态的价值,价值为value_q(s - 1)value_q(s, a) = value_q(s, a - 1);end% --------------------------------------------- %end[max_q, max_act] = max(value_q(s,:));policy_new(s) = max_act - 1;end% 如果策略没有变化,表示已经收敛if all(policy_new == policies)disp('策略已收敛');break;else% 更新策略policies = policy_new;endend% 输出最终策略和最大价值
disp('最优策略:');
disp(policies); % 输出最优策略 pi(s, a)
disp('最大价值:');
disp(V(max_W + 1)); % 输出最大价值,背包容量为 W 时的最大值
weight = max_W + 1;
while weight ~= 0 && policies(weight) ~= 0fprintf('物品 %d: 重量 = %d, 价值 = %d\n', ...policies(weight), w(policies(weight)), r(policies(weight)));weight = weight - w(policies(weight));
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837104.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 学习笔记(一)-Redis 安装

一、Redis简介 (1)什么是Redis ​ Redis 是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。在企业开发中, 主要用于做数据库、缓…

交互式备忘单: 汇集了各种有用的安全工具

这份工具包是一个交互式备忘单,汇集了各种有用的安全工具,主要用于渗透测试或红队练习。这些工具来自于Github仓库和其他公开来源。以下是工具列表及其分类: AD:用于Active Directory安全的工具。 BinaryExp:用于二进制漏洞利用/入侵的工具。 Blue:用于蓝队操作和防御的工…

29. 使用MySQL之数据库维护

1. 备份数据 像所有数据一样,MySQL的数据也必须经常备份。由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据。但是,由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效。 下面列出这个问题的可能解决方案。使用命令行实用程序…

QT实现组合键监测

QT实现快捷键监测,完成某些组合键功能参考于:Qt 获取组合键 键盘按住某键 鼠标组合实现 - Andy5020 - 博客园MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QWidget::installEventFilter(this); }bool MainW…

GitLab快速上手指南上篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.gitlab的基本配置1 登录gitlab并配置汉化2 修改管理员密码3 修改头像4 关闭账号注册功能5 修改邮箱地址二.gitlab用户,组,项目管理1.用户,组,项目查看2.用户管理2.1 新建用户2.2 用户创建成功2.3 …

【springboot开发】Spring Boot3.3 内部配置与外部配置的差异及其应用

在 Spring Boot 开发中,配置管理是关键的组成部分。配置不仅影响应用程序的行为,还直接关系到应用的灵活性和可维护性。Spring Boot 提供了多种方式来管理配置,其中包括内部配置和外部配置。这两种配置方式各有其优势和应用场景,了解它们的特点和使用场景有助于在开发过程中…

DCL

创建用户通过create user 来创建用户 create user 用户名;(不带密码) create user 用户名 identified by 密码;登录用户发现他可以访问的表少,权限比较少; exit 可以退出登录 用户授权 用grant all|权限1,权限2..on 数据库.表 to 用户(with grant option)【加了括号中命…

【springboot开发】Spring Boot 配置文件高级用法

一、总体优先级顺序二、应用配置文件的详细优先级三、文件类型优先级四、特定环境配置五、配置文件高级用法六、案例: 多配置文件处理方式Spring Boot配置文件的优先级是一个重要的概念,它决定了当存在多个配置文件时,哪个配置文件中的配置将被优先采用。 一、总体优先级顺序…

【微服务】微服务中token鉴权设计的4种方式总结

一、JWT鉴权1.1 概述1.2 实现步骤1.2.1 用户登录1.2.2 存储JWT 1.2.3 请求携带JWT1.2.4 服务端验证JWT 1.3 优点 二、OAuth 2.0鉴权2.1 概述2.2 实现步骤2.2.1 授权服务器2.2.2 资源服务器 2.2.3 客户端 2.3 优点三、统一授权中心(API Gateway)3.1 概述3.2 实现步骤 3.2.1 部…

【架构】一文搞懂多规格商品、组合商品模型设计

今天聊聊多规格商品、组合商品模型设计。 一、多规格商品 1.1 什么是多规格商品 多规格商品是指同一款商品具有多个不同的规格或属性,例如颜色、尺寸、材质、容量等。这些规格使得商品能够满足不同消费者的偏好和需求。在新零售系统中,多规格商品通常会以一个商品条目展示,消…

【架构】多租户系统的核心概念模型

让我们深入探讨一下多租户系统的概念模型。概念模型是多租户系统的"骨架",帮助我们理解系统各部分的组织和运作方式。 多租户的核心概念模型 • 租户:通常指一个企业客户,不同租户之间的数据和行为是相互隔离的。• 用户:某个租户内的具体使用者,使用账号、密码…

WinForm 设计器中DPI感知错误解决方法

这张图是WinForm在1080P分辨率下开发的一个Form,但是代码到高分辨率屏幕就会变成这个鸟样虽然说可以通过DPI感知让程序在运行的时候显示出正确的样式,但是这样让我们在设计的时候很是苦恼 在翻看了WinForm微软官方在Net8的更新,发现了这样的一条:我们在项目csproj里面加入一…