收藏 分享(赏)

1、贪心算法实例.ppt

上传人:dzzj200808 文档编号:5750124 上传时间:2019-03-15 格式:PPT 页数:36 大小:364KB
下载 相关 举报
1、贪心算法实例.ppt_第1页
第1页 / 共36页
1、贪心算法实例.ppt_第2页
第2页 / 共36页
1、贪心算法实例.ppt_第3页
第3页 / 共36页
1、贪心算法实例.ppt_第4页
第4页 / 共36页
1、贪心算法实例.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、1,数学建模竞赛中十类常用算法,1. 蒙特卡罗算法。该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性。 2. 数据拟合、参数估计、插值等数据处理算法。比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用MATLAB 作为工具。,2,3. 线性规划、整数规划、多元规划、二次规划等规划类算法。建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lingo 软件求解。 4. 图论算法。这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决。 5. 动态规划、

2、回溯搜索、分治算法、分支定界等计算机算法。这些算法是算法设计中比较常用的方法, 竞赛中很多场合会用到。,3,6. 最优化理论的三大非经典算法:模拟退火算法、神经网络算法、遗传算法。这些问题是用来解决一 些较困难的最优化问题的,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用。 7. 网格算法和穷举法。两者都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本 身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具。 8. 一些连续数据离散化方法。很多问题都是实际来的,数据可以是连续的,而计算机只能处理离散的 数据,因此将其离散化后进行差分代替微分、求和代

3、替积分等思想是非常重要的。,4,9. 数值分析算法。如果在比赛中采用高级语言进行编程的话,那些数值分析中常用的算法比如方程组 求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用。 10. 图象处理算法。赛题中有一类问题与图形有关,即使问题与图形无关,论文中也会需要图片来说明 问题,这些图形如何展示以及如何处理就是需要解决的问题,通常使用MATLAB 进行处理。,5,贪心算法,6,有下面几种面值的硬币:一元、五角、一角、五分、一分,假设要付给顾客2.89元的零钱,要求用最少的硬币。,问题引入:,7,顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作

4、出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。,8,主要知识点: 活动安排问题 背包问题 最优装载 单源最短路径 最小生成树,9,活动安排问题,活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。

5、,10,活动安排问题,设有n个活动的集合E=1,2,n,其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si fi 。如果选择了活动i,则它在半开时间区间si, fi)内占用资源。若区间si, fi)与区间sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当sifj或sjfi时,活动i与活动j相容。,11,活动安排问题,在下面所给出的解活动安排问题的贪心算法greedySelector : int greedySelector(int s, int f, boolean a)i

6、nt n=s.length-1;a1=true;int j=1;int count=1;for (int i=2;i=fj) ai=true;j=i;count+;else ai=false;return count;,各活动的起始时间和结束时间存储于数组s和f中且按结束时间的非减序排列,12,活动安排问题,例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:,13,活动安排问题,若被检查的活动i的开始时间Si小于最近选择的活动j的结束时间fi,则不选择活动i,否则选择活动i加入集合A中。 贪心算法并不总能求得问题的整体最优解。但对于活动安排问题,贪心算法greedySel

7、ector却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。,14,给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?(假定物品可以分割成更小部分,亦即物品可以部分装入),背包问题,15,例:,有5件物品,背包的容量为100,物品的重量和价值分别如下所示:,16,这个问题有三种看似合理的选择:,1、每次选择剩余物品中价值最大的,2、每次选择剩余物品中重量最轻的,3、每次选择剩余物品中单位重量价值最高的。,17,用贪心算法解背包问题的基本步骤: 首先计算每种物品单位重量

8、的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。具体算法可描述如下页:,18,float knapsack(float c,float w, float v,float x)int n=v.length;for (int i = 0; i c) break;xdi.i=1;opt+=di.v;c-=di.w;if (in)xdi.i=c/di.w;opt+=xdi.i*di.v;return opt;,19,最优

9、装载,有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。 1.算法描述最优装载问题可用贪心算法求解。采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。具体算法描述如下页。,20,float loading(float c, float w, int x)int n=w.length;for (int i = 0; i n; i+)di = (wi,i);MergeSort.mergeSort(d);float opt=0;for (int i = 0; i n; i+) xi = 0;for

10、 (int i = 0; i n ,21,单源最短路径,给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。算法基本思想Dijkstra算法是解单源最短路径问题的贪心算法。,22,单源最短路径,其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点

11、所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。,23,Void dijkstra(int v,float a,float dist) for (int i=1;i=n;i+) disti=avi;si=false; distv=0;sv=true; For (int I=1;In;I+) float temp=MAX_Value;int u=v;for (int j=1;j=n;j+)if(! sj) ,24,单源最短路径

12、,例如,对右图中的有向图,应用Dijkstra算法计算从源顶点1到其他顶点间最短路径的过程列在下页的表中。,25,单源最短路径,Dijkstra算法的迭代过程:,26,最小生成树,设G =(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为cvw。如果G的子图G是一棵包含G的所有顶点的树,则称G为G的生成树。生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。网络的最小生成树在实际中有广泛应用。例如,在设计通信网络时,用图的顶点表示城市,用边(v,w)的权cvw表示建立城市v和城市w之间的通信线路所需的费用,则最小生成树就给出了建立通信

13、网络的最经济的方案。,27,最小生成树,1.最小生成树性质用贪心算法设计策略可以设计出构造最小生成树的有效算法。本节介绍的构造最小生成树的Prim算法和Kruskal算法都可以看作是应用贪心算法设计策略的例子。尽管这2个算法做贪心选择的方式不同,它们都利用了下面的最小生成树性质:设G=(V,E)是连通带权图,U是V的真子集。如果(u,v)E,且uU,vV-U,且在所有这样的边中,(u,v)的权cuv最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为MST性质。,28,最小生成树,2.Prim算法 设G=(V,E)是连通带权图,V=1,2,n。构造G的最小生成树

14、的Prim算法的基本思想是:首先置S=1,然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件iS,jV-S,且cij最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。,29,最小生成树,利用最小生成树性质和数学归纳法容易证明,上述算法中的边集合T始终包含G的某棵最小生成树中的边。因此,在算法结束时,T中的所有边构成G的一棵最小生成树。 例如,对于右图中的带权图,按Prim算法选取边的过程如下页图所示。,30,最小生成树,31,最小生成树,在上述Prim算法中,还应当考虑如何有效地找出满足条件iS,jV-S,且权cij最小

15、的边(i,j)。实现这个目的的较简单的办法是设置2个数组closest和lowcost。在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closestj),最后将j添加到S中,并对closest和lowcost作必要的修改。用这个办法实现的Prim算法所需的计算时间为,32,void prim(int n,float c) s1=true;for (int i=2;i=n;i+) lowcosti=c1i;closesti=1;si=false;for(int i=1;in;i+)min=MAX_Value;int j=1;for(

16、int k=2;k=n;k+)if (lowcostkmin) ,sj=true;for(int k=2;k=n;k+)if(cjk,lowcostk) ,33,最小生成树,3.Kruskal算法Kruskal算法构造G的最小生成树的基本思想是,首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连

17、通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止。,34,最小生成树,例如,对前面的连通带权图,按Kruskal算法顺序得到的最小生成树上的边如下图所示。,35,最小生成树,关于集合的一些基本运算可用于实现Kruskal算法。 按权的递增顺序查看等价于对优先队列执行removeMin运算。可以用堆实现这个优先队列。 对一个由连通分支组成的集合不断进行修改,需要用到抽象数据类型并查集UnionFind所支持的基本运算。当图的边数为e时,Kruskal算法所需的计算时间是 。当 时,Kruskal算法比Prim算法差,但当 时,Kruskal算法却比Prim算法好得多。,36,练习:,1、设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1=i=n。应如何安排n个顾客的服务次序才能使得总的等待时间最小?如何有S处提供服务呢?,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报