边缘计算卸载算法--GT-GAOA

GT-GAOA卸载算法

背景:我实现该算法是在边缘计算单个工作流环境中,下面可以看到此背景下的java代码实现。

1.算法伪代码

边缘计算卸载算法--GT-GAOA_第1张图片
下面是procedure1与procedure2:
边缘计算卸载算法--GT-GAOA_第2张图片

2.参数说明

M是任意移动设备 i 计算任务的类型数,C是迭代次数,N是移动设备数。

3.结果

一个最优的计算卸载决策S,整体最小计算费用…

4.分析

(1)Algorithm2:

  1. 初始化:初始化每个终端设备MD上的一个工作流的所有任务(假设任务数为taskNum个)设置为不卸载{0,0,…,0}。
  2. 对于每一个MD i 上的一个工作流:按照Procedure1计算MD i 的局部最优卸载决策(这个卸载决策具有最小的优化目标值),如果新计算出来的MD i 的优化目标值小于之前的优化目标值,则将该MD i 添加到博弈更新圈。
  3. 只要博弈更新圈不为空:从博弈更新圈中随机挑选一个MD i ,赋予 i 更新卸载决策的机会,i 进行更新,并广播给其他MD(因为该更新的MD会占用公共资源),保存 i 更新后的卸载策略。博弈圈中的其他MD暂不更新。
  4. 基于计算卸载决策 S 计算整体最小的优化目标值(eg:Time、Energy)。
  5. 返回 S 与最小优化目标值。

(2)Procedure1~2:

  1. 对于工作流中的每一个job(卸载任务):
  2. 分别计算job在本地、边缘服务器、云服务器上的优化目标值 a,b,c。
  3. 先找出不卸载的job:如果当前 job 在本地执行优化目标值最小,则设置它的卸载策略为0(不卸载),卸载的 job 放在一个集合M中。
  4. 再遍历M集合,分别计算该任务 job 卸载到云服务器、边缘服务器的优化目标值 c,d。
  5. 若c < d 卸载到云服务器,反之,卸载到边缘服务器。
5.我的java代码实现
/**
 * 卸载策略初始化
 */
void GT_GAOAInit(){
    offloadStra = new int[taskNum];
    offloadJobIndex = new ArrayList<>();
    for (int i = 0; i < taskNum; i++) {
        offloadStra[i] = 0;
    }
}
/**
 * 根据贪心近似最优卸载策略对每个job选取最优卸载位置
 */
void GreedyApproximationOffloading(){
    // 依次是卸载到云层、雾层、本地
    double time1 = 0, time2 = 0, time3 = 0;
    double energy1 = 0, energy2 = 0, energy3 = 0;
    powerModel = (FogLinearPowerModel) getmobile().getHost().getPowerModel();
    // 获取云、雾、终端层的平均Mips
    double cAvgMips = getcloud().getAverageMips();
    double fAvgMips = getFogNode().getAverageMips();
    double mAvgMips = getmobile().getAverageMips();

    // 先计算不需要卸载的任务集合
    for (int i = 0; i < taskNum; i++) {
        Job job = joblist.get(i);
        time1 = job.getCloudletLength() / cAvgMips
                + getJobFileSize(job) / parameter / WAN_Bandwidth;
        //卸载所需能耗 = 空闲功率 * 云执行时间 + 传输功率 * (发送数据大小 + 接收数据大小 ) / WAN带宽
        energy1 = powerModel.getStaticPower() * job.getCloudletLength() / cAvgMips
                + powerModel.getSendPower() * getJobFileSize(job) / parameter / WAN_Bandwidth;

        time2 = job.getCloudletLength() / fAvgMips
                + getJobFileSize(job) / parameter / LAN_Bandwidth;
        energy2 = powerModel.getStaticPower() * job.getCloudletLength() / fAvgMips
                + powerModel.getSendPower() * getJobFileSize(job) / parameter / LAN_Bandwidth;

        time3 = job.getCloudletLength() / mAvgMips;
        energy3 = powerModel.getMaxPower() * job.getCloudletLength() / mAvgMips;

        switch (optimize_objective){
            case "Time":
                if(Math.min(time1,time2) < time3) {// 该job需要卸载
                    offloadJobIndex.add(i);
                }
                break;
            case "Energy":
                if(Math.min(energy1,energy2) < energy3) {// 该job需要卸载
                    offloadJobIndex.add(i);
                }
                break;
            default:
                break;
        }
    }

    // 再计算其余任务是卸载到雾还是云
    for (int i = 0; i < offloadJobIndex.size(); i++) {
        int t = offloadJobIndex.get(i);
        Job job = joblist.get(t);
        time1 = job.getCloudletLength() / cAvgMips
                + getJobFileSize(job) / parameter / WAN_Bandwidth;
        //卸载所需能耗 = 空闲功率 * 云执行时间 + 传输功率 * (发送数据大小 + 接收数据大小 ) / WAN带宽
        energy1 = powerModel.getStaticPower() * job.getCloudletLength() / cAvgMips
                + powerModel.getSendPower() * getJobFileSize(job) / parameter / WAN_Bandwidth;

        time2 = job.getCloudletLength() / fAvgMips
                + getJobFileSize(job) / parameter / LAN_Bandwidth;
        energy2 = powerModel.getStaticPower() * job.getCloudletLength() / fAvgMips
                + powerModel.getSendPower() * getJobFileSize(job) / parameter / LAN_Bandwidth;

        switch (optimize_objective){
            case "Time":
                if(time1 < time2){// 卸载到云上
                    offloadStra[t] = 2;
                }else{// 卸载到雾上
                    offloadStra[t] = 1;
                }
                break;
            case "Energy":
                if(energy1 < energy2){// 卸载到云上
                    offloadStra[t] = 2;
                }else{// 卸载到雾上
                    offloadStra[t] = 1;
                }
                break;
            default:
                break;
        }
    }
}
@Override
public void BeforeOffloading(double deadline) {
    this.deadline = deadline;
    GT_GAOAInit();
    joblist = getjobList();
    for (int i = 0; i < workflowNum; i++) {
        GreedyApproximationOffloading();
    }
}

你可能感兴趣的:(边缘计算,边缘计算)