算法与设计第3章详解.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
对于一个具体的问题,如何知道是否可用贪心算法解决此问题,以及能否得到问题的最优解?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题中看到这类问题一般具有两个重要的性质:贪心选择性质和最优子结构性质。 对于一个具体问题,要确定它是否具有贪心选择的性质,必须证明每一步所作的贪心选择最终能够导致问题的最优解。 通常首先证明问题的一个整体最优解是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。 然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体最优解。 证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。 定理3.1 如果p1/wl≥ p2/w2 …pn/wn。则算法GREEDY-KNAPSACK对于给定的背包问题实例生成一个最优解。 证明:设X=(x1,…,xn)是GREEDY-KNAPSACK所生成的解。如果所有的xi等于1,显然这个解就是最优解。于是,设j是使xj≠ 1的最小下标。由算法可知,对于1≤ij,xi=1;对于j<i≤n,xi=0。对于j,0≤xj<1。 设i在SI中在t到t+1时刻被调度,在SJ中则在t’到t’+1时刻被调度。 (2)对于I,J中不同的作业,则以J为标准,找出属于J,不属于I的作业,设a是这样的作业,它在SJ 中[ta,ta+1] 时刻被调度。设作业b在I中的这一时刻被调度。由于pa≥pb,在SI 的[ta,ta+1]时刻去掉作业b而去调度作业a,得到作业集合I’=I-{b}∪{a}可行的调度表。 考察作业i能否加入序列 判断J∪{i}是否可行 判断步骤 (1)找位置d[j(k)]≥ d[j(k-1)] ≥ …… ≥ d[j(r+1)] ≥ d[i]≥d[j(r)] (2)r之后的作业能够向后移动一个单位的条件:d[J(r)]r (3)作业i能够放在r后面位置:d(i)r 分析:该方法较前方法的不同之处在于如何确定部分解的可行性方面,两者的量度标准是一样的。其方法是:如果J是作业的可行子集,那末可以使用下述规则来确定这些作业中的每一个作业的处理时间:若还没给作业i分配处理时间,则分配给它时间片[α–1, α],其中α应尽量取大且时间片[α–1, α]是空的。此规则就是尽可能推迟对作业的处理。于是,在将作业一个一个地装配到J中时,就不必为接纳新作业而去移动J中那些已分配了时间片的作业。如果正被考虑的新作业不存在像上面那样定义的α ,这个作业就不能计入J。 四、算法的证明 定理3.2 以上算法所描述的贪心方法对于作业排序问题总是得到一个最优解。 思路:J是由贪心方法所选择的作业的集合;I是一个最优解的作业集合。可证明J和I具有相同的效益值,从而J也是最优的。(I,J是作业的集合,而不是作业的调度表) 证明:假定(1)I≠J,因为若I=J,则J即为最优解。 (2)如果I J,则I就不可能是最优的。 (3)由贪心法的工作方式也排斥了J I。 因此,至少存在这样的两个作业a和b,使得a∈J且a I,b∈I且b J。设a是使得a∈J且a I的一个具有最高效益值的作业。由贪心方法可以得出,对于在I中又不在J中的所有作业b,都有pa≥pb。这是因为若pb >pa,则贪心方法会先于作业a考虑作业b并且把b计入到J中去。 设SI和SJ分别是I和J的可行调度表。(调度表与作业集的区别) (1)设i是既属于J又属于I的一个作业,把他们调换到相同的时刻去调度,且尽量将调度时间往后移。 SJ SI 如果t<t’,则可以将SI中[t’,t’+1]时刻所调度的那个作 业与i相交换。如果I中在[t’,t’+1]时刻没有作业被调度, 则将i移到[t’,t’+1]调度。所形成的调度表也是可行的。 如果 t’ < t ,则可以将SJ中[t,t+1]时刻所调度的那个 作业与i相交换。如果J中在[t,t+1]时刻没有作业被调度, 则将i移到[t,t+1]调度。所形成的调度表也是可行的。 SJ SI SJ SI 显然I’的效益值不小于I的效益值,并且I’比I少一个与J不同的作业。重复使用上述的转换,将使I能在不减效益值的情况下转换成J,因此J也必定是最优解,证毕。 五、算法的实现 考虑对于一个给定的J,如何确定它是否为可行解的问题,一个明显的方法是检验J中作业的所有可能的排列。对于任一种次序排列的作业序列,判断这些作业是否能在其限期前完成。 J是作业集,不是调度表 假定J中有k个作业,这就需要检查k!个排列。对于所给出的一个排列σ=i1i2i3…ik,由

文档评论(0)

南非的朋友 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档