- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章算法设计和分析的基本方法及技巧
运用局部最佳策略以求达到全局最佳结果。 给定输入数据为A[1],A[2],…,A[n],对解附有某些约束条件 和表示最佳结果的目标函数,欲求满足约束条件的子集A[ik],使 目标函数值达到最大(或最小)。 满足约束条件的任意子集叫做可用解,使给定的目标值达到 最大(或最小)的可用解叫做最佳解。最终目的是求全局最佳解。 Dataset Gready(A, n) LIST A ; int n ; { solution = ¢; for( i = 1; i = n; i++ ) { x = select(A); if ( feasible( solution, x ) ) solution = union ( solution , x ) ; } return solution ; } select 对 A 确定一种取值办法;每步对 一个x=A[i]作出判断:x是否可以包含在 最佳解中?若x加入局部最佳解时就产生 不可用解,放弃x,另作选择。 union将x和solution结合成新的解向量,并 修改目标函数的值。 贪心法 在贪心算法(greedy method)中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则(greedy criterion)。 [例找零钱] 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。售货员分步骤组成要找的零钱数,每次加入一个硬币。选择硬币时所采用的贪婪准则如下:每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。 假设需要找给小孩6 7美分,首先入选的是两枚2 5美分的硬币,第三枚入选的不能是2 5美分的硬币,否则硬币的选择将不可行(零钱总数超过6 7美分),第三枚应选择1 0美分的硬币,然后是5美分的,最后加入两个1美分的硬币。 背包问题 设有n个对象和一个背包。对象的重量为wi。背包容量为M(重量)。 若将对象i的一部分xi(0≤xi≤1;xi表示重物wi的几分之几)放入背包, 则得增益pixi,其中pi叫做重物wi的增益率。目标:在n个对象中选 取若干对象,将背包装满(所选对象的总重量不超过M),使总增 益最大。 max(∑pixi) 2.16 1≤i≤n 约束条件:∑wixi≤M 2.17 0≤xi≤1, pi0, wi0, 1≤i≤n 2.18 满足2.172.18的任意集合{x1,x2,…,xn}就是可用解 使2.16最大的可用解即最佳解 1≤i≤n 三种贪心策略: (1)局部最大增一策略:即在第i步选过之后第i+1步将当前增益 最大的未选对象装入背包;若该对象太大而溢出背包,则装 入该对象的几分之几。 (2)贪心策略之二:背包容量局部消耗最小策略。即按先轻后重 的顺序来选择对象。 (3)贪心策略之三:消耗单位容量,获取局部最大增益策略。即 按pi/wi非增加的顺序来选择对象。 31 20 (0,2/3,1) 3 31.5 20 (0,1,1/2) 4 28.2 20 (1,2/15,0) 2 24.25 16.5 (1/2,1/3,1/4) 1 ∑pixi ∑wixi x1,x2,x3 例:设n=3,M=20,(p1,p2,p3)=(25,24,15),(w1,w2,w3)=(18,15,10) 按策略1,对象1的增益率p1最大,取x1=1, 则背包容量尚余M-w1=2;对象2的增益率次 之,但w2=15,不能全部装入,故令x2=2/15,得解2。 按策略2,首先取x3=1,次取x2=2/3,得解3。 按策略3,得解4,这才是最佳解。 Void KnapSack (LIST w ; int m ; LIST x ; int n ) { int i , cu ; for ( i = 1
文档评论(0)