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

遗传算法GA的核心代码实现:

最核心:

private static ArrayList<int[]> GA(ArrayList<int[]> pop,int gmax,double crossoverProb,double mutationRate)
    {
        HashMap<Integer,double[]> segmentForEach=calcSelectionProbs(pop);
        ArrayList<int[]> children=new ArrayList<int[]>();
        ArrayList<int[]> tempParents=new ArrayList<int[]>();
        while(children.size()<pop.size())
        {
            //selection phase:select two parents each time.
            for(int i=0;i<2;i++)
            {
                double prob = new Random().nextDouble();
                for (int j = 0; j < pop.size(); j++)
                {
                    if (isBetween(prob, segmentForEach.get(j)))
                    {
                        tempParents.add(pop.get(j));
                        break;
                    }
                }
            }
            //cross-over phase.
            int[] p1,p2,p1temp,p2temp;
            p1= tempParents.get(tempParents.size() - 2).clone();
            p1temp= tempParents.get(tempParents.size() - 2).clone();
            p2 = tempParents.get(tempParents.size() -1).clone();
            p2temp = tempParents.get(tempParents.size() -1).clone();
            if(new Random().nextDouble()<crossoverProb)
            {
                int crossPosition = new Random().nextInt(cloudletList.size() - 1);
                //cross-over operation
                for (int i = crossPosition + 1; i < cloudletList.size(); i++)
                {
                    int temp = p1temp[i];
                    p1temp[i] = p2temp[i];
                    p2temp[i] = temp;
                }
            }
            //choose the children if they are better,else keep parents in next iteration.
            children.add(getFitness(p1temp) < getFitness(p1) ? p1temp : p1);
            children.add(getFitness(p2temp) < getFitness(p2) ? p2temp : p2);
            // mutation phase.
            if (new Random().nextDouble() < mutationRate)
            {
                // mutation operations bellow.
                int maxIndex = children.size() - 1;

                for (int i = maxIndex - 1; i <= maxIndex; i++)
                {
                    operateMutation(children.get(i), mutationRate);
                }
            }
        }

        gmax--;
        return gmax > 0 ? GA(children, gmax, crossoverProb, mutationRate): children;
    }

完整核心代码:

  1 private static int[] findBestSchedule(ArrayList<int[]> pop)
  2     {
  3         double bestFitness=1000000000;
  4         int bestIndex=0;
  5         for(int i=0;i<pop.size();i++)
  6         {
  7             int []schedule=pop.get(i);
  8             double fitness=getFitness(schedule);
  9             if(bestFitness>fitness)
 10             {
 11                 bestFitness=fitness;
 12                 bestIndex=i;
 13             }
 14         }
 15         return pop.get(bestIndex);
 16     }
 17
 18     private static int[] getScheduleByGA(int popSize,int gmax,double crossoverProb,double mutationRate)
 19     {
 20         ArrayList<int[]> pop=initPopsRandomly(cloudletList.size(),vmList.size(),popSize);
 21         pop=GA(pop,gmax,crossoverProb,mutationRate);
 22         return findBestSchedule(pop);
 23     }
 24
 25     private static ArrayList<int[]> initPopsRandomly(int taskNum,int vmNum,int popsize)
 26     {
 27         ArrayList<int[]> schedules=new ArrayList<int[]>();
 28         for(int i=0;i<popsize;i++)
 29         {
 30             //data structure for saving a schedule:array,index of array are cloudlet id,content of array are vm id.
 31             int[] schedule=new int[taskNum];
 32             for(int j=0;j<taskNum;j++)
 33             {
 34                 schedule[j]=new Random().nextInt(vmNum);
 35             }
 36             schedules.add(schedule);
 37         }
 38         return schedules;
 39     }
 40
 41     private static double getFitness(int[] schedule)
 42     {
 43         double fitness=0;
 44
 45         HashMap<Integer,ArrayList<Integer>> vmTasks=new HashMap<Integer,ArrayList<Integer>>();
 46         int size=cloudletList.size();
 47
 48         for(int i=0;i<size;i++)
 49         {
 50             if(!vmTasks.keySet().contains(schedule[i]))
 51             {
 52                 ArrayList<Integer> taskList=new ArrayList<Integer>();
 53                 taskList.add(i);
 54                 vmTasks.put(schedule[i],taskList);
 55             }
 56             else
 57             {
 58                 vmTasks.get(schedule[i]).add(i);
 59             }
 60         }
 61
 62         for(Entry<Integer, ArrayList<Integer>> vmtask:vmTasks.entrySet())
 63         {
 64             int length=0;
 65             for(Integer taskid:vmtask.getValue())
 66             {
 67                 length+=getCloudletById(taskid).getCloudletLength();
 68             }
 69
 70             double runtime=length/getVmById(vmtask.getKey()).getMips();
 71             if (fitness<runtime)
 72             {
 73                 fitness=runtime;
 74             }
 75         }
 76
 77         return fitness;
 78     }
 79
 80     private static ArrayList<int[]> GA(ArrayList<int[]> pop,int gmax,double crossoverProb,double mutationRate)
 81     {
 82         HashMap<Integer,double[]> segmentForEach=calcSelectionProbs(pop);
 83         ArrayList<int[]> children=new ArrayList<int[]>();
 84         ArrayList<int[]> tempParents=new ArrayList<int[]>();
 85         while(children.size()<pop.size())
 86         {
 87             //selection phase:select two parents each time.
 88             for(int i=0;i<2;i++)
 89             {
 90                 double prob = new Random().nextDouble();
 91                 for (int j = 0; j < pop.size(); j++)
 92                 {
 93                     if (isBetween(prob, segmentForEach.get(j)))
 94                     {
 95                         tempParents.add(pop.get(j));
 96                         break;
 97                     }
 98                 }
 99             }
100             //cross-over phase.
101             int[] p1,p2,p1temp,p2temp;
102             p1= tempParents.get(tempParents.size() - 2).clone();
103             p1temp= tempParents.get(tempParents.size() - 2).clone();
104             p2 = tempParents.get(tempParents.size() -1).clone();
105             p2temp = tempParents.get(tempParents.size() -1).clone();
106             if(new Random().nextDouble()<crossoverProb)
107             {
108                 int crossPosition = new Random().nextInt(cloudletList.size() - 1);
109                 //cross-over operation
110                 for (int i = crossPosition + 1; i < cloudletList.size(); i++)
111                 {
112                     int temp = p1temp[i];
113                     p1temp[i] = p2temp[i];
114                     p2temp[i] = temp;
115                 }
116             }
117             //choose the children if they are better,else keep parents in next iteration.
118             children.add(getFitness(p1temp) < getFitness(p1) ? p1temp : p1);
119             children.add(getFitness(p2temp) < getFitness(p2) ? p2temp : p2);
120             // mutation phase.
121             if (new Random().nextDouble() < mutationRate)
122             {
123                 // mutation operations bellow.
124                 int maxIndex = children.size() - 1;
125
126                 for (int i = maxIndex - 1; i <= maxIndex; i++)
127                 {
128                     operateMutation(children.get(i), mutationRate);
129                 }
130             }
131         }
132
133         gmax--;
134         return gmax > 0 ? GA(children, gmax, crossoverProb, mutationRate): children;
135     }
136
137     public static void operateMutation(int []child,double mutationRate)
138     {
139         if(new Random().nextDouble()<mutationRate)
140         {
141             int mutationIndex=new Random().nextInt(cloudletList.size());
142             int newVmId=new Random().nextInt(vmList.size());
143             while(child[mutationIndex]==newVmId)
144             {
145                 newVmId=new Random().nextInt(vmList.size());
146             }
147
148             child[mutationIndex]=newVmId;
149         }
150     }
151
152     private static boolean isBetween(double prob,double[]segment)
153     {
154         if(segment[0]<=prob&&prob<=segment[1])
155             return true;
156         return false;
157     }
158
159     private static HashMap<Integer,double[]> calcSelectionProbs(ArrayList<int[]> parents)
160     {
161         int size=parents.size();
162         double totalFitness=0;
163         ArrayList<Double> fits=new ArrayList<Double>();
164         HashMap<Integer,Double> probs=new HashMap<Integer,Double>();
165
166         for(int i=0;i<size;i++)
167         {
168             double fitness=getFitness(parents.get(i));
169             fits.add(fitness);
170             totalFitness+=fitness;
171         }
172         for(int i=0;i<size;i++)
173         {
174             probs.put(i,fits.get(i)/totalFitness );
175         }
176
177         return getSegments(probs);
178     }
179
180     private static HashMap<Integer,double[]> getSegments(HashMap<Integer,Double> probs)
181     {
182         HashMap<Integer,double[]> probSegments=new HashMap<Integer,double[]>();
183         //probSegments保存每个个体的选择概率的起点、终点,以便选择作为交配元素。
184         int size=probs.size();
185         double start=0;
186         double end=0;
187         for(int i=0;i<size;i++)
188         {
189             end=start+probs.get(i);
190             double[]segment=new double[2];
191             segment[0]=start;
192             segment[1]=end;
193             probSegments.put(i, segment);
194             start=end;
195         }
196
197         return probSegments;
198     }
199     

完整的GA算法的工程实现,包括与轮询(RR)算法效果对比:

GA-cloudsim.zip

时间: 2024-10-12 11:40:22

用遗传算法GA改进CloudSim自带的资源调度策略(2)的相关文章

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

首先理解云计算里,资源调度的含义: 看了很多云计算资源调度和任务调度方面的论文,发现很多情况下这两者的意义是相同的,不知道这两者是同一件事的不同表述还是我没分清吧,任务调度或者资源调度大概就是讲这样一件事情: 用户有n个计算任务(Task),{t1,t2,t3,...tm},将这n个任务分配到m个资源(其实就是指虚拟机,Virtual Machine)上,用这m个资源来计算这n个任务(注意,一般n>m,且很多时候n>>m),直到所有任务都计算完成.如何分配使得这n个任务的总的计算时间最少

中颖内带LCD资源驱动代码

uint8 xdata LCDBuf[19] _at_ 0x1e0; //LCD RAM 地址 480-224 //LCD模式选择 #define LcdMode0 0x00 //传统电阻型 偏置和225K/900K #define LcdMode1 0x01 //传统电阻型 偏置和60K #define LcdMode2 0x02 //快速充电型 偏置于60K 与 225K/900K间切换 //偏置电阻选择 #define LcdRSum225K (0<<4) #define LcdRSum

中颖内带LED资源驱动代码

//上一篇写了LCD驱动,本篇写下LED驱动 //DISPCON 最高位为1时, 选择LED驱动,LCD驱动无效 最高位为0时, 选择LCD驱动,LED驱动无效 void Sh79fLed_Init(void) { uint8 i ; Bank0; DISPCLK0 = 0x6e;//0X6E //帧频率 64HZ 此设置无效 DISPCLK1 = 0x01;//0X01 P0SS = 0X00 ; P1SS = 0XFF ; //P10-P17作为SEG P3SS = 0XFF ; //P30

【Unity】4.2 提升开发效率的捷径--导入Unity自带的资源包

分类:Unity.C#.VS2015 创建日期:2016-04-06 一.简介 Unity自带的资源包也称为标准资源包.换言之,Unity自带的所有标准资源包导入到Unity项目中以后,都会放在Project视图的Standed Assets文件夹下.如果是多平台,除了Standed Assets文件夹以外,还会有一个Edit文件夹. 如果你打开别人写的Unity项目,只要看到项目中包含有Standed Assets文件夹和Edit文件夹,你就应该马上想到,这些文件夹下的资源都是从Unity自带

Windows XP 系统自带扑克牌资源动态链接库cards.dll逆向分析笔记

使用工具:IDA Pro, Resource Hacker 0. 前言 cards.dll是Windows系统目录下的一个动态链接库,主要提供扑克牌图像及相关操作等资源,以供 Windows附带的扑克游戏程序(如纸牌.红心大战等)使用. 我们希望知道cards.dll具体提供了哪些东西,可供自由编程所用. 1. 反编译 一般而言,将原始二进制文件还原成高级语言源文件的逆向工程有两个步骤:一是反编译,根据目 标文件反汇编的内容,识别指令.存储单元等基本要素并理解这些要素之间的相互关系,从而写出相应

第十三章-改进预测、过程和资源

我们已经看到软件开发中的各个处理过程能够对最后产品的质量产生影响.处理过程完备模型的建立是基于改进处理过程本身将自动的改进最终的产品,尤其是软件方面. 维护过程的费用一直在攀升而且经常会出现超出软件开发费由的情况.因此,对于研究出一种能够改进软件维护处理过程从而降低维护费用,提高软件质量的方法是十分必要的.为了选择一个恰当的模型, Henry 考虑了这个问题 ,提出在做出适当的选择前英回答的三个问题我们怎样才能够定量的评估维护处理过程.我们怎样能够评估处维护过程的提高改进.怎样才能评估任何处理过

关于安卓工程导出带res资源文件的jar的总结

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 29.0px; font: 16.0px "Microsoft YaHei"; color: #323333 } span.s1 { } 1.打包时,将资源放在asset文件夹内,通过AssetsManager获取指定资源: 目标应用和jar中的assets文件夹会合并,所以可以通过获取该应用的此类文件夹来获取目标资源 2.使用library项目 此类方法不能混淆代码,也就是说发布

改进遗传算法优化数据中心动态网络流量分配

背景知识 通常对于大型的数据中心网络(Data Center Networks, 简称DCN)来说,每一台服务器的使用情况是非常不一样的,而平均使用的情况几乎不存在,大部分的情况都是70%的使用和流量需求会集中在一小部分的服务器上,而这个也是通过LAN网络构建云计算中心所必不可免的问题. 如图是大部分情况下数据中心服务器使用的热点情况: 可以看到,其实大部分资源是相对空置的,所以要令数据中心有更高的运算效率,可想而知就是把其他相对空置的服务器利用起来或者把他们的网络流量尽可能的分配给使用度较高的

基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登后,陆陆续续收到本科生.研究生还有博士生的来信和短信微信等,表示了对论文的兴趣以及寻求算法的效果和实现细节,所以,我也就通过邮件或者短信微信来回信,但是有时候也会忘记回复. 另外一个原因也是时间久了,我对于论文以及改进的算法的记忆也越来越模糊,或者那天无意间把代码遗失在哪个角落,真的很难想象我还会全