五大常用算法(二)动态规划

动态规划(Dynamic programming)详解 动态规划(Dynamic programming,简称DP)是一种将复杂问题分解成很多子问题,并将子问题的求解结果存储起来避免重复求解的一种算法。动态规划一般用来解决最优问题。而解决问题的过程,需要经历多个决策阶段。每个决策阶段都对应着一组状态。最后通过一组决策序列(动态转移方程),产生最终期望的最优解。 能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。 阅读详情

转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html

一、基本概念

    动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

二、基本思想与策略

    基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

    由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。

    与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

 


三、适用的情况

能采用动态规划求解的问题的一般要具有3个性质:

    (1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

    (2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

   (3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

 


四、求解的基本步骤

     动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。

    初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

                      图1 动态规划决策过程示意图

    (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

    (2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

    (3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

    (4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

    一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。

实际应用中可以按以下几个简化的步骤进行设计:

    (1)分析最优解的性质,并刻画其结构特征。

    (2)递归的定义最优解。

    (3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值

    (4)根据计算最优值时得到的信息,构造问题的最优解

 


五、算法实现的说明

    动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。

     使用动态规划求解问题,最重要的就是确定动态规划三要素:

    (1)问题的阶段 (2)每个阶段的状态

    (3)从前一个阶段转化到后一个阶段之间的递推关系。

     递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。

    确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。

          f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

 


六、动态规划算法基本框架
复制代码
代码
   
1 for(j=1; j<=m; j=j+1) // 第一个阶段 2   xn[j] = 初始值; 3 4  for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段 5   for(j=1; j>=f(i); j=j+1)//f(i)与i有关的表达式 6 xi[j]=j=max(或min){g(xi-1[j1:j2]), ......, g(xi-1[jk:jk+1])}; 8 9 t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案 10 11 print(x1[j1]); 12 13 for(i=2; i<=n-1; i=i+1) 15 { 17 t = t-xi-1[ji]; 18 19 for(j=1; j>=f(i); j=j+1) 21 if(t=xi[ji]) 23 break; 25 }
复制代码

 

路径规划-learning 本文概述了路径规划的基础知识 阅读详情

相关推荐

算法整理六——动态规划

一、概述 基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构、重叠子问题 1、最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 2、重叠子问题: 在解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法(自底向上)正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。

weixin_45901806的博客 5726

五大常用算法之二:动态规划算法

一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可...

weixin_30815427的博客 1719

五大常用算法(二) - 动态规划算法

动态规划算法 基本思想 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到...

能能 1773

动态规划(Dynamic Programming)

我们清楚的知道使用分治算法来求解决斐波那契数列的效率惊人的低,其中的原因是,斐波那契数列分解成的两个子问题并不是独立的,它们之间有着非常多的交集,而在递归中,这些交集会被计算成百上千次,从而降低了算法的效率(这也是为什么分治算法要求子问题尽可能的不要相交)。如果观察斐波那契数列的通项公式,我们会发现数列的第n项只与它之前的两项有关,那么知道这两项也就得到了,这种从子问题出发,逐步得到原问题解的思想就是动态规划。

thdwx的博客 2550

基于MicroPython的ESP32与微信小程序MQTT通信实战

本文详细介绍了基于MicroPython的ESP32与微信小程序通过MQTT协议实现远程控制的完整实战方案。项目利用巴法云作为免费MQTT服务器,提供了从设备端编程、小程序开发到通信调试的全流程指南,帮助开发者快速构建低成本、易上手的物联网应用,如智能开关、传感器监控等。

week9的博客 634

全网最详细Seurat v5 流程复现(拿来即用)

本文是基于seurat v5版本的教程复现,主要依据来源于官网seurat v5建议大家有时间的话可以去官网进行详细阅读学习!本节内容在之前seurat v4的教程都很多都有提到,文章所用到的数据及代码已经给各位放在这里了,有需要自取!请点击这里哦提取码:bui1。

ZxVSaccount的博客 1万+

五大常用算法入门(二)——动态规划

文章目录1.动态规划算法简介1.1 基本定义1.2 问题的特征1.3 求解步骤2.动态规划的经典问题2.1 0-1背包问题2.1.1 问题描述2.1.2 问题状态的描述2.1.3 动态规划递归方程2.1.4 递归求解2.1.5 无重复计算的递归求解2.1.6 权为整数的迭代求解参考资料 1.动态规划算法简介 动态规划(Dynamic Programming) ,将原问题分解为相对简单的子问题来求解...

75 69 69 80 32 67 79 68 73 78 71 33 816

【雕爷学编程】Arduino动手做(111)---震动提醒模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

雕爷学编程 1898

五大常用算法

五大常用算法   分治算法   一、基本概念    在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……     任何一个可...

caizongxu的博客 2万+

使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型

智能家居中的智能照明控制系统旨在通过自动化手段优化家庭照明,提高能源效率和居住舒适度。这通常涉及传感器(如光敏传感器、运动传感器)、控制器(如微控制器或PLC)以及执行器(如调光器或开关)。在这个教程中,我们将使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型。

xiaoheshang_123的博客 220

C/C++跳动的爱心(完整代码)

C语言实现跳动的爱心的完整代码。

AIGC 5842

五大常用算法总结(穷举法, 贪婪算法,动态规划算法,分治算法,分支限界算法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/changyuanchn/article/details/51476281 </div> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/templ...

古月哲亭 1万+

C# WPS操作PPT,全屏,缩率图,备注,跳转播放

本文介绍了一个使用C#开发的PPT操作工具,主要功能包括检测当前打开的PPT文件、获取选中PPT路径、指定播放PPT、获取PPT页面序号和缩略图、提取备注内容等。文章展示了操作界面效果图,并重点解决了用户手动退出PPT后重新获取路径时报错的问题。核心代码实现了通过WPS API进行PPT文件的打开、全屏播放、页面跳转、获取当前页位置等功能,同时支持生成PPT缩略图预览和备注信息提取。当用户未通过工具按钮打开PPT时,程序会自动初始化PPT信息确保功能正常使用。

遇见--专栏 311

五大常用算法概念

图的深度优先搜索二叉树的后续遍历。

qq_37232457的博客 2184

阿里云百炼全解析:一站式大模型开发平台的架构与行业实践

摘要: 阿里云百炼平台通过一站式架构革新大模型开发范式,将传统碎片化工具链整合为统一工作流,实现开发周期从月级到小时级的跃迁。其核心架构包含接入层、引擎层与资源层,关键技术突破包括MCP服务协议、多模态引擎及高性能训练优化。平台提供全生命周期开发支持,从数据准备到模型部署,并通过VPC隔离、数据加密构建企业级安全体系。已在医疗、电力等行业实现显著增效,如阿斯利康药物分析系统准确率提升至95%。未来将向多Agent协同、边缘计算等方向演进,推动AI技术深度融入产业核心。

fudaihb的博客 1990

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 181

五大常用算法之动态规划算法

Authonr: Lijb Email: lijb1121@163.com 五大常用算法简介 1、递归与分治 递归算法:直接或者间接不断反复调用自身来达到解决问题的方法。这就要求原始问题可以分解成相同问题的子问题。 示例:阶乘、斐波纳契数列、汉诺塔问题 斐波纳契数列:又称黄金分割数列,指的...

chenpanjc799055的博客 2008

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

五大常用经典算法

五大常用算法之一:分治算法

读书与思考的乐趣 3万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

游戏与常用的五大算法---上篇

前言:       什么时候,我们之间竟然变得这么生疏       什么时候,我想见到你,却又害怕见到你       什么时候,才能在我身边,告诉我。其实,你一直都在                                    -----------《仙剑奇侠传》 PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示

Loving_Forever_的博客 3万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

图解算法:五大常用算法

目录第一章 递归算法介绍第二章 递归算法应用2.1、求阶乘第三章 回溯算法介绍第四章 回溯算法应用4.1、走迷宫第五章 分治算法介绍第六章 分治算法应用6.1、汉诺塔 项目地址:https://gitee.com/caochenlei/algorithms 第一章 递归算法介绍 递归算法(recursion algorithm)又称递归法,简单的来说,就是函数自己调用自己。绝大多数编程语言中都支持函数的自调用,在这些语言中函数是可以通过调用自身来进行递归的。计算理论可以证明递归的作用可以完全取代循环,

轻松的小希 6417

五大常用算法总结

引言 据说有人归纳了计算机的五大常用算法,它们是贪婪算法,动态规划算法,分治算法,回溯算法以及分支限界算法。虽然不知道为何要将这五个算法归为最常用的算法,但是毫无疑问,这五个算法是有很多应用场景的,最优化问题大多可以利用这些算法解决。算法的本质就是解决问题。当数据量比较小时,其实根本就不需要什么算法,写一些for循环完全就可以很快速的搞定了,但是当数据量比较大,场景比较复杂的时候,编写for循环

changyuanchn的专栏 7万+

五大常用算法:分治、动态规划、贪心、回溯、分支限界

文章目录五大常用算法之一:分治算法五大常用算法之二:动态规划算法贪心算法例子五大常用算法之四:回溯法五大常用算法之五:分支限界法一、基本描述(1)分支搜索算法(2)分支限界搜索算法区别应用实例-分枝界限法(Branch and Bound Method)1、基本思想算法设计中的时空转换概念实现求解完全整数规划问题和混合整数规划问题的分支定界法。 五大常用算法之一:分治算法 实际上就是类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序。 1、一定是先找到最小问题规模时的求解方法 2、

AbiUni(YY熊) 2626

五大常用算法学习笔记

一。分治算法:快速排序、归并排序、大整数乘法、二分查找、递归(汉诺塔) 基本概念:把一个复杂的问题分成若干个相同或相似的子问题,再把子问题分成更小的子问题… , 知道最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 看上去有点类似Fork/Join框架,或map-reduce。 排序算法中的快速排序、归并排序都是使用的分治算法。 分治算法的适用场景: 1)当问题规模缩小到一定的...

胜天半子 1万+
上一篇: 备份
下一篇: IBM实习生笔试题目(1)
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值