五大算法之二--动态规划

动态规划--简单的理解

      这个算法简单的来讲就是采用自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解。简言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。

     多阶段决策问题是根据问题本身的特点,将其求解的过程划分为若干个相互独立又相互联系的阶段,在每一个阶段都需要做出决策,并且在一个阶段的决策确定以后再转移到下一个阶段,在每一阶段选取其最优决策,从而实现整个过程总体决策最优的目的。

一、基本概念

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

二、基本思想与策略

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

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

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

 


 

三、适用的情况

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

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

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

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

 


 

四、求解的基本步骤

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

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

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

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

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

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

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

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

    但是,实际应用当中经常不显式地按照下面标准动态规划的基本框架步骤设计动态规划,而是按以下几个步骤进行:  
          1. 分析最优解的性质,并刻划其结构特征。  
          2. 递归地定义最优值。 
          3. 以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。 
          4. 根据计算最优值时得到的信息,构造一个最优解。  
    步骤(1)--(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(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]= 初始值;

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])};
9  t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案
11 print(x1[j1]);
13 for(i=2; i<=n-1; i=i+1
15 {
17      t = t-xi-1[ji];
19     for(j=1; j>=f(i); j=j+1)
21            if(t=xi[ji])
23               break;
25 }


标准动态规划的基本框架:
1. 对fn+1(xn+1)初始化; {边界条件}
2. for k:=n downto 1 do 
3. for 每一个xk∈Xk do
4. for 每一个uk∈Uk(xk) do  begin
5. fk(xk):=一个极值;  {∞或-∞}
6. xk+1:=Tk(xk,uk); 
{状态转移方程}
7. t:=φ(fk+1(xk+1),vk(xk,uk)); 
{基本方程(9)式}
8. if t比fk(xk)更优 then fk(xk):=t; 
{计算fk(xk)的最优值}
 end; 
9. t:=一个极值; {∞或-∞}
10. for 每一个x1∈X1 do
11. if f1(x1)比t更优 then t:=f1(x1); 
{按照10式求出最优指标}
12. 输出t;   


一道典型的动态规划题以及解法:

一.题目

题目描述:
Flute市的Phlharmoniker乐团2000年准备到Harp市做一次大型演出,本着普及古典音乐的目的,乐团指挥L.Y.M准备 在到达Harp市之前先在周围一些小城市作一段时间的巡回演出,此后的几天里,音乐家们将每天搭乘一个航班从一个城市飞到另一个城市,最后才 到达目的地Harp市(乐团可多次在同一城市演出).
由于航线的费用和班次每天都在变,城市和城市之间都有一份循环的航班表,每一时间,每一方向,航班表循环的周期都可能不同.现要求寻找一张花 费费用最小的演出表.

输入:
输入文件包括若干个场景.每个场景的描述由一对整数n(2<=n<=10)和k(1<=k<=1000)开始,音乐 家们要在这n个城市作巡回演出,城市用1..n标号,其中1是起点Flute市,n是终点Harp市,接下来有n*(n-1)份航班表,一份 航班表一行,描述每对城市之间的航线和价格,第一组n-1份航班表对应从城市1到其他城市(2,3,...n)的航班,接下的n-1行是从城 市2到其他城市(1,3,4...n)的航班,如此下去.
每份航班又一个整数d(1<=d<=30)开始,表示航班表循环的周期,接下来的d个非负整数表示1,2...d天对应的两个城 市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"375 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三 天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.

输出:
对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能 存在这样的巡回演出路线,输出0.

样例输入:
3 6
2 130 150
3 75 0 80
7 120 110 0 100 110 120 0
4 60 70 60 50
3 0 135 140
2 70 80
2 3
2 0 70
1 80
0 0

样例输出:
460
0

二.     题目分析

这道题题目求解最优值,很容易想到动态规划,因为第i天在第j个地方的最优值只与第i-1天有关,符合动态规划的无后效性原则,即只与上一个状态相关联,而某一天x航班价格不难求出Value=t[(x-1) mod num +1]. 我们用天数和地点来规划,用一个数组A[1001][11]来存储,A[i][j]表示第i天到达第j个城市的最优值,C[i][j].t[1]表示i城市与j城市间第1天航班价格,则A[i][j]=Min{A[i-1][s]+C[s][j].t[i] (s=1~n且C[s][j].t[i]!=0)}。


三. 解法1

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

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

相关文章

数据库方面的操作示例

1 连接SQL Server数据库示例 // 连接字符串string ConnectionString System.Configuration.ConfigurationSettings.AppSettings["ConnectionSqlServer"]; // 创建SqlConnection对象SqlConnection connection new SqlConnection(ConnectionString); try{// 打开数据…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(开发环境介绍)

开发环境介绍 Python3 1.结构清晰&#xff0c;简单易学 2.丰富的标准库 3.强大的的第三方生态系统 4.开源、开放体系 5.高可扩展性&#xff1a;胶水语言 6.高可扩展性&#xff1a;胶水语言 7.解释型语言&#xff0c;实现复杂算法时效率较低 &#xff08;解释型语言是相…

用python做一个简单的投票程序_以一个投票程序的实例来讲解Python的Django框架使...

&#xff08;一&#xff09;关于Django Django是一个基于MVC构造的框架。但是在Django中&#xff0c;控制器接受用户输入的部分由框架自行处理&#xff0c;所以 Django 里更关注的是模型&#xff08;Model&#xff09;、模板(Template)和视图&#xff08;Views&#xff09;&…

做点什么吧

写了6年代码了&#xff0c;回头发现&#xff0c;虽然写了那么多&#xff0c;真正在使用的少的可怜&#xff0c;真正意义上创造性的劳动也少的可怜。大部分时间都在重复着CtrlC和CtrlV&#xff0c;感觉和产线上的工人差不了多少&#xff1f; 总得做点什么吧? 留下点什么&#x…

BSS段、数据段、代码段、堆与栈

BSS段&#xff1a;BSS段&#xff08;bss segment&#xff09;通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段&#xff1a;数据段&#xff08;data segment&#xff09;通常是指用来存放程序…

python安装模块方法_Python安装模块的几种方法

一、方法1&#xff1a; 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2&#xff1a; 多文件模块&#xff0c;带setup.py 下载模块包&#xff0c;进行解压&#xff0c;进入模块文件夹&#xff0c;执行&#xff1a; python setup.py install 三、 方法3&#xff1a;easy…

使用参数来防止SQL注入

SQL注入的威力是不可忽视的&#xff0c;下面我们主要介绍防范方法——使用参数化SQL。对于不同的数据供应器都有对就的 Parameter 来表示SQL语句或者存储过程中的各种参数。参数和数据库字段的真实类型——对应&#xff0c;所有参数的值会仅仅被认为一个参数。因此&#xff0c;…

高通qca9565网卡驱动_修改注册表让Surface Go的无线网卡支持频段选择

我的Surface Go是第一代无LTE版本&#xff0c;无线网卡型号是Qualcomm Atheros QCA61x4A&#xff0c;因为一些原因急需优先选择5GHz频段wifi的功能&#xff0c;因此写下本文。本文的解决方案仅能保证对Qualcomm Atheros QCA61x4A这一型号的网卡有效&#xff0c;对于其他同品牌不…

异或运算^和他的一个常用作用

发现一个新知识&#xff0c;介绍给大家&#xff1a; 二进制异或运算&#xff1a;两者相等为0,不等为1. 这样我们发现交换两个整数的值时可以不用第三个参数。 如a11,b9.以下是二进制 aa^b1011^10010010; bb^a1001^00101011; aa^b0010^10111001; 这样一来a9,b11了。 举一个运…

微服务 前台调用后台的慢的原因_20年IT农民工分享SpringCloud微服务架构实战文档...

前言越来越多的企业使用 SpringCloud 实现微服务架构设计。我们可以看到这样一种现象&#xff1a;不管是全新开发&#xff0c;还是系统重构&#xff0c;大家似乎都在争先恐后地使用微服务。对于一个Java开发人员来说&#xff0c;学习微服务相关知识大有裨益。本文将从架构设计、…

流量专家为114搜索提供权威流量访问统计

一&#xff1a;系统介绍互联网流量实时统计产品是一套网站流量统计分析系统。致力于为所有网站、第三方统计等用户提供网站流量监控、统计、分析等专业服务。 通过互联网流量实时统计产品 &#xff0c;站长可以随时知道自己网站的被访问情况&#xff0c;每天多少人看了哪些网页…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件介绍)

Anaconda软件介绍 Anaconda下载与安装&#xff08;安装之后会有详细步骤&#xff09; 下载地址&#xff1a; Anaconda官网 https://www.anaconda.com/distribution/ 清华大学软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 软件界面及界面功能介绍 界…

wince 自带的web server

同arm linux相比,wince的网络功能用的相对较少.实际上,wince的网络功能并不逊色,比如"remote display control"就能通过网络远程控制终端. wince自带的web server也是功能强大,绝非arm linux上轻量级的boa之类可比(当然arm linux上有很多其他选择).PB工程加上web se…

Wince6.0p上用ASP技术实现Webserver

一 环境的搭建 1. 内核定制时选上vbscript、javascript&#xff0c;wince6.0自到的web服务器就可以解析vbscript、javascript脚本语言。 2. 数据库的安装 项目中使用的是SQLce3.5数据库&#xff0c;它的安装文件随vs2008一起发布&#xff0c;安装文件有三个&#xff1a;sqlce.w…

opengles 3.0游戏开发_开发者们,快来测试Android Q啦!

近日&#xff0c;谷歌正式推出Android Q Beta 1版本及预览版SDK&#xff0c;TestBird已部署到测试机型&#xff0c;开发者们可到TestBird测试平台测试。此次Android Q 做了不少改进&#xff0c;不少尝鲜的用户反映Android Q对全面屏的手势操作更加友好&#xff0c;整体使用体验…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件使用)

Python的运行模式 交互模式 打开命令行窗口 键入 python&#xff0c;激活python交互模式&#xff0c;出现Python提示符 >>> 在提示符 >>> 处, 写入Python语句 回车&#xff0c;得到Python语句的执行结果 退出Python交互模式 在Python命令提示符后&#…

Ubuntu10.04No init found. Try passing init= bootarg解决方案

在正常状态下误敲 fsck 命令后&#xff0c;果断悲剧。屏幕错误提示错误显示类似于&#xff1a;mount: mounting /dev/disk/by-uuid/***************************** on /rootfailed: Invalid argumentmount: mounting /sys on /root/sys failed: No such file or directorymount…

greenfoot推箱子游戏_推箱子小游戏V2.0更新

小游戏实践推箱子V2.0大家好&#xff0c;我是努力学习争取成为优秀的Game Producer的路人猿&#xff0c;我们上期一起学习制作推箱子的简易V1.0版本&#xff0c;学习了如何响应用户的输入以及面对箱子的各种情况&#xff0c;今天我们把这个程序完善&#xff0c;制作V2.0~ 接着上…

ASP+COM技术在嵌入式Webserver中的应用

1 .COM组件介绍 COM(Component Object Model)&#xff0c;即组件对象模型&#xff0c;它是微软公司开发的一种新的软 件开发技术&#xff0c;Microsoft 的许多技术&#xff0c;如 ActiveX、DirectX、以及 OLE 等都是基于 COM 而建立起来的。COM 标准包括规范和实现两大部分&…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(包管理和环境管理)

包管理和环境管理(以下操作也可在anaconda界面&#xff0c;进行可视化操作) 包管理&#xff1a;包的安装、卸载、更新和查找等等 conda命令 conda install <包名称列表> 同时安装多个包 conda install numpy scipy 指定安装的版本(&#xff0c;均可) conda instal…