本文对本人对【基于启发式算法的网络卸载策略】的研究过程进行记录
一、问题假设
假设存在1个终端,两个边缘设备,三个云服务器,其运算速度分别假定为0.029、210、210、870、350、350(Mbps),终端与云服务器直接利用WAN传输信息,终端与边缘设备通过LAN传输信息,边缘设备与云服务器通过LAN传输信息(可以认为光缆传输速度极快),WAN和LAN的传输速度分别假定为10、100(Mbps),终端工作、上传、下载能耗分别为0.7、0.1、0.025W。
不难发现终端的卸载方案有三种:
- 终端自行处理计算(不卸载策略)
- 终端基于云服务器的完全卸载策略,由于终端直接传输到云服务器使用的WAN传输速度极慢,可以认为终端卸载到云服务器应该使用“端—边—云”的卸载方案,即终端卸载任务至边缘设备,通过边缘设备转到云服务器进行计算,这种转载方案可以减轻任务传输途中的速度。
- 基于“端—边—云”的多重资源卸载方案,即终端、边缘设备、云服务器智能分配任务,使得任务能够尽快完成的同时能尽量的节约能耗,也就是本次主要研究目标,使用粒子群算法求解。
- 问题求解
通过启发式算法中的PSO算法,适应度值以能耗、完成时间综合组成
设置位置边界使得每个设备(包括终端、边缘、云端)处理的任务总和需恰巧等于设置的任务总量,且每个设备处理的任务量不得为负。
粒子位置为6维,每一维分别每个设备承担的任务量。
假设任务量为:10000,求解的结果如下(matlab代码见附录)
表示6个设备分配的任务量
其中
pso.m
%% I. 清空环境
clc
clear
close all
%% II. 参数初始化
c1 = 1.49445;
c2 = 1.49445;
task=10000; %任务量
deadline=200; %任务执行时长
kmax = 1000; % 进化次数
popsize = 100;
0; %种群规模
% 控制粒子速度
Vmax = 1;
Vmin = -1;
% 个体位置变化的最大范围
popmax = task;
popmin = 0;
%惯性权重最大值和最小值
Wmax = 0.9;
Wmin = 0.4;
% %压缩因子
% phi = c1+c2;
% lamda = 2 / abs(2 - phi - sqrt(phi^2 - 4*phi)); % 压缩因子
%% III. 产生初始粒子和速度
for i = 1:popsize
% 随机产生一个种群
pop(i,1:5) = 1000*rand(1,5); %初始各个粒子位置
pop(i,6)=task-sum(pop(i,1:5));
V(i,:) = rands(1,6); %初始化各个粒子速度
% 计算适应度
fitness(i) = fun1(pop(i,:),deadline,task); %各个粒子的适应度值
end
%% IV. 个体极值和群体极值
[best_fitness best_index] = min(fitness);
Gbest = pop(best_index,:); %粒子群体最优位置
Pbest = pop; %粒子个体最优位置
fitnessPbest = fitness; %粒子个体最优适应度值
fitnessGbest = best_fitness; %粒子群体最优适应度值
%% V. 迭代寻优
for i = 1:kmax
%计算动态惯性权重
w = Wmax - (Wmax - Wmin)*i / kmax;
for j = 1:popsize
% 速度更新
V(j,:) = w*V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%标准粒子群算法
% V(j,:) = lamda*V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%压缩粒子群算法
% V(j,:) = V(j,:) + c1*rand*(Pbest(j,:) - pop(j,:)) + c2*rand*(Gbest - pop(j,:));%普通粒子群算法
% 进行速度约束(边界约束)
V(j,find(V(j,:)>Vmax)) = Vmax;
V(j,find(V(j,:)<Vmin)) = Vmin;
% 位置更新
pop(j,:) = pop(j,:) + V(j,:);
% 进行位置约束(边界约束)
pop(j,find(pop(j,:)>popmax)) = popmax;
pop(j,find(pop(j,:)<popmin)) = popmin;
% 适应度值更新
fitness(j) = fun1(pop(j,:),deadline,task);
end
for j = 1:popsize
% 个体最优更新
if fitness(j) < fitnessPbest(j)
Pbest(j,:) = pop(j,:);
fitnessPbest(j) = fitness(j);
end
% 群体最优更新
if fitness(j) < fitnessGbest
Gbest = pop(j,:);
fitnessGbest = fitness(j);
end
end
Best(i) = fitnessGbest;%用于存储每次迭代产生的最优的适应度值
end
%% VI.输出结果
disp(['当x(1)=',num2str(Gbest(1)),'和','x(2)=',num2str(Gbest(2)),'和','x(3)=',num2str(Gbest(3))]);
disp(['x(4)=',num2str(Gbest(4)),'和','x(5)=',num2str(Gbest(5)),'和','x(6)=',num2str(Gbest(6))]);
disp(['所求函数的最小值是',num2str(fitnessGbest)]);
figure
plot(Best)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
fun1.m
function y = fun1(x,t,task)
PEN=1e6; %罚系数
P=[0.7 0.1 0.025]; %功率
R=[0.029 210 210 870 350 350]; %执行速度
B=100; %LAN传输带宽
T1=sum(x./R); %执行时间
T2=2*(sum(x(2:3)/B)+sum(2*x(4:6)/B)); %传输时间(往返双程)
T=T1+T2; %总时耗
E=P(1)*(x(1)/R(1))+(P(2)+P(3))*sum(x(2:6)); %能耗
if T<t
y=E;
else
y=E*(T/t);
end
if sum(x)~=task
y=y+(PEN*abs(task-sum(x))-1); %罚函数
end
end