Добавление Ant Colony Optimization в качестве политики балансировки нагрузки между виртуальными машинами в одном центре обработки данных
обкатка и использующее облако-аналитик
Вот код, как применяется круговое планирование Робина
public class RoundRobinVmLoadBalancer extends VmLoadBalancer
{
private Map<Integer, VirtualMachineState> vmStatesList;
private int currVm = -1;
public RoundRobinVmLoadBalancer(Map<Integer, VirtualMachineState> vmStatesList)
{
super();
this.vmStatesList = vmStatesList;
}
/* (non-Javadoc)
* @see cloudsim.ext.VMLoadBalancer#getVM()
*/
public int getNextAvailableVm(){
currVm++;
if (currVm >= vmStatesList.size()){
currVm = 0;
}
allocatedVm(currVm);
return currVm;
}
}
VmLoadBalancer
import java.util.Map;
import java.util.HashMap;
/**
* This is the base class defining the behaviour of a Virtual Machine load
balancer
* used by a {@link DatacenterController}. The main method all load balancers
should implement
* is <c
ode>public int getNextAvailableVm()</code>.
*
* This class provides a basic load balancing statistic collection that can be used by
* implementing classes. The implementing classes should call the <code>void allocatedVM(int currVm)</code>
* method to use the statisitics collection feature.
*
*/
abstract public class VmLoadBalancer
{
/** Holds the count of allocations for each VM */
protected Map<Integer, Integer> vmAllocationCounts;
/** No args contructor */
public VmLoadBalancer(){
vmAllocationCounts = new HashMap<Integer, Integer>();
}
/**
* The main contract of {@link VmLoadBalancer}. All load balancers should implement
* this method according to their specific load balancing policy.
*
* @return id of the next available Virtual Machine to which the next task should be
* allocated
*/
abstract public int getNextAvailableVm();
/**
* Used internally to update VM allocation statistics. Should be called by all impelementing
* classes to notify when a new VM is allocated.
*
* @param currVm
*/
protected void allocatedVm(int currVm){
Integer currCount = vmAllocationCounts.get(currVm);
if (currCount == null){
currCount = 0;
}
vmAllocationCounts.put(currVm, currCount + 1);
}
/**
* Returns a {@link Map} indexed by VM id and having the number of allocations for each VM.
* @return
*/
public Map<Integer, Integer> getVmAllocationCounts()
{
return vmAllocationCounts;
}
}
Как и Round Robin, я хочу применить оптимизацию Ant Colony в качестве политики балансировки нагрузки. Но не ясно, что как реализуется Round Robin, то нет кода Round Robin, замеченного в проекте cloud_analyst cloudim, тогда как мне применить A C O, пожалуйста, поделитесь фрагментом кода A C O, примененным в cloudim
2 ответа
С моим небольшим опытом работы в CloudSim, я думаю, вы попытаетесь создать новый VmAllocationPolicy
а не VmLoadBalancer
, Так что, если вы пытаетесь использовать оптимизацию Ant Colony, ваш класс должен выглядеть примерно так.
public final class MyPolicyNew extends VmAllocationPolicy {
private Map<String, Host> vmTable;//vm table
private Map<String, Integer> usedPes;//used pes
private List<Integer> freePes;//free pes
public MyPolicyNew(List<? extends Host> list) {
....
}
@Override
public boolean allocateHostForVm(Vm vm) {
**Your code for ACO goes here**
**You do all the processing here and at the end allocate the vm to a host**
**using host.vmCreate(vm) which returns a boolean on success of allocation, which you return from the function**
}
....
}
Вы должны попробовать посмотреть на VmAllocationPolicy.java
Класс и примеры моделирования Cloudsim включены в Cloudim, который поможет вам.
PS Я знаю, что прошло больше месяца, как вы просили, но на всякий случай это могло бы помочь вам, я был бы рад!
Если вы используете TimeShareScheduling для Vm/Cloudlet, он будет действовать как алгоритм roundrobin. Различные комбинации планировщика виртуальных машин и облачных вычислений могут создавать различные политики планирования. Рисунок 4 этого может вам помочь.