1. 程式人生 > >cloudsim模擬演算法研究之一

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(){

}