动态规划和贪婪策略及枚举策略的关系

贪婪策略、枚举策略及动态规划都是常用的算法策略。贪婪策略和动态规划常常用于解决分阶段优化问题,枚举策略则理论上基本可以用于一切优化问题。对于多阶段的优化问题,动态规划是一个重要的算法策略。而使用算法策略的前提是要对该策略有深刻的认识,本文从贪婪策略和动态规划的联系以及枚举策略和动态规划的联系两个方面对动态规划进行分析和理解,并作出总结,动态规划是对贪婪策略和枚举策略之间的一个折衷方法。

我们知道贪婪策略的算法时间复杂度低,因为算法在个阶段作出的决策仅为当前阶段状态下的一个局部极值,这导致算法产生的最终结果可能不是一个全局最值。由1951年美国数学家R.Bellman等人提出的解决多阶段优化问题的最优化原理我们可以知道,算法满足贪婪策略是算法构成多阶段优化问题最优解的必要条件。多阶段优化问题的最优化原理描述为:一个过程的最优决策具有这样的性质,无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略;也就是说,对于任何一个整数k(1<k<n),不论前面k个决策时怎样的,以后的最优决策只取决于由前面决策所确定的当前状态。那么算法满足贪婪策略是不是算法构成多阶段优化问题最优解的充分条件呢?当然不是,只需要举出一个反例就可以证明。

枚举策略,又称为蛮力法,就是不加思索的在问题所有可能的解构成的空间中比较搜索,找出问题的最优解。该方法虽然是能够保证找到问题的最优解,但是算法时间复杂度高导致对于很多优化问题该算法策略是不可行的。

动态规划则在贪婪策略和枚举策略这两种“极端”的算法策略之间取得了较好的折衷,分析如下:

1.动态规划与贪婪策略

动态规划是一个多路的贪婪策略,贪婪策略各阶段决策为唯一结果(唯一局部极值),而动态规划各阶段决策为一组结果(多个局部极值)。

2.动态规划与枚举策略

动态规划在各阶段作出决策,排除那些不可能成为最优解的部分,随着阶段的递推,进而对枚举策略中构成的解空间进行裁剪,缩小了包含最优解的搜索空间,减少了搜索时间。

从上述分析我们可以将动态规划表示为:动态规划 = 多路贪婪策略 + 递推(裁剪枚举策略解空间) + 存储递推结果(构成下一阶段的状态)。

特别的,动态规划的阶段划分可以是递增式的也可以是递减式的。一般递减式使用的更多,但有时递增式会有意想不到的效果,而且有时递增式(用于构造解空间)和递减式(用于在解空间中搜索最优解)也同时使用。了解更多可以参考下面博文:

http://remyspot.blog.51cto.com/8218746/1327830

http://remyspot.blog.51cto.com/8218746/1543821

时间: 2024-10-12 00:44:23

动态规划和贪婪策略及枚举策略的关系的相关文章

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介

内存分配策略与回收策略

内存分配策略与回收策略 给对象分配内存以及回收给对象分配的内存.对象的内存分配绝大部分主要是在Java堆上,有一部分特殊的就是JIT编译器,经过JIT编译后被拆散为标量类型并间接地在栈上分配内存. 对象主要分配集中在新生代的Eden区,如果启动了本地线程分配缓冲,按照线程优先在TLAB上分配.少数分配在老年代,分配在哪里取决于当前使用的垃圾回收器组合和虚拟机中相关内存参数的设定. 新生代GC :Minor GC,发生在新生代的垃圾回收动作,非常频繁,速度很快. 老年代GC :Major GC/F

本地策略、域策略

本地策略.域策略一.本地安全策略概述1.本地安全策略:本地安全策略影响本地计算机的安全设置2.打开方法:控制面板 → 管理工具"→ 本地安全策略 → 运行secpol.msc命令3.本地安全策略的分类本地安全策略主要包含:帐户策略和本地策略.4.帐户策略(1)密码策略① 密码必须符合复杂性需求:英文字母大小写.数字.特殊符号四者取其三.② 密码长度最小值:设置范围0-14,设置为0表示不需要密码.③ 密码最长使用期限:默认42天,设置为0表示密码永不过期,设置范围0和999天之间的值.④ 密码最

三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)

目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么是缓存 一级缓存 一级缓存特点 一级缓存内部结构 事务管理 什么是事务 事务特性 事务的隔离级别 Hibernate设置事务的隔离级别 事务业务层连接 Hibernate生成策略与缓存策略 主键生成策略 主键分类 自然主键 主键本身就是表中的一个字段 实体中一个具体的属性,对象本身唯一的特性 创建一

算法--枚举策略

注:转载请注明:http://www.cnblogs.com/ECJTUACM-873284962/ 枚举法的基本思想 枚举法的基本思想是根据提出的问题枚举所有可能状态,并用问题给定的条件检验哪些是需要的,哪些是不需要的.能使命题成立,即为其解. 枚举结构:循环+判断语句. 枚举法的条件 虽然枚举法本质上属于搜索策略,但是它与后面讲的回溯法有所不同.因为适用枚举法求解的问题必须满足两个条件: ⑴可预先确定每个状态的元素个数n: ⑵状态元素a1,a2,-,an的可能值为一个连续的值域. 枚举法的框

《设计模式之禅》--策略扩展:策略枚举

接上篇<设计模式之禅>--代理扩展:动态代理 需求:加减法计算 public enum Calculator { //加法运算 ADD("+") { public int exec(int a, int b) { return a + b; } }, //减法运算 SUB("-") { public int exec(int a, int b) { return a - b; } }; String value = ""; //定义成

策略模式(策略不同类,场景不同策略不同)

背景 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择. 这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要

[email&#160;protected]独立作用域scope绑定策略之&amp;符策略

1.index.html: <!DOCTYPE HTML><html ng-app="app"><head>    <title>scopeAt</title>    <meta charset="utf-8">        <link rel="stylesheet" href="../css/bootstrap.css">    <