`
blue2048
  • 浏览: 183729 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态规划算法介绍

阅读更多

一、基本概念

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

二、基本思想与策略

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

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

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

 


 

三、适用的情况

能采用动态规划求解的问题的一般要具有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)}

 

 

代码
for(j=1; j<=m; j=j+1) // 第一个阶段
   xn[j] = 初始值;

 for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段
   for(j=1; j>=f(i); j=j+1)//f(i)与i有关的表达式
     xi[j]=j=max(或min){g(xi-1[j1:j2]), ......, g(xi-1[jk:jk+1])};

t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案

print(x1[j1]);

for(i=2; i<=n-1; i=i+1)
{  
     t = t-xi-1[ji];

     for(j=1; j>=f(i); j=j+1)
        if(t=xi[ji])
             break;
}

 

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

分享到:
评论

相关推荐

    动态规划算法介绍算法介绍

    本资源“动态规划算法介绍”旨在为ACM竞赛和算法初学者提供一个理解和应用动态规划的良好起点,帮助扩展解题思路。 动态规划的核心思想是将复杂问题分解为多个子问题,并通过存储和重用子问题的解决方案来避免重复...

    动态规划的算法描述和源代码

    二、动态规划算法介绍 动态规划算法是一种解决复杂问题的方法,它通过将问题分解成多个小问题,然后将这些小问题的解组合成原始问题的解。动态规划算法通常用于解决具有最优子结构的问题,即问题的解可以被分解成多...

    动态规划算法

    动态规划算法是一种强大的计算方法,常用于解决复杂优化问题,特别是在计算机科学和数学领域有着广泛的应用。这种算法通过将大问题分解为多个子问题来求解,子问题之间可能存在重叠,通过存储和利用这些子问题的解,...

    Apollo规划算法介绍

    "Apollo规划算法介绍" 在自动驾驶领域中,规划算法扮演着极其重要的角色。Apollo规划算法是其中的一种,主要应用于自动驾驶领域,旨在解决路径规划和轨迹规划问题。本文将深入探讨Apollo规划算法的原理和实现细节。...

    matlab 动态规划算法源程序

    在MATLAB中实现动态规划算法,能够有效地处理多种数学、工程和科学领域的问题,如最短路径、背包问题、资源分配等。本资料提供了一个适合初学者的动态规划算法源程序,旨在帮助学习者理解和应用这一概念。 动态规划...

    9动态规划算法2-石子合并.doc

    下面我们将详细介绍动态规划算法在石子合并问题中的应用。 一、问题描述 石子合并问题是指,我们有很多小石子,每个石子都有自己的重量和价值,我们需要将这些石子合并成一个大的石子,以便于更好地处理和存储。这...

    Java矩阵连乘问题(动态规划)算法实例分析

    本文主要介绍了Java矩阵连乘问题的动态规划算法实例分析。矩阵连乘问题是指给定n个矩阵,确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 矩阵连乘问题的描述 矩阵连乘问题可以...

    TSP(旅行商问题) 动态规划 蚁群算法 遗传算法

    此ppt介绍了解决TSP(旅行商问题)的三种算法:动态规划、蚁群算法、遗传算法

    abcd3.rar_动态规划算法

    在IT领域,动态规划算法是一种极其重要的问题解决方法,尤其在数据结构和算法设计中占据着核心地位。动态规划能够有效地处理那些具有重叠子问题和最优子结构特征的复杂问题,通过存储和复用先前计算的结果来避免重复...

    动态规划算法+贪心算法+回溯法实验文档

    总的来说,这份实验文档通过实例分析和代码实现,深入浅出地介绍了动态规划、回溯法和贪心算法的核心概念,对于学习者来说,是一个很好的实践平台,有助于提升对这些高级算法的理解和应用能力。

    动态规划算法-求解最大子数组问题-python实现

    以下是对动态规划算法求解最大子数组问题的详细介绍: 1. 基本概述 - 定义:最大子数组问题是在一个给定的整数数组中找到具有最大和的连续子数组的问题。 - 特点:动态规划算法通过构建一个状态转移方程来表示子...

    GPU-CPU集群上的动态规划算法.pdf

    本文介绍了如何利用GPU的并行计算能力优化动态规划算法,特别是在GPU-CPU集群系统中的应用。通过矩阵的重新排序和GPU的并行计算特性,实现了动态规划算法的高效执行,为高性能计算提供了一种新的解决方案。这一方法...

    动态规划算法.

    在实际编程中,理解和掌握动态规划算法对于提高问题解决能力至关重要,因为它能够优雅地处理复杂度高且具有结构重叠的优化问题。在学习动态规划时,推荐阅读如《Introduction to Algorithms》等经典教材,它们深入浅...

    算法文档无代码动态规划算法的优化技巧

    标题和描述中提到的“算法文档无代码动态规划算法的优化技巧”指的是在编写动态规划算法时,可能没有实际代码,而是一些算法思路、设计模式或优化策略的介绍。动态规划是一种算法设计技巧,它通过把原问题分解为相对...

    动态规划和贪心算法的区别 贪心算法和动态规划.pdf

    贪心算法是一种特殊的动态规划算法,它每次只考虑当前的状态,不考虑将来的状态。贪心算法的核心思想是贪婪地选择当前最优的解,从而解决问题。贪心算法通常用于解决某些特殊的问题,例如活动选择问题、背包问题等。...

    利用动态规划算法解决最长公共子序列问题.doc

    "利用动态规划算法解决最长公共子序列问题" ...本文详细介绍了动态规划算法的思想、基本步骤和基本要素,并且应用动态规划算法解决了最长公共子序列问题,展示了动态规划算法在解决复杂问题中的重要作用。

    浅析动态规划算法

    “工具”标签可能暗示了文档中还会介绍一些辅助工具,比如使用Python或Java编程语言实现动态规划算法,或者利用特定的开发环境进行调试和优化。 总之,动态规划是解决问题的强大工具,尤其适用于那些具有重叠子问题...

    规划算法(中文版)

    《规划算法》目录: 第Ⅰ部分 介绍性的资料  第1章 绪论  1.1 从规划(的过程)到规划(的结果)  1.2 实例与应用  1.3 规划的基本组成  1.4 算法、规划器与规划  1.4.1 算法  1.4.2 规划器  1.4.3...

    基于近似动态规划算法研究PPT学习教案.pptx

    "基于近似动态规划算法研究PPT学习教案.pptx" 本资源是一个关于近似动态规划算法的研究PPT学习教案,主要内容包括引言、神经网络理论、近似动态规划原理、离散非线性系统HJB方程的解、神经网络建模等方面。 首先,...

Global site tag (gtag.js) - Google Analytics