[高等教育]Chapter13-贪婪算法-1.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[高等教育]Chapter13-贪婪算法-1

* * 货箱装载的C++算法实现 void IndirectSort(int w[], int t[], int n) { //假设w已经按照重 量升序排列 for (int i=1; i = n; i++) t[i] = i; } * * templateclass T bool IndirectListT::Bubble(int n) { bool swapped = false; // no swaps so far for (int i = 0; i n - 1; i++) if (*table[i] *table[i+1]) { Swap(table[i], table[i + 1]); swapped = true; } return swapped; } templateclass T IndirectListT IndirectListT::BubbleSort() { for (int i = length; i 1 Bubble(i); i--); return *this; } * * 3、应用2:0/1背包问题 * * 几种贪婪策略 价值贪婪准则:从剩余的物品中,挑选可以装入背包的价值最大的物品 例如: n=3, w=[100,10,10], p=[20,15,15], c=105 可行解:x=[1,0,0],p=20 最优解:x=[0,1,1],p=30 并不能保证得到最优解! * * 几种贪婪策略(续1) 重量贪婪准则:从剩余的物品中,挑选可以装入背包的重量最小的物品 可以解决价值贪婪准则的问题,也不能保证得到最优解 例如:n=2, w=[10,20], p=[5,100], c=25 可行解:x=[1,0], p=5 最优解:x=[0,1], p=100 * * 几种贪婪策略(续2) 价值密度准则:定义pi/wi,从剩余的物品中,挑选可以装入背包的价值密度最大的物品 例如:n=2, w=[10,20], p=[5,100], c=25 直觉上接近最优解,作为一个启发算法 启发式贪婪算法,不能保证得到最优解 * * 改进算法 首先,最多将k件物品放入背包; 如这k件物品重量大于c, 则放弃 否则考虑用剩下的容量,将剩余物品按照pi/wi的递减顺序装入 * * 示例 n=4, w=[2,4,6,7], p=[6,10,12,13], c=11 k=0, x=[1,1,0,0], p=16, 剩余5个单元 k=1, 初始子集{1}, {2}, {3}, {4} {1}{2}: x=[1,1,0,0], p=16 {3}: x={1,0,1,0}, p=18 {4}: x={1,0,0,1}, p=19,最优解 * * 示例-续 n=4, w=[2,4,6,7], p=[6,10,12,13], c=11, k=2, {1,2}, x=[1,1,0,0], p=16 {1,3}, x=[1,0,1,0], p=18 {1,4}, x=[1,0,0,1], p=19 {2,3}, x=[0,1,1,0], p=22 {2,4}, x=[0,1,0,1], p=23, 最优解 {3,4}, 不可能! * * 3、应用3:拓扑排序 拓扑排序:由某个集合上一个偏序关系得到一个全序关系 * * 1 2 3 4 5 6 算法思想 1. 在有序图上选取 一个没有前驱的顶点 并输出 2. 从该图中删除该顶 点以及所有以它为弧 尾的弧 序列1:2-1-3-4-5-6 序列2:2-5-1-3-4-6 * * 拓扑排序的特点 拓扑排序输出的序列可能有多种! 利用拓扑排序,可以判断一个有向图是否为有向无环图 算法失败:表示有向图中有环路 * * 拓扑排序用贪婪算法实现 设n是有向图中的顶点数 设V是一个空序列 While(true){ 设w不存在入边(v,w),其中顶点v不在V中 如果没有这样的w,break。 把w添加到V的尾部 } If(V中的顶点个数少于n)算法失败 else V是一个拓扑序列 * * 拓扑排序的实现 (1)数据结构的选择 实现方法:将序列V用一维数组v来描述,用一个栈来保存加入V的候选顶点;另有一个一维数组InDegree,InDegree[j]表示与顶点j相连的节点i的数目,其中顶点i不是V中的成员,它们之间的有向图的边表示为(i,j)。 NetWork: 修改有向图的基类函数 * * bool Network::Topological(int v[]) { int n = Vertices(); int *InDegree = new int [n+1];

文档评论(0)

skvdnd51 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档