GT-GAOA卸载算法
背景:我实现该算法是在边缘计算单个工作流环境中,下面可以看到此背景下的java代码实现。
1.算法伪代码
下面是procedure1与procedure2:
2.参数说明
M是任意移动设备 i 计算任务的类型数,C是迭代次数,N是移动设备数。
3.结果
一个最优的计算卸载决策S,整体最小计算费用…
4.分析
(1)Algorithm2:
- 初始化:初始化每个终端设备MD上的一个工作流的所有任务(假设任务数为taskNum个)设置为不卸载{0,0,…,0}。
- 对于每一个MD i 上的一个工作流:按照Procedure1计算MD i 的局部最优卸载决策(这个卸载决策具有最小的优化目标值),如果新计算出来的MD i 的优化目标值小于之前的优化目标值,则将该MD i 添加到博弈更新圈。
- 只要博弈更新圈不为空:从博弈更新圈中随机挑选一个MD i ,赋予 i 更新卸载决策的机会,i 进行更新,并广播给其他MD(因为该更新的MD会占用公共资源),保存 i 更新后的卸载策略。博弈圈中的其他MD暂不更新。
- 基于计算卸载决策 S 计算整体最小的优化目标值(eg:Time、Energy)。
- 返回 S 与最小优化目标值。
(2)Procedure1~2:
- 对于工作流中的每一个job(卸载任务):
- 分别计算job在本地、边缘服务器、云服务器上的优化目标值 a,b,c。
- 先找出不卸载的job:如果当前 job 在本地执行优化目标值最小,则设置它的卸载策略为0(不卸载),卸载的 job 放在一个集合M中。
- 再遍历M集合,分别计算该任务 job 卸载到云服务器、边缘服务器的优化目标值 c,d。
- 若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();
}
}