package org.cloudbus.cloudsim.power;

import org.cloudbus.cloudsim.Vm;
import org.cloudbus.cloudsim.core.CloudSim;
import java.util.List;

/**
 * ClassName PowerVmSelectionPolicyMinimumSLA
 * Description
 * Create by HW
 * Date 2021/3/17 19:36
 */
public class PowerVmSelectionPolicyMyNewSelectionFirst extends  PowerVmSelectionPolicy {
    @Override
    public Vm getVmToMigrate(PowerHost host) {
        List<PowerVm> migratableVms = getMigratableVms(host);
        if (migratableVms.isEmpty()){
            return null;
        }
        Vm vmToMigrate = null;
        ///设置三个变量满足拉格朗日函数方程
        double a=0.5;
        double b=0.2;
        double c=0.3;
        double minMetric = Double.MAX_VALUE;
        //为每一个虚拟机所对应的能耗变化的参数方程
        //结果名为result
        double result=0.0;
        double metric=0.0;
        double migrationTime=0.0;
        double performanceByMigration=0.0;
        for (Vm vm : migratableVms) {
            //获取虚拟机迁移的次数导致的性能下降
            performanceByMigration=vm.getProfomanceByMigration();
            //获取虚拟机的占主机的利用率
             metric=vm.getTotalUtilizationOfCpuMips(CloudSim.clock())/vm.getMips();
            //获取虚拟机迁移的时间
             migrationTime=vm.getMigrationTime();
             result=b*migrationTime+a*metric+c*performanceByMigration;
            if (result<minMetric){
                minMetric=result;
            }
           vmToMigrate=vm;
        }
        return vmToMigrate;
    }
    //从前以列表中得出最佳虚拟机，满足最小迁移时间、最小能耗、不违反SLA协议的虚拟机
   /* public Vm getBestVm(List<PowerVm> migratableVms){
        if(migratableVms.isEmpty()){
            return null;
        }
        Iterator<PowerVm> iterator = migratableVms.iterator();
        double metric=Double.MAX_VALUE;
        double migrationTime=0.0;
        while (iterator.hasNext()) {
            //从迁移的列表遍历所有列表
            Vm vm = iterator.next();
            double migerationTime = vm.MigerationTime();

        }
        return null;
    }*/
    //获取虚拟机的整个过程的能耗减少

    /*@Override
    protected List<PowerVm> getMigratableVms(PowerHost host) {
        List<PowerVm> migratableVms = new ArrayList<PowerVm>();
        for (PowerVm vm : host.<PowerVm>getVmList()) {
            if (!vm.isInMigration()) {
                migratableVms.add(vm);
            }
        }
        migratableVms.sort(Comparator.comparingDouble(PowerVm::getProfomanceByMigration).reversed());
        return migratableVms;
    }*/
   /* public Vm getVmToMigrate(PowerHost host) {
        List<PowerVm> migratableVms = getMigratableVms(host);
        if (migratableVms.isEmpty()){
            return null;
        }
        Vm vmTomigrate=null;
        double minMetrix= Double.MAX_VALUE;
        for (Vm vm:migratableVms) {
            double Metrix=vm.getSize()/host.getBw()*((1-host.getUtilizationOfCpu())*(vm.getMips()/host.getTotalMips()));
            if (Metrix<minMetrix){
                minMetrix=Metrix;
                vmTomigrate=vm;
            }
        }
        return vmTomigrate;
    }*/
}
