第四章贪心算法4教材课程.ppt

  1. 1、本文档共77页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章.贪心算法(Greed method) ; 将问题的求解过程看作是一系列选择,每次选择一个输入,每次选择都是当前状态下的最好选择(局部最优解).每作一次选择后,所求问题会简化为一个规模更小的子问题.从而通过每一步的最优解逐步达到整体的最优解。;[适用问题] 具备贪心选择和最优子结构性质的最优化问题 贪心选择性质:整体的最优解可通过一系列局部最优解达到,即贪心选择到达。 贪心算法通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求解的问题化简为规模更小的问题 对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终导致问题的最优解。通常可以首先证明问题的一个整体最优解,是从 贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体 最优解。 最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。;4.2.活动安排问题; 1 2 3 4 5 6 7 8 9 10 11;活动安排问题贪心算法; 算法greedySelector 的计算过程如左图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。;由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。 算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。 ;[问题描述] 输入:(x1,x2,...xn), xi=0,货箱i不装船; xi=1,货箱i装船 可行解: 满足约束条件 ≤c 的输入 优化函数: 最优解:使优??函数达到最大值的一种输入.;1、最优装载的贪心算法;2、贪心选择性质 可以证明最优装载问题具有贪心选择性质。 3、最优子结构性质 最优装载问题具有最优子结构性质。 算法证明:由最优装载问题的贪心选择性质和最优子结构性质,容易证明算法loading的正确性。 算法分析:算法loading的主要计算量在于将集装箱依其重量从小到大排序,故算法所需的计算时间为 O(nlogn)。 ;[最优化描述] 找一个n元向量(x1,…xn) 0? xi ?1 使得 且 .其中 C, Wi, vi0 , 1 ? i ? n;背包问题实例;贪心方法的数据选择策略(1);贪心方法的数据选择策略(2);贪心方法的数据选择策略(3);[算法思路]1).将各物体按单位价值由高到低排序. 2).取价值最高者放入背包. 3).计算背包剩余空间. 4).在剩余物体中取价值最高者放入背包. 若背包剩余容量=0或物体全部装入背包为止;void Knapsack(int n,float M,float v[ ],float w[ ] ,float x[ ]) { Sort(n, v, w,t); //按单位价值排序/ int i; for (i =1;i = n;i++) x[i] = 0; float c = M; //c为背包剩余空间/ for (i =1;i = n;i ++) { if (w[t[i]] c) break; x[t[i]]= 1; c-= w[t[i]]; } if(i= n) x[t[i]] = c/w[t[i]]; } ;算法分析: ;void Knapsack(int n,float M,float v[],float w[],float x[]) { Sort(n,v,w); int i; for (i=1;i=n;i++) x[i]=0; float c=M; for (i=1;i=n;i++)

文档评论(0)

yuzongxu123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档