算法(六)动态规划

总结这个东西真的比自己复习多浪费了不少的时间,如果你觉得对你有帮助,就留下一个赞吧。

1 前言

小心考简答。

1.1 多阶段决策问题

这么一类问题,它们的活动过程可以分为若干个阶段,而且在任一阶段后的行为都仅依赖于i阶段的过程状态,而与i阶段之前的过程如何达到这种状态的方式无关。

贪心也属于一种一系列贪心决策的多阶段决策。

1.2 最优性原理

即什么时候使用动态规划:

无论过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优决策序列。

如果所求解问题的最优性原理成立,则说明用动态规划方法有可能解决该问题,而解决该问题的关键是获取各阶段间的递推关系式

1.3 多段图问题

在这里插入图片描述
知道什么是多段图问题。

证明其最优性原理成立:
假设 A坐车到B坐船到C 是 A到C 的最短路,那么从B状态开始看,B到C坐船一定是最短路,因为如果B到C打飞机是最短路,那么 A坐车到B打飞机到C 就是 A到C 的最短路了,所以证明成立,官方写法这么写:

在这里插入图片描述
在这里插入图片描述

1.4 0/1背包问题 KNAP

每个物体只允许选0/1个的背包问题,其余设定详见第五章。

本章的新设定,0/1背包的表示方法:在 l l l j j j中选择物品,选择的状态用X储存。
在这里插入图片描述
还是和刚才一个思路,只不过官方写法变了而已。
在这里插入图片描述

2 多段图

2.1 向前处理法

2.1.1 理论学习

多段图的定义在上一节,再贴一遍图。
在这里插入图片描述
注意在这里COST的定义,COST(i,j)中,i是第i次决策,j是第i次决策的标号j的决策,COST是j到t(汇点)的最短路径成本。

因为是从后向前“确定”路线,所以在考虑第i次决策(共j种)的时候不需要考虑前i-1次决策,因为我们确定的不是1个路线,而是j个路线,确定第i次决策的每种可能的后续最短路线,直到在源点只有1种决策的时候,得到这一种可能的后续最短路线即全图的最短路线。下图即例子:
在这里插入图片描述

2.2.2 算法表示

杀疯了是吧,“设r是这样的一个节点”,你怎么不说“设P是源点到汇点最短的一段路,return P”直接把算法写完了得了。

学学SPARKS语言吧,考试比别人少写一堆代码。
在这里插入图片描述

2.2 向后处理法

在这里插入图片描述

3 最优二分检索树

先说PPT第二讲不考,然后说考个最后的选择,如果你敢,那就直接看3.5,我尽量在3.5一节内就把那部分讲明白,因为就是个选择。

3.1 二分检索树

不会的看图,左小右大。
在这里插入图片描述

3.2 什么是最优二分检索树

看一下我写的第四章里2.1.3.2那种检索时间表示方法,或者你直接看得懂图也可以,用最简单的说法来说就是,计算所有成功检索和不成功检索的比较次数按概率求和。
在这里插入图片描述
注意一点,E1是第三行的,但是它只需要比较两次(a2,a1),所以是(level(E i _i i-1))。

如果你怕理解错看一下书上例6.9就可。

3.3 构建最优二分检索树

用动态规划的思想去考虑构建最优二分检索树。

这个还是比较好理解的,L表示左侧,R表示右侧。
构建最优二分检索树就是,找到一个k值,k值在中间,<k的在左面,>k的在右面。
在这里插入图片描述
这里因为要考虑a k _k k这层了,所以每一个层数都要+1。
在这里插入图片描述
整理出来得这样:
在这里插入图片描述
发现没有,这里就是这一块的全部的P和Q得和,你是不是觉得可以把它整理一步合并了,诶,我就不整理,我就是玩:
在这里插入图片描述
这一步没多重要,就是单纯给我心态看崩了,W得意思就是 i到j得Q的和 + i+1到j得P的和。也比较好理解,因为P是点,Q是点旁边的空,两个点自然会有三个空,但是这种合并方式我确实只能说很有病,所以快进到一般表示方法:
在这里插入图片描述

3.4 举例

看一下书上例6.10
在这里插入图片描述
继续离谱写法,C(i,j) 表格中所谓的行是j-i的值,列是i的值,计算过程应该是一行一行计算,每次都比较所有的情况找到C最小的k值。

3.5 选择

终于到画的考点了,如果你是跳步过来的,那么你要明确两件事,C和W只是一个值,计算公式在图里,这个公式的目的是要找到i到j范围内的一个k值,让这个公式C(i,k-1)+C(k,j)的值最小,而R(i,j)就是指i到j这个范围的k值。

有一种计算方式让计算C(i,j)的时间变成O(n 2 ^2 2),就是k只在[R(i,j-1),R(i+1,j)]中找,只需要试更少的k值去寻找最小的C(i,k-1)+C(k,j)值。

比如在图中,C(0,4)的计算正常是需要试四种情况,但是考虑到[R(i,j-1),R(i+1,j)]=[R(0,3),R(1,4)]=[2,2],那只需要试[2,2]范围内的k值,巧合的是只有一个,那就不用比较了。
在这里插入图片描述

4 流水线问题

我写完了发现好像看4.3就可…

4.1 问题阐述与OFT算法

S是一个调度问题,有若干设备和若干任务,T i x _{ix} ix是第i行的设备,T x j _{xj} xj是第j列的任务,每一列的上一个作业做完之后才可以做下一个作业。

f i _i i(S)是第i个任务全部完成的时间,F(S)是整个S调度完成的时间,易得F(S)=max{f i _i i(S)}。

抢先调度就是一个任务可以拆成两段时间做,这章不讲。对于所有非抢先调度,OFT调度是最小的那个非抢先调度。给了一个动态规划递推式:

g(S, t)这个定义我是实在没看懂,后来是找到了一个学姐的帖子照着看才看懂。
N是全部作业(作业1、作业2、……),S是N的一个子集,在我还没有做S中的作业之前,已经安排了部分作业(这里就记为K,K可以为空),设备二完成K全部内容的时间点是h2,设备1完成K全部内容的时间点是h1,那么现在t=h2-h1,也就是如下图所示,就是说,在安排S之前,设备2还需要t时间去处理之前的作业。
在这里插入图片描述
那么我们在考虑整个全部作业的时候,在N安排之前没有任何作业,所以最后我们要求的结果就是g(N, 0),明白这个事情就可以看下面这个递推式:
在这里插入图片描述
即:g(N, 0)=min{a i _i i+g(N-{i},b i _i i)}

这个只是把最后一步的结果考虑了,并不是一个通用公式。

这里作业i在设备一所需要的时间是a i _i i,在设备二中需要的时间是b i _i i,把1-n中某一个作业i作为前置作业,那必然在设备一完成作业i之后,需要设备二去做作业i,此时t=h2-h1=(a i _i i+b i _i i)-a i _i i=b i _i i。剩下的作业需要的时间为g(N-{i},b i _i i),再加上之前已经用掉的时间a i _i i即为g(N, 0)的结果。

这个就是从上面那个而来的通用公式:
在这里插入图片描述
这个就很好理解了,唯一一个不同点就是,要考虑t-a i _i i和0的关系,如果t-a i _i i>0,那就代表在i作业之前的那部分作业已经产生了时间t-a i _i i,那在去掉i作业的时候不能不算,如果t-a i _i i<0,那就代表除去i作业之前的作业已经达到平衡,在继续安排作业的时候不需要设备二去花时间处理之前的事情。

4.2 Johnson法则

t’ 就是t’,别往导数那边想。
在这里插入图片描述
这个式子的处理顺序是是先处理i后处理j,所以我们还要考虑另一种处理顺序,即t i j _{ij} ij和t j i _{ji} ji哪个小,哪个小用哪个。
t i j _{ij} ij=balabala+min{a i _i i,b j _j j)
t j i _{ji} ji=balabala+min{a j _j j,b i _i i)

4.3 考点

将a i _i i、b i _i i按照非降序列,如果遇到一个a i _i i且i还没被调度,那就把这个作业放到剩余时间的最前,如果遇到一个b i _i i且i还没被调度,那就把这个作业放到剩余时间的最后,如果遇到一个已经被调度的作业就不用管了。每个时刻都是前面若干作业后面若干作业,中间是未被安排的时间。
看一下例子就行。
在这里插入图片描述

5 0/1背包

5.1 基本推导

i是指目前考虑前i件(理解成第i件也可)物品,x表示目前最大重量。
在这里插入图片描述
详见书中例题6.11,但是不用看他的解,直接看这个图的推导,本章后面也是这个例题。
在这里插入图片描述
在这里插入图片描述
图解法不考。

5.2 S计算

S i ^i i代表考虑前i件物品,S 1 i ^i_1 1i表示选择了第i件物品,中间的序偶(p,w)是表示目前重量w的物品价值p。
其中在考虑S i ^i i的时候,除了不选第i件物品可以直接把S i − 1 ^{i-1} i1直接写上,还要加上S 1 i ^i_1 1i的情况,但是要将w更大但是p更小的情况删除,比如S 3 ^3 3=S 1 3 ^3_1 13+S 2 ^2 2,(3,5)就被(5,4)淘汰掉了。
在这里插入图片描述

5.3 DKNAP算法

在这里插入图片描述
在这里插入图片描述

6 TSP问题

最开始的状态,起点是1,第一个到达的点是k。g(i,S)中,i是当前位置,S是还未经历的点,g是未来要经历S这些点需要走的路线长度,c i j _{ij} ij是i到j的有向距离。

g(1,V-{1})=min{c 1 k _{1k} 1k+g(k,V-{1,k})}

得到一般化形式:

g(i,S)=min{c i j _{ij} ij+g( j, S - {j} )}

到最后,当所有点都选择完之后,需要回到点1,所以g(i,Ø)=c i 1 _{i1} i1

正向公式,所以计算的时候从后向前考虑,从g(i,Ø)开始一个点一个点加入集合S,直到g(1,V-{1})。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值