zoukankan      html  css  js  c++  java
  • 动态规划的基本概念

    一、动态规划的三要素:阶段,状态,决策

    如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。

    下面举个例子:

    要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销售……,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=||)。每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。

    一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。

    二、动态规划的适用范围

    动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢?

    一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件:

    1、最优子结构(最优化原理)

    2、无后效性

    什么是无后效性呢?

    就是说在状态i求解时用到状态j而状态j求解时用到状态k…..状态N。

    而如果求状态N时有用到了状态i这样求解状态的过程形成了就没法用动态规划解答了,这也是上面用图论理解动态规划中形成的图无环的原因。

    也就是说当前状态是前面状态的完美总结,现在与过去无关

    当然,要是换一个划分状态或阶段的方法就满足无后效性了,这样的问题仍然可以用动态规划解。

    三、动态规划解决问题的一般思路

    拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。当却定问题可以用动态规划后,就要用下面介绍的方法解决问题了:

    1、模型匹配法:

    最先考虑的就是这个方法了。挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。

    2、三要素法:

    仔细分析问题尝试着确定动态规划的三要素,不同问题的却定方向不同

    先确定阶段的问题:数塔问题,和走路问题

    先确定状态的问题:大多数都是先确定状态的

    先确定决策的问题:背包问题

    一般都是先从比较明显的地方入手,至于怎么知道哪个明显就是经验问题了,多做题就会发现

    3、寻找规律法:

    这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,有点贪心的意思。

    4、边界条件法:

    找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。这个方法也很起效。

    5、放宽约束和增加约束

    这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰。

  • 相关阅读:
    负载、系统oracle 系统调优之 利用CPUby小雨
    进程、检查oracle 性能调优 解决CPU问题by小雨
    数据、保存【sqlite】——使用记录by小雨
    MySQL中间变量的用法by小雨
    函数、返回Sql Server常用函数之统计、算数、字符串函数by小雨
    数据库、实体数据库设计原则by小雨
    查看、设置centos下在线安装配置mysqlby小雨
    重启、无效Oracle使用raw via lvmby小雨
    总线、虚拟机VMware 创建虚拟机的磁盘操作by小雨
    驱动、数据库Java HIVE 使用Jdbc连接Hiveby小雨
  • 原文地址:https://www.cnblogs.com/lovesaber/p/2045928.html
Copyright © 2011-2022 走看看