贪婪算法在资源分配问题中的应用----彭鹏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪婪算法在资源分配问题中的应用
彭鹏
贵州财经学院研究生
摘要:贪婪算法的典型应用是解决优化问题,这类算法的策略是只顾眼前,而不考虑以后的影响,它的算法简单容易设计实现,因此在许多实际问题中得到广泛的应用,但是它也存在许多的问题,巧妙的使用贪婪思想,将其融入到资源分配问题中解题中,资源分配问题便焕发出了新的光彩。
本文首先对贪婪算法的基本概念做了介绍,然后通过实例论述了贪婪算法在资源分配问题中的应用。
关键字:贪婪算法研究应用资源分配问题
第一章贪婪算法的概念
1.1什么是贪婪算法
贪婪算法是一种对某些求最优解问题的更简单、更迅速的设计技术。
用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。
贪婪算法是一种改进了的分级处理方法。
其核心是根据题意选取一种量度标准。
然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量。
如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。
这种能够得到某种量度意义下最优解的分级处理方法称为贪婪算法。
对于一个给定的问题,往往可能有好几种量度标准。
初看起来,这些量度标准似乎都是可取的,但实际上,用其中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并不是问题的最优解,而是次优解。
因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。
一般情况下,要选出最优量度标准并不是一件容易的事,但对某问题能选择出最优量度标准后,用贪婪算法求解则特别有效。
最优解可以通过一系列局部最优的选择即贪婪选择来达到,根据当前状态做出在当前看来是最好的选择,即局部最优解选择,然后再去解做出这个选择后产生的相应的子问题。
每做一次贪婪选择就将所求问题简化为一个规模更小的子
问题,最终可得到问题的一个整体最优解。
2.2 贪婪算法的特征
贪婪算法及贪婪算法可解决的问题通常大部分都有如下的特性:
(1)有一个以最优方式来解决的问题。
为了构造问题的解决方案,有一个候选的对象的集合:比如不同面值的硬币。
(2)随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。
(3)有一个函数来检查一个候选对象的集合是否提供了问题的解答。
该函数不考虑此时的解决方法是否最优。
(4)还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。
和上一个函数一样,此时不考虑解决方法的最优性。
(5)选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
(6)最后,目标函数给出解的值。
为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪婪算法一步一步的进行。
起初,算法选出的候选对象的集合为空。
接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。
如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。
每一次都扩充集合,并检查该集合是否构成解。
如果贪婪算法正确工作,那么找到的第一个解通常是最优的。
2.3运用贪婪算法的思想
选择具有最早结束时间的相容活动加入,使剩余的可安排时间最大,以安排尽可能多的活动。
也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
贪婪算法的一般解题步骤:
设计中一类非常重要的问题。
每一个最优化问题都包含一组约束条件和一个优化函数,满足约束条件的问题求解方案称为问题的可行解,使优化函数取得最优值的可行解称为问题的最优解。
贪婪算法是解决最优化问题的一种基本方法。
它采用逐步构造最优解的思想,在问题求解的每一个阶段,都做出一个在一定标准下看上去最优的决策;决策一旦作出,就不可再更改。
制定决策的依据称为贪婪准则。
使用贪婪算法解决问题,通常需要做好以下几个方面的工作:
1、明确问题的求解目标。
2、分析问题所包含的约束条件。
3、建立优化函数。
优化函数通常可以通过综合分析问题的求解目标及约束条件归纳出来。
4、制定贪婪准则。
清楚问题的求解目标、所包含的约束条件及优化函数之后,就可以着手制定一个可行的贪婪准则。
贪婪准则的制定是用贪婪算法解决最优化问题的关键,它关系到问题能否得到成功解决及解决质量的高低。
下文就该思想如何解决贪婪算法在资源分配问题中的应用做了举例说明。
第二章贪婪算法在资源分配问题中的应用
下面介绍争用2个甚至多个资源时的安排:
现有m个资源,如m个多媒体教室。
有n个课程的集合E={1,2,……,n},其中每个课程都要求使用一个资源,而在同一时间内只允许一个课程使用一个资源。
每个课程使用某一资源时,为提高利用率,按照资源大小的非递减顺序安排(如果资源大小一样,可省去这个排序工作)。
每个课程i都有一个要求使用资源的起始时间si和一个结束时间fi,且si<fi。
如果选择了课程i,则它在半开时间区间[si,fi]内占用资源。
若区间[si,fi]与区间[sj,fj]不相交,则称课程i与课程j是相容的。
也就是说,当si>=fj或sj>=fi时,课程i与课程j相容。
设A是所要求安排的课程的m个最大相容课程子集,即用A[i][j]存储对最小教室所选择的课程,A[i][m]存储对最大教室所选择的课程。
若课程i在集合A[i][x]中(x=1,2,……,m),则A[i][x]必为true(存入其课程序号)。
变量J(x)用以记录最近一次加入到A[i][x]中的课程。
已知的各课程的起始时间和结束时存储于数组s和f中,且按结束时间的非减序:f1<=f2<=……<=fn排列。
如果未排序,则先按此用O(nlogn)时间排序。
其贪婪策略是:先向A[i][1]中安排,安排不下时,安排在A[i][2]中,⋯⋯直到安排在A[i][m],仍安排不下,只能另做处理。
程序如下:
Procedure GREEDY-COURSE-SELECTOR1(E,s,f,A)
begin
n←length(E);A←d;
A[1][1]←1; //A中有m个集合,分别用以存放课
/ /程安排
For x←0 to m-1 do
J[x]←x; //用以存放最近一次加入到A[J][x]
/ /中的课程序号.
For i←2 to n do
If s[i]>=f[J[1]] then
Begin
A[i][1]←I;
J[1]←i
End
Else
For k←0 to m-1 do
If s[i]>=f[J[k]] then
Begin
A[i][k]←I;
J[k]←i
End;
End;
按照上述贪婪策略,将m个资源按照利用率非递减排序,在年n个课程按结束时间非递减排序后,运用贪婪算法依次把相容课程加入到m个相容课程集合中,使该问题在相容课程安排最多时利用率也最大。
在n个课程和m个资源事先排队的情况下,用贪婪策略解此问题可以获得最佳解。
其计算复杂度至多是O(m*n),在众多的算法中执行时间最短。
第三章总结
本文通过课程安排的例题简单的介绍了贪心思想在资源分配中的简单应用。
贪心思想奇妙之处在于贪婪算法可将一个问题的解决方案视为一系列决策的结果,提高了效率。
在贪婪算法中,每用一次贪婪准则便做出一个不可撤回的决策,个最优子序列。
当一个问题具有最优子结构时,我们会想到存在着更简单、有效的方法,只要我们总是做出当前看来最好的选择就可以了。
贪婪算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,这使得算法在编码和执行的过程中都有着一定的速度优势。
如果一个问题可以同时用几种方法解决,贪婪算法应该是最好的选择之一。
但是贪婪算法并不是对所有的问题都能得到整体最优解或最理想的近似解,与回溯法等比较,它的适用区域相对狭窄许多,因此正确地判断它的应用时机十分重要,贪婪算法的优点结合其他算法的应用将是以后研究的方向。
参考文献
[1] 王晓东,计算机算法设计与分析[M] . 电子工业出版社.2001
[2] 余祥宣,崔国化,邹海明,计算机算法基础[M] . 华中科技大学出版社. 1998
[3] 徐宗本,张讲社,郑亚林. 计算智能中的仿生学:理论与算法. 北京:科学出版社,2003
[4] 苏德富、钟诚.计算机算法设计与分析.北京:电子工业出版社,2001
[5] 宋文,吴晟,杜亚军.算法设计与分析.重庆:重庆大学出版社,2001
[6] 谭浩强C程序设计(第二版).北京:清华大学出版社,1999.12.
[7] 周向臣,柯熙政.无线电接入网的体系结构研究.光通信技术,2005,6.
[8]刘玉娟,王相海.0/1背包问题的两种扩展形式及其解法[J],计算机应用研究,2006,1.
[9]钱能.c++程序设计教程[M],北京:清华大学出版社
[10]王晓东.算法分析与设计[M],北京:清华大学出版社。