贪婪法
贪婪算法是一种什么方法

贪婪算法是一种什么方法贪婪算法(Greedy Algorithm)是一种简单而经典的算法设计方法,通常用于解决优化问题。
贪婪算法每一步都采取当前情况下最优的选择,希望最终得到全局最优解。
本文将介绍贪婪算法的基本原理、应用场景以及一些经典的贪婪算法实例。
基本原理贪婪算法的基本原理是通过局部最优解来推导得到全局最优解。
在每一步中,贪婪算法选择当前看起来最好的选择,而不考虑之后的结果能否达到最优。
这种直观的选择策略有时可以给出全局最优解,但并非在所有问题中都成立。
贪婪算法的设计过程通常包含以下几个步骤:1. 定义问题的解空间和解集合,将问题转化成对这些解的选择和判定。
2. 根据问题的特点,设计选择策略,确定选择的标准。
3. 使用选择策略,逐步构建解,直到满足问题要求或无法继续选择。
需要注意的是,贪婪算法只能提供近似解,不能保证一定能得到最优解。
因此,在应用贪婪算法时需要仔细分析问题的性质,确定贪婪选择的合理性。
应用场景贪婪算法通常应用于具有贪婪选择性质的问题,即每一步都可以做出局部最优选择的问题。
这种性质常见于以下场景:最小生成树在图论中,最小生成树问题是指在一个连通无向图中找到一棵包含所有顶点且边权重之和最小的树。
典型的贪婪算法解决该问题的方法是普利姆算法(Prim's Algorithm)和克鲁斯卡尔算法(Kruskal's Algorithm)。
普利姆算法从一个起始顶点出发,每次选择与当前生成树连接的最短边对应的顶点,直到生成树包含所有顶点。
而克鲁斯卡尔算法则是从边集合中每次选择最小的边,同时保证不形成环,直到生成树包含所有顶点。
背包问题背包问题是在给定背包容量和一系列物品的重量和价值的情况下,如何选择物品放入背包中,使得背包中物品的总价值最大。
贪婪算法在背包问题的解决中有时也能给出较好的近似解。
一种典型的贪婪算法解决背包问题的方法是基于每个物品的单位价值(即单位重量所能获得的价值)来进行选择。
10算法策略之贪婪法

10算法策略之贪婪法贪婪算法贪婪法⼜叫登⼭法, 它的根本思想是逐步到达⼭顶,即逐步获得最优解。
贪婪算法没有固定的算法框架,算法设计的关键是贪婪策略的选择。
⼀定要注意,选择的贪婪策略要具有⽆后向性。
某状态以后的过程和不会影响以前的状态,只与当前状态或以前的状态有关,称这种特性为⽆后效性。
可绝对贪婪问题【例1】键盘输⼊⼀个⾼精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成⼀个新的正整数。
编程对给定的N和S,寻找⼀种⽅案使得剩下的数字组成的新数最⼩。
输⼊数据均不需判错。
输出应包括所去掉的数字的位置和组成的新的正整数(N不超过240位)。
数据结构设计:对⾼精度正整数的运算在上⼀节我们刚刚接触过,和那⾥⼀样,将输⼊的⾼精度数存储为字符串格式。
根据输出要求设置数组,在删除数字时记录其位置。
我们采⽤⽅法1)。
⼀种简单的控制相邻数字⽐较的⽅法是每次从头开始,最多删除s次,也就从头⽐较s次。
按题⽬要求设置数组data记录删除的数字所在位置。
较s次。
按题⽬要求设置数组data记录删除的数字所在位置delete(char n[],int b,int k){int i;for(i=b;i<= length(n)-k;i=i+1) n[i]=n[i+k];}main(){char n[100]; int s,i,j,j1,c,data[100],len;input(n); input(s); len=length(n);if(s>len){print(“data error”); return;}j1=0;for (i=1;i<=s ;i=i+1){for (j=1;j<length(n);j=j+1)if (n[j]>n[j+1]) //贪婪选择{delete(n,j,1);if (j>j1) data[i]=j+i; //记录删除数字位置else //实例2向前删除的情况实例data[i]=data[i-1]-1;j1=j; break; }if( j>length(n)) break;}for (i=i;i<=s;i=i+1){ j=len-i+1;delete(n,j,1); data[i]=j;}while (n[1]='0' and length(n) >1)delete(n,1,1); //将字符串⾸的若⼲个“0”去掉 print(n);for (i=1;i<=s;i=i+1)print(data[i],' ');}算法说明1:注意记录删除位置不⼀定是要删除数字d的下标,因为有可能d的前或后有可能已经有字符被删除,d的前⾯已经有元素删除容易想到,但⼀定不要忽略了其后也有可能已删除了字符,实例2中删除1时,其后的2已被删除。
贪婪法PPT课件

2.2 最优子结构性质
❖最优子结构是指:一个问题的最优解 中包含它的子问题的最优解
❖例如,用合理的一套钱币实现最小兑 现问题,就满足最优子结构性质
❖当钱币面值是10、5、1时,要兑现26, 则可以用{10、10、5、1}实现。第一步 实现(取10)后,剩余问题的最优解是 {10、5、1},是整个问题最优解的子集, 满足最优子结构性质
2. 贪婪法要满足的性质
用贪婪法解决问题时,并不能保证它能找到最 优解。但是,当问题满足下面两个性质时,贪 婪法可以找到问题的最优解。
2.1 贪婪选择性质 2.2 最优子结构性质
2.1 贪婪选择性质
❖贪婪选择性质是指:所求问题的全局 最优解,可以通过一系列的局部最优的 选择来达到
❖每进行一次选择,就得到一个局部的 解,并把所求解的问题简化为一个规模 更小的类似子问题
对任务3,找到当前花费最小的人员b∊{b, d}; -- 10
对任务4,找到当前花费最小的人员d∊{d}; -- 14
贪婪法解决任务分配问题的时间复杂度是O(n2)
4. 贪婪法完全成功解决的例子
4.1 连续背包问题 4.2 单源最短路径问题 4.3 Kruskal算法求解最小生成树 4.4 Prim算法求解最小生成树 4.5 钓鱼问题
❖三个贪心算法的复杂度都是O(nlogn),都不能确保 求得最优解
3.4 任务分配问题
任务1 9 6 5 7
任务2 2 4 8 6
任务3 7 3 1 9
任务4 8 7 8 4
人员a 人员b 人员c 人员d
对任务1,找到当前花费最小的人员c∊{a, b, c, d};--5
对任务2,找到当前花费最小的人员a∊{a, b, d}; -- 7
算法复习题

算法复习试题一、名词解释:1、算法:就是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。
2、贪心算法:能够得到某种量度意义下的最优解的分级处理方法称为贪心算法。
3、分治法:分治法的求解思想就是把整个问题分成若干个小问题后分的治之4、递归过程:一个递归过程的执行类似于多个子程序的嵌套调用,递归过程是自己调用自己本身代码。
递归算法的特点:思路清晰,算法的描述简洁且易理解。
5、集合:在研究某一类对象时,可把这类对象的整体称为集合。
6、生成树:设G=(V,E)是一个无向连通图。
如果G的生成子图T=(V,E')是一棵树,则称T是G的一棵生成树。
7、算法具有以下5个属性:有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口可行性:就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
8、迭代法:称辗转法,是一种不断用变量的旧值递推出新值的解决问题的方法。
9、贪婪法: 是一种不追求最优解,只希望得到较为满意解的方法。
贪婪法不要回溯10、动态规划:是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
11、分支限界法:是一种用于求解组合优化问题的排除非解的搜索算法。
12、树:树是一个或多个结点的有限集合。
12、二元树:它是结点的有限集合,它或者为空,或者由一个根和两棵树(左子树和右子树)的不相交的二元树所组成。
13、二分检索树:T是一棵二元树,它或者为空,或者其每个结点含有一个可比较大小的数据元素。
14、图:图是数据结构,一个图G是由称之为结点V和边E的两个集合组成的15、最优解:使目标函数取极值(极大值或极小值)的可行解。
一种新的基于贪婪法的CDM时隙分配最优化算法

一种新的基于贪婪法的CDM时隙分配最优化算法
CDM(Code Division Multiple Access),即码分多址技术,是一种
用于多址无线通信中的无线传输技术,具有高效和灵活的多路复用技术。
CDM系统在发送信号之前先把信号分成多个片段,每个片段采用不同的码,用户再根据码的信息把它重新组合起来,实现多用户同时传输技术。
在CDM系统中,时隙分配问题可被定义为在一个时刻分配一组有限的
时隙给一组用户来实现信息的传输,从而达到传输性能最优化。
贪婪法是
一种用于求解时隙分配问题的经典算法,它通过贪婪的方式实现信息传输
性能的最优化。
贪婪法的CDM时隙分配最优化算法是基于贪婪法的一种时隙分配算法,它可以有效地满足在CDM中的时隙分配问题,每次尝试寻求最优的时隙分
配方案,而不考虑未来的计算需求。
该算法的核心步骤分为四个部分:
(1)初始化:将有限的时隙分配给每个用户;
(2)寻找改善空间:计算每一个用户当前时隙分配的传输性能,以
及该用户可能的改善空间,改善空间的计算基于用户若分配更多时隙后所
能改善的性能;
(3)改善时隙分配:选取改善空间最大的用户,把多余的时隙分配
给该用户;。
一种新的基于贪婪法的CDM时隙分配最优化算法

一种新的基于贪婪法的CDM时隙分配最优化算法贪婪法是一种常见的启发式算法,常用于解决最优化问题。
在通信领域中,时隙分配是一项重要的任务,尤其是在CDM(Code Division Multiplexing)系统中。
CDM系统是一种多用户共享信道的技术,它通过为每个用户分配不同的码片,实现用户之间的分离和通信。
CDM时隙分配的目标是最大化系统的吞吐量和性能。
在传统的CDM时隙分配问题中,通常采用最大化用户吞吐量为目标的优化算法,如遗传算法、粒子群算法等。
然而,这些算法需要大量的计算资源和时间,导致算法的运行效率低下。
为了解决这个问题,我们提出了一种新的基于贪婪法的CDM时隙分配最优化算法。
该算法基于以下原则进行时隙分配:1.用户选择:首先根据各用户的信道质量和需求进行排序,选择质量较好且需求较大的用户作为优先选择对象。
2.时隙分配:从优先选择的用户开始,依次分配码片。
对于每个用户,根据其信道质量和需求,选择最佳的码片分配方式。
具体的分配方式可以根据具体的问题而定,例如最大化用户信道容量、最小化用户间干扰等。
3.反馈机制:在每次时隙分配后,更新用户的信道质量和需求。
如果用户的信道质量或需求发生变化,则重新排序用户并重新进行时隙分配。
这样可以保证系统的时隙分配始终基于最新的信息,以获得更好的系统性能。
4.贪婪策略:在时隙分配过程中,采用贪婪策略选择最佳的码片。
例如,对于每个用户,选择能够给其带来最大收益的码片。
这样可以有效地减少空间,提高算法的运行效率。
通过以上原则,我们的算法可以在保证用户需求的同时,最大化系统的吞吐量和性能。
相比传统的优化算法,我们的算法具有以下优点:1.算法效率高:由于采用了贪婪策略,我们的算法避免了大量的和计算,具有较高的运行效率。
2.算法简单:我们的算法只需要实现简单的贪婪策略和反馈机制,不需要复杂的优化算法,易于实现和部署。
3.算法灵活:我们的算法可以根据具体的问题进行调整和改进,灵活适应不同的应用场景。
贪婪法

贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速 得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪 法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回 溯。
例如平时购物找钱时,为使找回的零钱的硬币数最少,不考虑找零钱的所有各种发 表方案,而是从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币 种,当不足大面值币种的金额时才去考虑下一种较小面值的币种。这就是在使用贪婪法。 这种方法在这里总是最优,是因为银行对其发行的硬币种类和硬币面值的巧妙安排。如 只有面值分别为 1、5 和 11 单位的硬币,而希望找回总额为 15 单位的硬币。按贪婪算法, 应找 1 个 11 单位面值的硬币和 4 个 1 单位面值的硬币,共找回 5 个硬币。但最优的解应 是 3 个 5 单位面值的硬币。
void main() { int sx,sy,i,j,step,no,start;
for (sx=0;sx<8;sx++) for (sy=0;sy<8;sy++) { start=0; do { for (i=0;i<8;i++) for (j=0;j<8;j++) board[i][j]=0; board[sx][sy]=1;
【程序】 # include int delta_i[ ]={2,1,-1,-2,-2,-1,1,2}; int delta_j[ ]={1,2,2,1,-1,-2,-2,-1}; int board[8][8]; int exitn(int i,int j,int s,int a[ ]) { int i1,j1,k,count;
贪心法

贪心法贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择。
也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
当然,希望贪心算法得到的最终结果也是整体最优的。
虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。
如单源最短路经问题,最小生成树问题等。
在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
贪心法的设计思想当一个问题具有以下的性质时可以用贪心算法求解:每一步的局部最优解,同事也说整个问题的最优解。
如果一个问题可以用贪心算法解决,那么贪心通常是解决这个问题的最好的方法。
贪婪算法一般比其他方法例如动态规划更有效。
但是贪婪算法不能总是被应用。
例如,部分背包问题可以使用贪心解决,但是不能解决0-1背包问题。
贪婪算法有时也用用来得到一个近似优化问题。
例如,旅行商问题是一个NP难问题。
贪婪选择这个问题是选择最近的并且从当前城市每一步。
这个解决方案并不总是产生最好的最优解,但可以用来得到一个近似最优解。
让我们考虑一下任务选择的贪婪算法的问题, 作为我们的第一个例子。
问题:给出n个任务和每个任务的开始和结束时间。
找出可以完成的任务的最大数量,在同一时刻只能做一个任务。
例子:下面的6个任务:start[] = {1, 3, 0, 5, 8, 5};finish[] = {2, 4, 6, 7, 9, 9};最多可完成的任务是:{0, 1, 3, 4}贪婪的选择是总是选择下一个任务的完成时间至少在剩下的任务和开始时间大于或等于以前选择任务的完成时间。
我们可以根据他们的任务完成时间,以便我们总是认为下一个任务是最小完成时间的任务。
1)按照完成时间对任务排序2)选择第一个任务排序数组元素和打印。
3) 继续以下剩余的任务排序数组。
……a)如果这一任务的开始时间大于先前选择任务的完成时间然后选择这个任务和打印。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
贪婪法
例 货币兑付问题:用最少的货币张数支付现金。
集合},,,{21n p p p P L =表示n 张面值为i p 的货币,n i ≤≤1, 出纳员需支付的现金为A ,从P 中选取一个最小的子集S ,使得
S p i ∈ 并且
A p
i
=∑
用向量),,,(21n x x x X L =表示S 中所选取的货币,使得:
⎩⎨
⎧∉∈=S
p S p x i i i 0
1
那么,出纳员支付的现金必须满足:
A p
x i
n
i i =∑=1
(5.0.1)
并且使得:
∑==n
i i
x
d 1
min
(5.0.2)
向量X 称为问题的解向量, 所有向量的全体称为问题的解空间。
(5.0.1)式称为问题的约束方程, (5.0.2)式称为问题的目标函数。
满足约束方程的向量称为问题的可行解。
满足目标函数的向量称为问题的最优解。
贪婪法引言
贪婪法的设计思想
贪婪法的设计方法描述如下:
greedy(A,n) {
2
solution = ϕ; for (i=1;i<n;i++) { x = select(A);
if (feasible(solution,x))
solution = union(solution,x);
}
return solution; }
适于贪婪法求解的问题,具有两个重要性质:贪婪选择性质和最优子结构性质。
贪婪选择性质,是指所求问题的全局最优解,可以通过一系列局部最优的选择来达到。
例:从10张10元、10张5元、10张1元、10张5角、10张2角、10张1角的货币中兑付57元8角
集合},,,{6021p p p P L =顺序表示货币; 向量),,,(6021x x x X L =表示支付给客户的货币。
第一步挑出的货币集合}{11p S =,局部解),0,1(1L =Y , 问题简化为在集合},,{6021p p P L =中挑选货币、付出47元8角
在以后的步骤中,可以用同样的方法进行挑选,并能得到问题的全局最优解。
最优子结构:指问题的最优解,包含它的子问题的最优解。
付给客户的货币集合的最优解是},,,,,,,,,,{51413122211154321p p p p p p p p p p p S n =。
第一步所简化了的子问题的最优解是},,,,,,,,,{51413122211154321p p p p p p p p p p S n =−。
n n S S ⊂−1,并且n n S p S =∪−}{11。
所以,出纳员付钱问题具有最优子结构性质。
贪婪法的例子,货郎担问题
例 货郎担问题。
5个城市,费用矩阵如图5.1所示。
1 2 3 4 5 5个城市的费用矩阵
总是选择费用最小的路线前进,选择的路线是1→4→3→5→2→1,总费用是14。
只选择一个城市作为出发城市,所需时间是)(2n O 。
n 个城市都可以作为出发城市,所需时间是)(3n O 。
从城市1出发的最优的路线是1→2→5→4→3→1,总费用只有13。
3
1 1 1
6 3 5 2 5 2 2 5 2 2 2 3 3
3 5 7
4 3 4 2 3 4 2 3
1 2 5 2 2 2 5
4 2 3
货郎担问题的求解过程
5.2 背包问题
载重量为M 的背包,重量为i w 、价值为i p 的物体,n i ≤≤1,把物体装满背包,使背包内的物体价值最大
物体可以分割的背包问题,及物体不可分割的背包问题,把后者称为0/1背包问题。
背包问题贪婪算法的实现
解向量),,,(21n x x x X L =
i x :物体i 被装入背包的部分,10≤≤i x , 0=i x :物体i 没被装入背包; 1=i x :物体i 被全部装入背包
约束方程:
M x
w i
n
i i =∑=1
(5.2.1)
目标函数: i n
i i x p d ∑==1
max
(5.2.2)
价值重量比最大:既使目标函数的值增加最快,又使背包载重量的消耗较慢。
数据结构:
typedef struct {
float p; /* n 个物体的价值 */ float w; /* n 个物体的重量 */ float v; /* n 个物体的价值重量比 */ } OBJECT;
4
OBJECT instance[n];
float x[n]; /* n 个物体装入背包的份量 */
算法 贪婪法求解背包问题
输入:背包载重量M,存放n 个物体的价值p 、及重量w 信息的数组instance[] 输出:n 个物体被装入背包的份量x[],背包中物体的总价值
1. float knapsack_greedy(float M,OBJECT instance[],float x[],int n)
2. {
3. int i;
4. float m,p = 0;
5. for (i=0;i<n;i++) { /* 计算物体的价值重量比 */
6. instance[i].v = instance[i].p / instance[i].w;
7. x[i] = 0;
/* 解向量赋初值 */
8. }
9. merge_sort(instance,n); /* 按关键值v 的递减顺序排序物体 */ 10. m = M;
/* 背包的剩余载重量 */
11. for (i=0;i<n;i++) {
12. if (instance[i].w<=m) {
/* 优先装入价值重量比大的物体 */
13. x[i] = 1; m -= instance[i].w;
14. p += instance[i].p; 15. } 16. else {
/* 最后一个物体的装入份量 */
17. x[i] = m / instance[i].w; 18. p += x[i] * instance[i].p; 19. break; 20. } 21. }
22. return p; 23. }
背包问题贪婪算法的分析
一、时间复杂性为)log (n n Θ。
需要)(n Θ工作空间,用来存放物体的价值重量比。
二、算法的正确性
定理5.1 当物体的价值重量比按递减顺序排序后,算法knapsack_greedy 可求得背包问题的最优解。
证明 设解向量),,,(21n x x x X L =,分两种情况:
(1) 若在解向量X 中,n i x i ~1,1==,物体已全部装入,则X 就是最优解; (2) 若在解向量X 中,存在n j j <≤1,,使得1121====−j x x x L ,10<≤j x ,
5
01===+n j x x L ,由算法的实现,有:
M M x
w i
n
i i ==∑=11
(5.2.3)
假定,算法的最优解是),,,(21n y y y Y L =,并且满足:
M M y
w i
n
i i ==∑=21
(5.2.4)
若Y X ≠,必存在n k k <≤1,,对k i <≤1,有i i y x =,对k ,有k k y x ≠,这时,有两种情况:
① 若k k y x <,因为1≤k y ,必有1<k x 。
根据算法的执行,有01===+n k x x L 。
所以,21M M <,与(5.2.3)、(5.2.4)式矛盾。
因此,只有Y X =。
② 若k k y x >,有:
i
k
i i i
k i i i
n i i y w x w x w M ∑∑∑===>≥=
1
1
1
所以,n k y y ,,1L +不会全为0。
令k k k x y y =Δ+,并使n k y y ,,1L +都相应减少,得到新的解),,,(21n z z z Z L =,
当k i <≤1时有:i i i x y z ==;当k i =时有:k k k x z y =<;当n i k ≤<时有:i i y z <,并且满足:
0)()(1
=−−
−∑+=i i n
k i i
k k k w z y
w y z
令:
n n n n n k k k k k k k k k k w z y w p
w z y w p w y z w p )()()(11111−−−−−−=+++++L δ ))()()((111n n n k k k k k k k
k
w z y w z y w y z w p −−−−−−≥
+++L 0=
若0>δ,则Z 是一个新的最优解;若0=δ,则Z 与Y 同为最优解。
在此两种情况下,都用Z 取代Y ,并且对所有的k i ≤≤1,都有:i i x z =,而对n i k ≤≤+1,有:i i x z ≠。
对向量Z 重复上述①②步骤,最终必有:对所有的n i ≤≤1,都有:i i x z =。
因此,X 是最优解。