当前位置: 首页 > 编程日记 > 正文

谈谈动态规划的思想

动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果,与贪婪算法不同的是,在贪婪算法中,每采用一次贪婪准则,便做出一个不可撤回的决策;而在动态规划算法中,还要考察每个最优决策序列中是否包含一个最优决策子序列,即问题是否具有最优子结构性质。

动态规划算法的有效性依赖于待求解问题本身具有的两个重要性质:最优子结构性质和子问题重叠性质。

1 、最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

2 、子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简 单地查看一下结果,从而获得较高的解题效率。

当我们已经确定待解决的问题需要用动态规划算法求解时,通常可以按照以下步骤设计动态规划算法:

1 、分析问题的最优解,找出最优解的性质,并刻画其结构特征;

2 、递归地定义最优值;

3 、采用自底向上的方式计算问题的最优值;

4 、根据计算最优值时得到的信息,构造最优解。

1 ~ 3 步是动态规划算法解决问题的基本步骤,在只需要计算最优值的问题中,完成这三个基本步骤就可以了。如果问题需要构造最优解,还要执行第 4 步; 此时,在第 3 步通常需要记录更多的信息,以便在步骤 4 中,有足够的信息快速地构造出最优解。

本文来自CSDN博客

*************************************************************************************************

动态规划其实质上是通过开辟记录表,记录已求解过的结果,当再次需要求解的时候,可以直接到
那个记录表中去查找,从而避免重复计算子问题来达到降低时间复杂度的效果。实际上是一个空间
换时间的算法。动态规划,通常可以把指数级的复杂度降低到多项式级别。
一般算法书都会讲能不能用动态规划来求解问题,通常是判断有没有最有解结构,通常是通过“剪
切技术”来判断:即证明问题的一个最优解中,使用的子问题的解本身也必须是最优的。通常是假
设一个子问题不是最优的,那么找到一个最优的子问题来替换这个子问题,那么产生的最优解将优
于已找到的那个最优解,从而矛盾。
         其实用不用动态规划来求解问题,还有一个关键是有没有重复的子问题。这也是使用动态规划
与贪心法的区别所在。。贪心法求解的问题也满足最优解结构,只是它能够在每一步都能够“贪婪的
”选出当前唯一的最优子问题,并且当前的选择,是不依赖以前的选择的,通过这种“贪婪的选择”
选到最后时,就得到了全局的最优解了,不会产生重复的子问题。而动态规划,在一步选择的时候,
是通过从以前求出的若干个与本步骤相关的子问题最优解中选择最好的那个,加上这一步的值,来构
造这一步那个子问题的最优解,而如果以前求出的若干个子问题不保存下来,就需要重新求(通常是递
归所致)。动态规划用武之地也无非是保存这些重复的子问题而避免重新求解而达到高效的目的。
         动态规划的难点在于写出递推式。动态规划的步骤其实是很固定的,而每一个问题的递推式如何下手
得到会因不同的问题而不同,这是个最关键的问题,没有通用的方法。通常是根据题目的问题,最终要求的问题,都会
有几个数,以两个数M,N为例,然后让求最优值。你就可以使用v[M][N]数组来保存最有解,然后把问题
替换成i,j两个数的问题,试图通过v[i][j]与前面求出来的解建立递推关系。建立递推关系后,你可以简单
的写出递归形式的程序,这个程序只需要加上一条if(v[i][j]已求出) return v[i][j];就轻松改称了动
态规划,这就是lookup的形式。当然如果已经有了递推式,你也很容易写出从底向上推的迭代形式。
        一般的算法书讲的动态规划都是来求解最优解的问题,或许最初是用来求解规划问题的,而规划必然是最
优解问题,其实大多数的问题只要存在重复的子问题都可以使用动态规划的思路,就看你的重复的子问题
是不是多的值得使用空间来换时间这个思路了。

***********************************

由于本人是数学系的,所以喜欢用数学离散的角度来思考:

多阶段决策问题

多阶段决策过程,是指这样的一类特殊的活动过程,问题可以按时间顺序分解成若干相互联系的阶段,在每一个阶段都要做出决策,全部过程的决策是一个决策序列。要使整个活动的总体效果达到最优的问题,称为多阶段决策问题

例1是一个多阶段决策问题的例子,下面是另一个多阶段决策问题的例子:

[例2] 生产计划问题

工厂生产某种产品,每单位(千件)的成本为1(千元),每次开工的固定成本为3(千元),工厂每季度的最大生产能力为6(千件)。经调查,市场对该产品的需求量第一、二、三、四季度分别为 2,3,2,4(千件)。如果工厂在第一、二季度将全年的需求都生产出来,自然可以降低成本(少付固定成本费),但是对于第三、四季度才能上市的产品需付存储费,每季每千件的存储费为0.5(千元)。还规定年初和年末这种产品均无库存。试制订一个生产计划,即安排每个季度的产量,使一年的总费用(生产成本和存储费)最少。

决策过程的分类

根据过程的时间变量是离散的还是连续的,分为离散时间决策过程(discrete-time decision process),即多阶段决策过程和连续时间决策过程(continuous-time decision process);根据过程的演变是确定的还是随机的,分为确定性决策过程(deterministic decision process)随机性决策过程(stochastic decision process),其中应用最广的是确定性多阶段决策过程。

动态规划模型的基本要素

一个多阶段决策过程最优化问题的动态规划模型通常包含以下要素:

1.阶段

阶段(step)是对整个过程的自然划分。通常根据时间顺序或空间特征来划分阶段,以便按阶段的次序解优化问题。阶段变量一般用k=1,2,..,n表示。在例1中由A出发为k=1,由Bi(i=1,2)出发为k=2,依此下去从Di(i=1,2,3)出发为k=4,共n=4个阶段。在例2中按照第一、二、三、四季度分为k=1,2,3,4,共4个阶段。

2.状态

状态(state)表示每个阶段开始时过程所处的自然状况。它应该能够描述过程的特征并且具有无后向性,即当某阶段的状态给定时,这个阶段以后过程的演变与该阶段以前各阶段的状态无关,即每个状态都是过去历史的一个完整总结。通常还要求状态是直接或间接可以观测的。

描述状态的变量称状态变量(state variable)。变量允许取值的范围称允许状态集合(set of admissible states)。用xk表示第k阶段的状态变量,它可以是一个数或一个向量。用Xk表示第k阶段的允许状态集合。在例1中x2可取B1,B2,X2={B1,B2}。

n个阶段的决策过程有n+1个状态变量,xn+1表示xn演变的结果,在例1中x5取E。

根据过程演变的具体情况,状态变量可以是离散的或连续的。为了计算的方便有时将连续变量离散化;为了分析的方便有时又将离散变量视为连续的。

状态变量简称为状态

3.决策

当一个阶段的状态确定后,可以作出各种选择从而演变到下一阶段的某个状态,这种选择手段称为决策(decision),在最优控制问题中也称为控制(control)

描述决策的变量称决策变量(decision variable)。变量允许取值的范围称允许决策集合(set of admissible decisions)。用uk(xk)表示第k阶段处于状态xk时的决策变量,它是xk的函数,用Uk(xk)表示了xk的允许决策集合。在例1中u2(B1)可取C1,C2,C3

决策变量简称决策

4.策略

决策组成的序列称为策略(policy)。由初始状态x1开始的全过程的策略记作p1n(x1),即p1n(x1)={u1(x1),u2(x2),...,un(xn)}。由第k阶段的状态xk开始到终止状态的后部子过程的策略记作pkn(xk),即pkn(xk)={uk(xk),uk+1(xk+1),...,un(xn)}。类似地,由第k到第j阶段的子过程的策略记作pkj(xk)={uk(xk),uk+1(xk+1),...,uj(xj)}。对于每一个阶段k的某一给定的状态xk,可供选择的策略pkj(xk)有一定的范围,称为允许策略集合(set of admissible policies),用P1n(x1),Pkn(xk),Pkj(xk)表示。

5.状态转移方程

在确定性过程中,一旦某阶段的状态和决策为已知,下阶段的状态便完全确定。用状态转移方程(equation of state)表示这种演变规律,写作

在例1中状态转移方程为:xk+1=uk(xk)

6.指标函数和最优值函数

指标函数(objective function)是衡量过程优劣的数量指标,它是关于策略的数量函数,从阶段k到阶段n的指标函数用Vkn(xk,pkn(xk))表示,k=1,2,...,n。

能够用动态规划解决的问题的指标函数应具有可分离性,即Vkn可表为xk,uk,Vk+1 n 的函数,记为:

其中函数是一个关于变量Vk+1 n单调递增的函数。这一性质保证了最优化原理(principle of optimality)的成立,是动态规划的适用前提。

过程在第j 阶段的阶段指标取决于状态xj和决策uj,用vj(xj,uj)表示。阶段k到阶段n的指标由vj(j=k,k+1,..n)组成,常见的形式有:

阶段指标之和,即

阶段指标之积,即

阶段指标之极大(或极小),即

这些形式下第k到第j阶段子过程的指标函数为Vkj(xk,uk,xk+1,...,xj+1)。可以发现,上述(3)-(5)三个指标函数的形式都满足最优性原理。在例1中指标函数为(3)的形式,其中vj(xj,uj)是边<xj,uj(xj)>的权(边的长度),uj(xj)表示从xj出发根据决策uj(xj)下一步所到达的节点。

根据状态转移方程,指标函数Vkn还可以表示为状态xk和策略pkn的函数,即Vkn(xk,pkn)。在xk给定时指标函数Vkn对pkn的最优值称为最优值函数(optimal value function),记作fk(xk),即

其中opt可根据具体情况取max或min。上式的意义是,对于某个阶段k的某个状态xk,从该阶段k到最终目标阶段n的最优指标函数值等于从xk出发取遍所有能策略pkn所得到的最优指标值中最优的一个。

7.最优策略和最优轨线

使指标函数Vkn达到最优值的策略是从k开始的后部子过程的最优策略,记作pkn*={uk*,..un*},p1n*又是全过程的最优策略,简称最优策略(optimal policy)。从初始状态x1(=x1*)出发,过程按照p1n*和状态转移方程演变所经历的状态序列{x1*,x2*,..,xn+1*}称最优轨线(optimal trajectory)

相关文章:

关于ARM启动的一篇文章

时间&#xff1a;2010-12-28 09:22:36 来源&#xff1a;老古开发网 作者&#xff1a;写的不错, 应该对大家有所帮助&#xff1a; 基于ARM的芯片多数为复杂的片上系统,这种复杂系统里的多数硬件模块都是可配置的,需要由软件来设置其需要的工作状态。因此在用户的应用程序之前,需…

【Qt】QImage加载bmp位图数据

QImage直接加载bmp文件 QImage image(image.bmp); QImage加载已经获取的bmp数据 unsigned char *imageData = NULL; int imageLen = (102*3+2)*126+54; imageData = (unsigned char*)malloc(imageLen); FILE*stream; if((stream=fopen("image.bmp","r")…

CVPR 2019审稿满分论文:中国博士提出融合CV与NLP的视觉语言导航新方法

整理 | 刘畅、Jane 责编 | Jane 出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09; 如何挑战百万年薪的人工智能&#xff01; https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw CVPR 2019 接收论文编号公布以来&#xff0c;AI科技大本营开始陆续…

有无目标的人生差10倍!赶紧和娃把新年计划做起来

春节连续几天朋友圈都是吃吃喝喝、陪父母陪娃、游山玩水&#xff0c;一派国泰民安的祥和状。昨晚一大学闺蜜突发感概&#xff0c;哎&#xff0c; 2018都快过1/6了&#xff0c;新年计划还没开始做&#xff0c;难道还是只能一声轻叹“今年一定是非常有意义的一年”吗&#xff1f;…

installshield 2009实现安装包自动编译

1.根据当前日期&#xff0c;在服务器上建立一个以日期命名的文件夹&#xff0c;删除本地现有的文件夹并下载最新的文件到本地call mydate %DATE%Rem Copy files from common folder on the designer to the common folder on my computerrd "F:\MySourceFile\MMS2.0\progr…

首发 | 旷视14篇CVPR 2019论文,都有哪些亮点?

译者 | Linstancy 责编 | Jane 出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09; 回顾 CVPR 2018 &#xff0c;旷视科技有 8 篇论文被收录&#xff0c;如高效的移动端卷积神经网络 ShuffleNet、语义分割的判别特征网络 DFN、优化解决人群密集遮挡问…

【Qt】Qt多屏编程,在指定显示屏上显示指定对话框

问题描述 主机连接两个显示器,一主一副,要求主显示器显示主界面,副显示器显示一对话窗口 解决方法 使用QDesktopWidget QDialog dlg = new QDialog(this); QDesktopWidget* desktop = QApplication::desktop(); this->setGeometry(desktop->screenGeometry(0)); …

Kruskal算法 - C语言详解

最小生成树 在含有n个顶点的连通图中选择n-1条边&#xff0c;构成一棵极小连通子图&#xff0c;并使该连通子图中n-1条边上权值之和达到最小&#xff0c;则称其为连通网的最小生成树。 例如&#xff0c;对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。 克鲁斯卡尔…

JavaScript初学者应注意的七个细节

每种语言都有它特别的地方&#xff0c;对于JavaScript来说&#xff0c;使用var就可以声明任意类型的变量&#xff0c;这门脚本语言看起来很简单&#xff0c;然而想要写出优雅的代码却是需要不断积累经验的。本文利列举了JavaScript初学者应该注意的七个细节&#xff0c;与大家分…

开学季,教你用Python画大学教室座位神分区图!网友直呼“中枪”

作者 | 丁彦军转载自恋习Python&#xff08;ID:sldata2017&#xff09;我们上过大学的朋友们都知道&#xff0c;大学没有固定教室也没有固定的座位&#xff0c;所以大家可以随便找个自己喜欢的位置坐下。别看这些不起眼的座位&#xff0c;感觉没什么差别。其实&#xff0c;它们…

【Qt】在ubuntu上打包发布Qt程序,可以不依赖Qt环境

参考博客 https://blog.csdn.net/theArcticOcean/article/details/68069964 https://blog.csdn.net/hjl_1991/article/details/50365927 亲测过程 1、编译处release版本的Qt程序 2、创建打包文件夹 mkdir release 3、进入文件夹&#xff0c;将要打包的程序拷贝到文件中 cd r…

Smart template的控件能否当成普通控件来用

我的同事问过我这个问题&#xff1a; 只要弄清楚Smart control的原理&#xff0c;就能回答这个问题。 答案是: smart control可以像普通的控件一样在xml view中被定义和使用&#xff0c;但是必须结合OData annotation&#xff0c;否则没有意义。以Smart control里的Smart field…

60行代码爬取知乎“神回复”,句句戳中泪点

作者 | shenzhongqiang转载自Python与数据分析&#xff08;ID:PythonML&#xff09;之前的一篇文章《爬了下知乎神回复&#xff0c;笑死人了~》发布后&#xff0c;引发了大家热烈的反响。很多朋友觉得很神奇&#xff0c;在后台问强哥是怎么做到的&#xff0c;有的朋友还表示不太…

IDC行业前景,机遇与挑战并存

中国互联网信息中心(CNNIC)发布了截至2010年6月底中国互联网发展基本情况的报告。在这半年一次的例行报告中&#xff0c;照例有些鼓舞人心的好消息。报告显示中国网民规模达到4.2亿&#xff0c;较09年底增长2.9%&#xff0c;宽带普及率达到98.1%&#xff0c;宽带网民规模为3.64…

【Ubuntu】Ubuntu14.04添加163的源

1、简单的两步 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo wget -O /etc/apt/sources.list http://mirrors.163.com/.help/sources.list.trusty sudo apt update2、注意 这是更改Ubuntu14.04的源&#xff0c;针对ubuntu其它版本参见博客 【Ubuntu】将Ub…

用模板实现单例模式(线程安全)、模板方式实现动态创建对象

一、用模板实现单例模式 在前面的文章中&#xff0c;用过多种方法实现单例模式&#xff0c;现在用模板方式来实现&#xff1a; 为了实现线程安全&#xff0c;需要在linux 下使用pthread_mutex_t 加锁&#xff0c;请使用g 编译并需要链接 -lpthread 使用的是double-check lock&a…

推荐系统召回四模型之全能的FM模型

作者 | 张俊林作者简介&#xff1a;中国中文信息学会理事&#xff0c;中科院软件所博士。目前在新浪微博 AI Lab 担任资深算法专家。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。同时他…

MIDP2.0引入了Push注册机制

PushMIDP2.0引入了Push注册机制&#xff0c;作为一种允许应用被自动启动的方法&#xff0c;由预先设置的警告或者经inbound连接收到的消息。 通过这种方法&#xff0c;MIDlets可以用来设置处理规则事件&#xff0c;如定时从服务器上同步数据&#xff0c;或者非规则事件如一个突…

【OpenCV】cv::Mat和std::vector之间的相互转换

Mat转换成Vector 以vector 为例&#xff0c;其它模型类似 vector getVector(const Mat & a) { Mat b; a.convertTo(b, CV_64F); return (vector)(b.reshape(1, 1)); } Vector转换成Mat 使用Mat的构造函数 std::vector responses; cv::Mat tres; tres Mat(resp…

mysql数据库密码忘记恢复脚本

#!/bin/bashread -p "请输入你要修改的密码&#xff1a;" passwordskipawk /skip-grant-tables/{print $1} /etc/my.cnfif [ ! -n "$skip" ];then ##判断是否有skip-grant-tablessed -i /^[mysqld]/askip-grant-tables /etc/my.cnf ##变量为空就执行插入el…

-16 | 12 等于多少

2019独角兽企业重金招聘Python工程师标准>>> 今天同事问到一个问题 -16 | 12 等于多少&#xff1f; 从教材中知道&#xff0c;二进制数的第一位是符号位&#xff0c;正数为0&#xff0c;负数为1&#xff0c;再根据取反的定义可得到如下算式&#xff08;假设整形是占…

深度学习在自动驾驶感知领域的应用

程序员转行学什么语言&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 本次直播课程是由深度学习资深研究者-杨阳博士从百度Apollo自动驾驶感知技术出发&#xff0c;讲解环境感知中深度学习的实用性与高效性。 课程从Apollo 3.5感知技术介绍、自动驾驶中的目…

【Qt】QObject::moveToThread 总结

原型 void QObject::moveToThread(QThread *targetThread) 功能 将QObject及其孩子移动到 指定线程&#xff08;targetThread&#xff09;中。它的事件将在targetThread线程中处理。 注意事项 1、该对象不能有parent&#xff0c;否则无法移动。 2、如果targetThread为零,…

中国联通备战5G MWC发布《Edge-Cloud平台架构及产业生态白皮书》

2月26日&#xff0d;3月1日&#xff0c;中国联通受邀参加2018MWC世界移动通信大会&#xff0c;作为本次大会GSMA智慧城市展区参展的唯一中国运营商&#xff0c;中国联通提出以服务为驱动的面向5G网络切片的演进思路&#xff0c;为客户提供4G到5G演进阶段的一致性的网络服务&…

转自一个面试者的“提示”

转自CSDN&#xff1a;http://topic.csdn.net/u/20110112/15/FFCBED16-E346-4074-87EE-0D682EF67FE2.html 希望对2011年努力寻找工作的人有帮助。 最近一直在参与公司的面试&#xff0c;为公司招收SE和SA。今天总结发现最近一共面试了二十几份简历&#xff0c;并且都是经过HE和猎…

【OpenCV】读取csv文件

csv简介 逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。纯文本意味着该文件是一个字符…

300道Python面试题,备战春招!

作者 | kenwoodjw 责编 | Jane 出品 | Python大本营&#xff08;ID&#xff1a;pythonnews&#xff09; 程序员转行学什么语言&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 过年开工回来到现在&#xff0c;营长每天在地铁里只看到了两家公司的广告&…

稻盛和夫《活法》

以下内容是摘自<稻盛和夫>的《活着》中文翻译版。此生将托付于此书&#xff01; “吾等定此血盟不为私利私欲&#xff0c;但求团结一致&#xff0c;为社会、为世人成就事业。特此聚合诸位同志&#xff0c;血印为誓。”——稻盛和夫 1.人类活着的意义、人生的目的到底是什…

【OpenCV】将图像数据由YUV格式转换成JPG格式直接使用,而不保存成文件

解决方法 使用OpenCV图像编码和解码函数&#xff1a;imencode、imdecode std::vector data_encode; imencode(“.png”, img_encode, data_encode); 参考博客&#xff1a; https://blog.csdn.net/tt_ren/article/details/53227900

一个装作异步的代码段

// 获取当前周期 getCurrentCycle(subDepartmentIdthis.props.subDepartmentId) {let { dispatch } this.propscalculateApi.currentKaoqinCycle({id:subDepartmentId}).then(res>{ if (res.data.id) { //console.log(res.data.name); this.setState({ cycleName: res.data…