动态规划(一)

  • 最优化问题

    • 一般优化问题描写叙述
    • 随机动态规划的结构
      • 离散时间系统
      • 离散时间系统代价函数
    • 反馈
    • 第一个栗子随机动态优化问题
    • 第二个栗子确定动态优化问题
    • 第三个栗子来点复杂的无线网络问题
    • 小结

最优化问题

动态规划(Dynamic programming)是用来优化一个随机问题的最优解。随机问题是仅仅我们优化的目标是随机的,最优解指的是在统计平均上的最优。

比較权威的參考资料:Dimiri P. Bertsekas, Dynamic Programming and Optimal Control, 3rd ed., Athena Scientific, Belmont, Massachusetts,2005

一般优化问题描写叙述

minu∈Ug(u)

  • u 是最优化问题的决策
  • g(u) 是决策的代价函数
  • U 是全部决策 ui 的集合

    动态规划的优化问题能够分为:

    1. 随机优化问题:

    由于代价函数存在一个随机变量w,因此最优解的优化目标是代价函数的统计平均。

    g(u)=EwG(u,w)

    1. 确定优化问题:

    这个问题代价函数是一个确定函数。

怎样区分这两个问题呢?我们能够观察系统是否存在随机性,这个随机性是体如今系统之中的,而不是这个系统。

举个栗子,优化一个随机网络是个确定性问题,即给定随意网络结构,找到最短路径。由于网络尽管是随机的,可是优化的目标在确定以后是不变的。

然而优化一个随时变化的网络是一个随机问题。即一边进行优化。网络结构一边在变的问题。

动态规划正是能够解决每个步骤都有随机变量 w 影响的目标函数,怎样在全局取得统计平均上最优解的问题。后面我们能够看到每个决策都会利用 w 的信息。

随机动态规划的结构

离散时间系统

xk+1=fk(xk,uk,wk),k=0,1,…,N?1

当中:

  • k :表示离散时间(也能够看作是步骤)。

  • xk :表示在时间 k 的状态,该状态具有马尔科夫性,即当前状态已经包括决策所须要的各种信息,与之前的状态无关。当前状态将会參与决策。

  • uk :表示在时间 k 所输出的控制,即再时间 k 在集合 U 中选择的控制信息。

  • wk :是一个随机变量,这个随机变量将会影响代价函数。
  • N :表示控制的窗体时间。

离散时间系统代价函数

E{∑k=0N?1gk(xk,uk,wk) + gN(xN)}

我们的优化目标就是优化这个系统的平均代价。

能够看到这个代价是每个决策的代价和终于状态代价的统计平均。

反馈

前面描写叙述了动态规划的目的,动态规划为了优化一个随机函数。

它的解是平均意义上的最优,并非每次都是最优。动态规划问题能够分为随机优化问题以及确定优化问题。当中确定优化问题能够每次都取得最优解(算法导论上面介绍的就是确定优化问题,这仅仅是动态优化的冰山一角。)。

动态规划除了能够分为随机动态规划和确定动态规划,还能够分为带反馈和不带反馈(feed back)。也有人叫做开环(open-loop)和闭环(closed-loop)。这个命名可能会导致我们理解错误。

由于,反馈并非指的前一级对后一级的反馈。而是当前状态xk依据wk得出的uk导致的状态跳转。

如图:

可见反馈真正的意义是,依据如今的状态以及信息wk做决策做决策,并记录这个过程的状态跳转。

第一个栗子:随机动态优化问题

如果系统是一个零售商的进货系统。进货是周期性的。如果一个周期需求是 wk 显然需求是一个随机变量,库存是 xk 。同一时候也表示这个系统的状态。我们的进货量 uk 也就是我们的决策。所以每一次周期完成后的库存能够表示为xk+1 = xk+uk?wk。

因此我们能够建立例如以下模型:

这个离散时间系统就能够描写叙述为:

xk+1 = fk(xk,uk,wk) = xk+uk?wk

其代价函数会随着时间叠加,所以这个系统的代价函数为:

E{∑k=0N?1(cuk+r(xk))+R(xN)}

我们能够看到每个周期其代价都会叠加,到最后会有一个终于状态的代价(为什么有这个代价呢?最好还是如果没有这个代价,在第N?2个周期我们进货量为正无穷。定能满足需求。

可是这明显是不合理的。

第二个栗子:确定动态优化问题

确定一个确定系统操作顺序问题:我们要找到A,B,C,D的最佳操作顺序。

当中有几个限制:

1. A必须在B之前运行,C必须在D之前运行

2. 必须从A和C開始,即起始状态必须为:SA或者SC

3. 状态 m 到 n 的跳转代价是 Cmn

则能够画出一个相似二叉树的图:

显然仅仅须要遍历整个图我们就可以找到一个最优解。

第三个栗子:来点复杂的无线网络问题

系统描写叙述:我们须要在 N 个时隙中发送 M 个数据包,当中有几个限制:

1. 信道条件有两种:好的(概率为:p)。坏的(概率为: 1?p )

2. 在好的和坏的信道以下都能够传包。不同信道条件下传包的代价不同。好信道的代价为 PG 。

坏的信道的代价为 PB

3.  N 个发送时隙完成后,最后剩余 m 个数据包的代价为 C(m)

以下我们依据已知的知识对系统建模:

  • 系统状态: (mk,Hk) : mk 表示剩余数据包的数量, Hk 表示信道条件。

  • 控制信息: uk 有两个取值,0(表示不发送),1(表示发送)。

  • 随机变量 w :表示信道变化
  • 系统描写叙述:mk+1=mk?uk,Hk+1=wk
  • 开销函数:

    E{∑k=0N?1g((mk,Hk),uk)+C(mN)}

    问题解答见:http://blog.csdn.net/sylar_d/article/details/50900521

小结

经过以上栗子我们看出,动态规划问题具有以下几点特性:

1. 控制是局部的,仅仅取决于当前的状态xk

2. 状态具有马尔科夫性。

3. 动态规划系统具有以下特性:

  • 系统描写叙述: xk+1=fk(xk,uk,wk),k=0,1,…,N?1
  • 控制约束: uk∈U(xk)
  • 随机概率分布: Pk(wk)=Pk(?|xk,uk)
  • 策略:有一系列的策略 π={μ0,…,μN?1} 当中每个 μk 都将状态 xk 依照映射 uk=μk(xk) 映射成为一个决策。
  • 代价函数:从x0開始的策略 π 的代价函数为:

    Jπ(x0)=E{∑k=0N?1gk(xk,μk(xk),wk)+gN(xN)}

  • 最优策略:

    J?(x0)=minπJπ(x0)

  • 最优策略 π? 必须满足:

    Jπ?(x0)=J?(x0)

时间: 2024-10-20 07:47:22

动态规划(一)的相关文章

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[动态规划] 黑客的攻击 Hacker&#39;s CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i++) {

Beauty Of algorithms(七)动态规划 钢条分割 矩阵链乘 最长公共子序列 最优二叉树

1.动态规划                动态规划的方法与方法类似,英文"dynamic programming",这里的programming不是程序的意思,而是一种表格法.都是通过组合子问题的解来解决原问题,分治方法将划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来求出原问题的解.与之相反动态规划应用于子问题的重叠情况,即不同的子问题具有公共的子问题,子问题的求解是递归进行 的,将其划分为更小的子问题,动态规划,每个子问题只求解一次,将其保存在表格中,从而无需每次求

Hdoj 1176 免费馅饼 【动态规划】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26110    Accepted Submission(s): 8905 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

pat 1068 动态规划/Fina More Conis

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special re

动态规划(4)——最长上升子序列(作业题NYOJ201)

作业题 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科-- 今天他们的Teacher S,给他们出了一道作业题.Teacher S给了他们很多的点,让他们利用拉格朗日插值公式,计算出某严格单调函数的曲线.现在小白抄下了这些点,但是问题出现了,由于我们的小白同学上课时走了一下神,他多抄下来很多点,也就是说这些点整体连线不一定还是严格递增或递减的了.这可怎么处理呢.为此我们的小白同学制定了以下的取点规则: 1.取

动态规划之矩阵连乘

[问题描述] 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2-,n-1.如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次.