动态规划法学习

当然,让我们用更生活化的语言和一个实际的例子来解释动态规划,以及如何在实践中应用它。

动态规划通俗理解

想象一下,你是个水果摊老板,每天要决定订购多少苹果,目标是最大化利润。但苹果的价格每天波动,顾客的需求也变化,你该怎么办?

传统做法:每天早上,你都根据昨天的经验和今天的感觉猜测需求,然后订购苹果。但如果猜错,要么苹果卖不完亏本,要么不够卖错过赚钱机会。

动态规划做法:你开始记录每一天的销售数据,包括苹果价格、天气、节假日等因素。第二天,你不再凭感觉,而是根据历史数据预测需求,再决定订购量。因为你“记得”过去的经验,所以可以做出更精准的决策,减少浪费,增加利润。

实践过程详解

以经典的背包问题为例,假设你是个旅行者,背包容量有限,你要从一堆物品中选择装入背包,每件物品有重量和价值,你的目标是让背包里物品的总价值最大,但不超过背包容量。

步骤1:定义问题
  • 状态:背包当前的剩余容量,已经选了哪些物品。
  • 目标:背包内物品价值最大化。
步骤2:构建状态转移方程
  • 假设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示前i件物品装入容量为j的背包中的最大价值。
  • 状态转移方程为: d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w e i g h t [ i ] ] + v a l u e [ i ] ) dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i]) dp[i][j]=max(dp[i1][j],dp[i1][jweight[i]]+value[i]),其中 w e i g h t [ i ] weight[i] weight[i] v a l u e [ i ] value[i] value[i]分别是第i件物品的重量和价值。
状态定义

我们定义 d p [ i ] [ j ] dp[i][j] dp[i][j]表示考虑前 i i i个物品,且背包容量为 j j j时,所能达到的最大价值。

状态转移方程

状态转移方程是这样的:

d p [ i ] [ j ] = max ⁡ ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ] + v i ) dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w_i] + v_i) dp[i][j]=max(dp[i1][j],dp[i1][jwi]+vi)

这里:

  • d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j] 表示不拿第 i i i个物品,此时最大价值就是前 i − 1 i-1 i1个物品在容量为 j j j的背包下的最大价值。
  • d p [ i − 1 ] [ j − w i ] + v i dp[i-1][j-w_i] + v_i dp[i1][jwi]+vi表示拿了第 i i i个物品,此时背包剩余容量为 j − w i j-w_i jwi w i w_i wi是第$ 个物品的重量),然后加上第 个物品的重量),然后加上第 个物品的重量),然后加上第i$个物品的价值 v i v_i vi
方程解读

这个方程意味着我们在考虑第 i i i个物品时,有两种选择:

  1. 不拿第 i i i个物品:此时最大价值取决于前 i − 1 i-1 i1个物品在容量为 j j j的背包下能达到的最大价值,即 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j]
  2. 拿第 i i i个物品:此时我们需要确保背包容量足够装下这个物品,即 j > = w i j >= w_i j>=wi。在这种情况下,我们的最大价值由前 i − 1 i-1 i1个物品在剩余容量 j − w i j-w_i jwi下的最大价值加上第 i i i个物品的价值组成,即 d p [ i − 1 ] [ j − w i ] + v i dp[i-1][j-w_i] + v_i dp[i1][jwi]+vi

最终,我们取这两种选择中价值更大的那个作为 d p [ i ] [ j ] dp[i][j] dp[i][j]的值。

步骤3:初始化边界条件
  • 当背包容量为0或没有物品时,价值为0,即 d p [ 0 ] [ j ] = 0 dp[0][j] = 0 dp[0][j]=0 d p [ i ] [ 0 ] = 0 dp[i][0] = 0 dp[i][0]=0
步骤4:计算
  • d p [ 0 ] [ 0 ] dp[0][0] dp[0][0]开始,按行或列递增地填充整个二维数组,直到得到 d p [ n ] [ W ] dp[n][W] dp[n][W],即为所求的最大价值。
实践注意点
  1. 状态定义要准确:状态必须包含足够的信息来描述问题,但又不能过于复杂,否则计算量会很大。
  2. 避免重复计算:动态规划的核心是记忆化,即保存已计算的状态,避免重复计算相同的子问题。
  3. 边界条件:正确的边界条件是关键,否则可能导致整个解法失效。
  4. 空间优化:有时可以通过观察状态转移方程,仅保留必要的状态信息,减少内存消耗。

结语

动态规划就像一个智慧的决策者,它通过分析过去的“经验”(子问题的解),来做出更好的“未来决策”(解决大问题)。在实践中,清晰的状态定义、有效的状态转移方程和合理的边界条件是成功应用动态规划的关键。希望这次解释能帮助你更好地理解和掌握动态规划!

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

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

相关文章

题解:CF1975D(Paint the Tree)

题解:CF1975D(Paint the Tree) 看到有两个点在移动,好烦人! 那就直接“改题”:有一个点在一棵树上移动,每次可以移动到相邻的一个点,问至少要移动多少次才能够遍历整棵树。 这个题…

【Linux】进程_2

文章目录 五、进程2. 操作系统3. 进程 未完待续 五、进程 2. 操作系统 我们知道了操作系统是一个进行 软硬件 资源 管理 的 软件 。为什么要有操作系统呢?或者说,为什么要有操作系统的管理呢?操作系统的存在目的是为了对上提供一个良好的运行…

机器学习第四十三周周报 aGNN

文章目录 week43 aGNN摘要Abstract1. 题目2. Abstract3. 网络架构3.1 aGNN3.1.1 输入与输出模块3.1.2 嵌入层3.1.3编码器解码器模块:带有多头注意力层的GCN 3.2 可释性模型:SHAP 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 实验区域以及场…

SpringMVC:拦截器(Interceptor)

1. 简介 拦截器(Interceptor)类似于过滤器(Filter) Spring MVC的拦截器作用是在请求到达控制器之前或之后进行拦截,可以对请求和响应进行一些特定的处理。拦截器可以用于很多场景下: 1. 登录验证&#xf…

2024年最新Microsoft Edge关闭自动更新的方法分享

这里写自定义目录标题 打开【服务】 打开【服务】 windows中搜索服务,如下图: 打开服务界面,找到“Microsoft Edge Update Service (edgeupdate)” 及 “Microsoft Edge Update Service (edgeupdatem)” 两个服务,设置为禁用

matlab-1-函数图像的绘制

常识 如何建一个新文件 创建新文件,点击新建,我们就可以开始写代码了 为什么要在代码开头加入clear 假如我们有2个文件,第一个文件里面给x赋值100,第二个文件为输出x 依次运行: 结果输出100,这是因为它们…

Landsat8的质量评估波段的一个应用

Landsat8一直是遥感界的热门话题。这不仅延续了自1972年以来NASA连续对地观测,而且这颗卫星为科学界带来了一些新的东西——质量评估波段(the Quality Assessment (QA) Band)。根据USGS Landsat Missions webpage,“QA通过标示哪个…

强大高效,推荐这两款分析文章和抠图的AI工具

ChatDOC ChatDOC是一款基于ChatGPT的AI阅读辅助工具,旨在通过与用户指定的文档进行对话来处理用户的专属数据。它能够帮助用户快速提取文档中的信息,支持多种文件格式,并提供准确的答案。此外,ChatDOC还具备智能格式化、自动摘要生…

详解 Flink Table API 和 Flink SQL 之时间特性

一、介绍 Table API 和 SQL 进行基于时间的操作(比如时间窗口)时需要定义相关的时间语义和时间数据来源的信息。因此会给表单独提供一个逻辑上的时间字段,专门用来在表处理程序中指示时间时间属性(time attributes)&a…

高效处理海量慢SQL日志文件:Java与JSQLParser去重方案详解

在大数据处理环境下,慢SQL日志优化是一个必要的步骤,尤其当日志文件达到数GB时,直接操作日志文件会带来诸多不便。本文将介绍如何通过Java和JSQLParser库来解析和去重慢SQL日志,以提高性能和可维护性。 背景 公司生产环境中&…

Lua与C交互API接口总结

Lua与C交互 1. 常见Lua相关的C API压入元素查询元素获取元素检查元素栈的相关数据操作 2. C调用Lua核心调用函数示例 3. Lua调用C1. C函数注册到Lua(lua_register)示例2. 批量注册(luaL_Reg)示例 1. 常见Lua相关的C API 压入元素…

大模型微调出错的解决方案(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

等保测评练习题11

等级保护初级测评师试题11 姓名: 成绩: 判断题(10110分) 1.国家支持网络运营者之间在网络安全信息收集、分析、通报和应急处置等方面进行合作。(T) 安全法第二…

【文献阅读】基于高阶矩的波形分类方法

文章目录 基本信息SND及其统计特征分类 基本信息 【2017】rse Moritz, Bruggisser, Andreas, et al. Retrieval of higher order statistical moments from full-waveform LiDAR data for tree species classification[J]. Remote Sensing of Environment, 2017,196: 28-41. …

鲁教版八年级数学下册-笔记

文章目录 第六章 特殊平行四边形1 菱形的性质与判定2 矩形的性质与判定3 正方形的性质与判定 第七章 二次根式1 二次根式2 二次根式的性质3 二次根式的加减二次根式的乘除 第八章 一元二次方程1 一元二次方程2 用配方法解一元二次方程3 用公式法解一元二次方程4 用因式分解法解…

css系列:音频播放效果-波纹律动

介绍 语音播放的律动效果,通俗来说就是一个带动画的特殊样式的进度条,播放的部分带有上下律动的动画,未播放的部分是普通的灰色竖状条。 实现中夹带了less变量、继承和循环遍历,可以顺带学习一下。 结果展示 大致效果如图所示…

防火墙安全管理

大多数企业通过互联网传输关键数据,因此部署适当的网络安全措施是必要的,拥有足够的网络安全措施可以为网络基础设施提供大量的保护,防止黑客、恶意用户、病毒攻击和数据盗窃。 网络安全结合了多层保护来限制恶意用户,并仅允许授…

使用QT制作QQ登录界面

mywidget.cpp #include "mywidget.h"Mywidget::Mywidget(QWidget *parent): QWidget(parent) {/********制作一个QQ登录界面*********************/this->resize(535,415);//设置登录窗口大小this->setFixedSize(535,415);//固定窗口大小this->setWindowTi…

Spring Boot 的启动原理、Spring Boot 自动配置原理

Spring Boot启动原理包含自动装配原理。 Spring Boot 的启动原理: 1. 入口类与 SpringApplication 初始化: 应用程序通常从一个带有 SpringBootApplication 注解的主类开始,这个注解是一个组合注解,包含了 SpringBootConfigurat…

【学习笔记8】阅读StyleID论文源码

论文【链接】 源码【链接】 一、DDIM eta ddim_step表示执行几轮去噪迭代,eta表示DDPM和DDIM的插值系数。当eta0时,为DDPM;当eta≠0时,为DDIM。 参考 DDIM 简明讲解与 PyTorch 实现:加速扩散模型采样的通用方法 【s…