cloudsim仿真算法研究之一

//顺序算法
public void bindCloudletsToVmsSimple(){
int vmNum = vmList.size();
int cloudletNum = cloudletList.size();
int idx = 0;
for(int i=0;i<cloudletNum;i++){
cloudletList.get(i).setVmId(vmList.get(idx).getId());
idx = (idx+1)%vmNum;
}
}
//贪心算法
public void bindCloudletsToVmsTimeAwared(){
int cloudletNum=cloudletList.size();
int vmNum=vmList.size();
//time[i][j] 表示任务i在虚拟机j上的执行时间
double[][] time=new double[cloudletNum][vmNum];
//cloudletList按MI降序排列, vm按MIPS升序排列
Collections.sort(cloudletList,new CloudletComparator());
Collections.sort(vmList,new VmComparator());
//////////For test//////////////////////////////////
System.out.println("///////////For test///////////////");
for(int i=0;i<cloudletNum;i++){
System.out.print(cloudletList.get(i).getCloudletId()+":"+cloudletList.get
(i).getCloudletLength()+" ");
}
System.out.println();
for(int i=0;i<vmNum;i++){
System.out.print(vmList.get(i).getId()+":"+vmList.get(i).getMips()+" ");
}
System.out.println();
System.out.println("//////////////////////////////////");
//////////////////////////////////////////////////////////////////////
for(int i=0;i<cloudletNum;i++){
for(int j=0;j<vmNum;j++){
time[i][j]=
(double)cloudletList.get(i).getCloudletLength()/vmList.get(j).getMips();
System.out.print("time["+i+"]["+j+"]="+time[i][j]+" ");
//For test
}
System.out.println(); //For test
}
double[] vmLoad=new double[vmNum];//在某个虚拟机上任务的总执行时间
int[] vmTasks=new int[vmNum]; //在某个Vm上运行的任务数量
double minLoad=0;//记录当前任务分配方式的最优值
int idx=0;//记录当前任务最优分配方式对应的虚拟机列号
//第一个cloudlet分配给最快的vm
vmLoad[vmNum-1]=time[0][vmNum-1];
vmTasks[vmNum-1]=1;
cloudletList.get(0).setVmId(vmList.get(vmNum-1).getId());
for(int i=1;i<cloudletNum;i++){
minLoad=vmLoad[vmNum-1]+time[i][vmNum-1];
idx=vmNum-1;
for(int j=vmNum-2;j>=0;j--){
//如果当前虚拟机未分配任务,则比较完当前任务分配给该虚拟机是否最优
if(vmLoad[j]==0){
if(minLoad>=time[i][j])idx=j;
break;
}
if(minLoad>vmLoad[j]+time[i][j]){
minLoad=vmLoad[j]+time[i][j];
idx=j;
}
//简单的负载均衡
else if(minLoad==vmLoad[j]+time[i][j]&&vmTasks[j]<vmTasks[idx])
idx=j;
}
vmLoad[idx]+=time[i][idx];
vmTasks[idx]++;
cloudletList.get(i).setVmId(vmList.get(idx).getId());
System.out.print(i+"th "+"vmLoad["+idx+"]="+vmLoad[idx]+"minLoad="+minLoad);
System.out.println();
}
}
//蚁群算法
public void bindCloudletsToVmsACO(){

}

你可能感兴趣的:(顺序,贪心,蚁群,多算法融和)