首页 > 代码库 > 用遗传算法GA改进CloudSim自带的资源调度策略

用遗传算法GA改进CloudSim自带的资源调度策略

首先理解云计算里,资源调度的含义:

看了很多云计算资源调度和任务调度方面的论文,发现很多情况下这两者的意义是相同的,不知道这两者是同一件事的不同表述还是我没分清吧,任务调度或者资源调度大概就是讲这样一件事情:

用户有n个计算任务(Task),{t1,t2,t3,...tm},将这n个任务分配到m个资源(其实就是指虚拟机,Virtual Machine)上,用这m个资源来计算这n个任务(注意,一般n>m,且很多时候n>>m),直到所有任务都计算完成。如何分配使得这n个任务的总的计算时间最少?这里,总的计算时间是指,最后一个计算完成的任务的完成时刻,而不是每个任务的计算时间求和。

关于这个问题的准确的描述,引用王登科 李 忠《基于粒子群优化与蚁群优化的云计算任务调度算法》的描述:

技术分享

技术分享

举个例子:

 假设某云计算系统的一台主机上运行了3个虚拟机{VM0,VM1,VM2},它们的计算能力(即单位时间内能够执行的指令数量,CloudSim里用mips来衡量)分别是{1000,3000,500}.

某用户有5个计算任务{t0,t1,t2,t3,t4},任务大小(就是要执行的指令数量,CloudSim里用length来表示)分别是{4000,2000,2500,10000,500},提交到cloudsim系统中进行模拟运算。

根据cloudsim默认的调度策略,产生的调度结果是:VM0={t0,t3},VM1={t1,t4},VM2={t2}

由于VM0,VM1,VM2并行执行,互不影响,因此

VM0上的执行时间为:(t0+t3)/VM0 mips=(4000+10000)/3000=4.667,

VM1上的执行时间为:(t1+t4)/VM1 mips=(2000+500)/1000=2.5,

VM2上的执行时间为:t2/VM2 mips=2500/500=5。

因此这种调度方案的总的运行时间为max{4.667,2.5,5}=5。

其中,这种调度方案,可用一个二维表来表示:

 技术分享

这个表跟上面的那个X表行和列对调了一下,但意思一样,注意观察每一行都只有一个1,表示每个任务只能分配给一个资源(虚拟机)进行计算,但1个资源(虚拟机)可能计算不止一个任务。

如果运用遗传算法或其他进化算法,需要对每个解(对应这里的每一种调度方案),计算它的适应度值(这里的适应度函数就是每种调度方案对应的任务完成时间),选择适应度值最好的作为最优,进行下一次迭代。

如何把一种调度方案表示为一个解,如何计算解的适应度值?可以参考:非常好的理解遗传算法的例子

这里,可以把每一行的二进制数化成一个十进制整数,每个数取值只能取{20,21,22,...,2m-1}中的任意一个,共n个任务,即有n个这样的数,这就是遗传算法当中的所谓编码,即用一种方式来把调度方案表示成解(上面的调度方案可表示为42142,每一位数表示资源的分配结果)。

或者用资源的编号组合来表示调度方案:n个任务,每个任务从[0,m-1]之间的整数任取一个,那么一个调度方案就是一个1*n维的向量,如上例的调度方案可表示为 [0,1,2,0,1]

而把解转化成调度方案就是所谓解码。

 

如何把把自己的算法,如遗传算法运用到Cloudsim中去?最简单的办法是调用DatacenterBroker的 bindCloudletToVM(int cloudletId, int vmId),通过遗传算法的计算结果用代码动态调用该方法,将任务与资源进行绑定,这种绑定就是任务的调度的体现。

 

如何理解遗传算法本身,请参考:遗传算法(Genetic Algorithm) 

说到这,我有点疑问,按照上面的调度表格,每个任务必须要为它分配一个资源,且只能分配一个资源,那调度方案的总个数其实是可以穷举的,因为n个任务,m个资源,每个任务都有m种选择,一共就是mn种调度方案。所以最佳调度方案其实是很容易穷举算出来的,为什么还要用遗传算法之类的进化算法来算呢?可能是当n足够大之后,mn这个值太大,调度方案太多,导致穷举太耗时,才需要这些调度算法吧。

 

参考资料:

《基于粒子群优化与蚁群优化的云计算任务调度算法》王登科 李 忠

硕士论文《基于云计算环境下资源调度算法研究》 邬海艳

http://blog.csdn.net/b2b160/article/details/4680853/

http://blog.chinaunix.net/uid-27105712-id-3886077.html

 

用遗传算法GA改进CloudSim自带的资源调度策略