目录
遗传算法(Genetic Algorithm, GA)是一种模拟自然界生物进化过程的全局优化搜索方法,广泛应用于解决多目标优化问题。在多目标优化中,每个解通常对应多个目标函数的值,而这些目标往往相互冲突,难以同时达到最优。三目标优化是指在优化过程中同时考虑三个相互独立的目标函数,寻求在这三个维度上的帕累托最优解集。为了将这三个目标综合为一个单一的目标值以适应遗传算法的框架,通常采用加权和的方法,这要求对每个目标赋予一定的权重,反映了决策者对不同目标重要性的主观判断。
1.加权综合方法原理
设三个目标函数分别为f1(x),f2(x),f3(x),其中x表示解决方案向量。为了将这三个目标合并成一个单一的评价函数,可以定义一个加权综合函数F(x):
F(x)=w1⋅f1(x)+w2⋅f2(x)+w3⋅f3(x)
其中,w1,w2,w3是正实数,且满足w1+w2+w3=1,代表各个目标的相对重要性权重。通过调整这些权重,可以反映决策者对不同目标的不同偏好。
2.遗传算法流程
在应用遗传算法解决三目标优化问题时,基本流程包括初始化、评估、选择、交叉(杂交)、变异和终止等步骤。
-
初始化:随机生成一个初始种群P0,每个个体代表一个解向量x,即一个三目标问题的可能解决方案。
-
评估:计算每个个体在三个目标函数上的值,即计算1(x),f2(x),f3(x),然后根据上述加权综合函数F(x)计算每个个体的适应度值。
-
选择:基于轮盘赌选择法或锦标赛选择法等策略,从当前种群中按照适应度值挑选出一部分个体进入下一代,确保优良基因得以传承。
-
交叉(杂交):从被选中的个体中随机选取两个作为父母,通过某种交叉方式(如单点交叉、多点交叉等)生成新的后代,以引入多样性。
-
变异:以小概率对某些个体的部分基因进行变异操作,进一步增加种群多样性,避免早熟收敛。
-
终止条件:当达到预设的迭代次数、种群内解的质量不再显著提升或达到特定的收敛准则时,算法终止,并输出当前最优解或近似帕累托前沿的解集。
3.MATLAB程序
.....................................................................
while gen < MAXGEN;
gen
%目标1
FitnV1 = ranking(Objv1);
Selch1 = select('sus',Chrom(1:NIND/3,:),FitnV1);
%目标2
FitnV2 = ranking(Objv2);
Selch2 = select('sus',Chrom(NIND/3+1:2*NIND/3,:),FitnV2);
%目标3
FitnV3 = ranking(Objv3);
Selch3 = select('sus',Chrom(2*NIND/3+1:end,:),FitnV3);
Selch = [Selch1;Selch2;Selch3];
Selch = recombin('xovsp', Selch,0.9);
Selch = mut( Selch,0.1);
phen = bs2rv(Selch,FieldD);
ind1 = 0;
for a=1:NIND/3
ind1 = ind1 + 1;
else
tmps = [phen(a,1),phen(a,2),phen(a,3)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w1_NIND(ind1) = VV(1);
w2_NIND(ind1) = VV(2);
w3_NIND(ind1) = VV(3);
tmps = [phen(a,4),phen(a,5),phen(a,6)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w4_NIND(ind1) = VV(1);
w5_NIND(ind1) = VV(2);
w6_NIND(ind1) = VV(3);
tmps = [phen(a,7),phen(a,8),phen(a,9)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w7_NIND(ind1) = VV(1);
w8_NIND(ind1) = VV(2);
w9_NIND(ind1) = VV(3);
tmps = [phen(a,10),phen(a,11),phen(a,12)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w10_NIND(ind1) = VV(1);
w11_NIND(ind1) = VV(2);
w12_NIND(ind1) = VV(3);
tmps = [phen(a,13),phen(a,14),phen(a,15)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w13_NIND(ind1) = VV(1);
w14_NIND(ind1) = VV(2);
w15_NIND(ind1) = VV(3);
end
xij = [w1_NIND(ind1), w2_NIND(ind1), w3_NIND(ind1);
w4_NIND(ind1), w5_NIND(ind1), w6_NIND(ind1);
w7_NIND(ind1), w8_NIND(ind1), w9_NIND(ind1);
w10_NIND(ind1), w11_NIND(ind1), w12_NIND(ind1);
w13_NIND(ind1), w14_NIND(ind1), w15_NIND(ind1)];
%为0-1变量,取1时,表示任务Ti和Tj分到了同一个节点上
rij = zeros(M,M);
for i = 1:M
t1 = xij(i,:);
ind1 = find(t1 == 1);
for j = 1:M
t2 = xij(j,:);
ind2 = find(t2 == 1);
if ind1 == ind2
rij(i,j) = 1;
end
end
end
%计算对应的目标值
MINX = func_object1(Ci,v,fai,rij,Cij,M);
J1(ind1,1) = 1/(MINX+0.001);
end
ind2 = 0;
for a=NIND/3+1:2*NIND/3
ind2 = ind2 + 1;
if gen == 1
w1_NIND(ind1) = xij(1,1);
w2_NIND(ind1) = xij(1,2);
w3_NIND(ind1) = xij(1,3);
w4_NIND(ind1) = xij(2,1);
w5_NIND(ind1) = xij(2,2);
w6_NIND(ind1) = xij(2,3);
w7_NIND(ind1) = xij(3,1);
w8_NIND(ind1) = xij(3,2);
w9_NIND(ind1) = xij(3,3);
w10_NIND(ind1) = xij(4,1);
w11_NIND(ind1) = xij(4,2);
w12_NIND(ind1) = xij(4,3);
w13_NIND(ind1) = xij(5,1);
w14_NIND(ind1) = xij(5,2);
w15_NIND(ind1) = xij(5,3);
else
tmps = [phen(a,1),phen(a,2),phen(a,3)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w1_NIND(ind1) = VV(1);
w2_NIND(ind1) = VV(2);
w3_NIND(ind1) = VV(3);
tmps = [phen(a,4),phen(a,5),phen(a,6)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w4_NIND(ind1) = VV(1);
w5_NIND(ind1) = VV(2);
w6_NIND(ind1) = VV(3);
tmps = [phen(a,7),phen(a,8),phen(a,9)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w7_NIND(ind1) = VV(1);
w8_NIND(ind1) = VV(2);
w9_NIND(ind1) = VV(3);
tmps = [phen(a,10),phen(a,11),phen(a,12)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w10_NIND(ind1) = VV(1);
w11_NIND(ind1) = VV(2);
w12_NIND(ind1) = VV(3);
tmps = [phen(a,13),phen(a,14),phen(a,15)];
[VS,IS] = max(tmps);
VV = zeros(1,3);
VV(IS) = 1;
w13_NIND(ind1) = VV(1);
w14_NIND(ind1) = VV(2);
w15_NIND(ind1) = VV(3);
end
xij = [w1_NIND(ind1), w2_NIND(ind1), w3_NIND(ind1);
w4_NIND(ind1), w5_NIND(ind1), w6_NIND(ind1);
w7_NIND(ind1), w8_NIND(ind1), w9_NIND(ind1);
w10_NIND(ind1), w11_NIND(ind1), w12_NIND(ind1);
w13_NIND(ind1), w14_NIND(ind1), w15_NIND(ind1)];
%为0-1变量,取1时,表示任务Ti和Tj分到了同一个节点上
rij = zeros(M,M);
for i = 1:M
t1 = xij(i,:);
ind1 = find(t1 == 1);
for j = 1:M
t2 = xij(j,:);
ind2 = find(t2 == 1);
if ind1 == ind2
rij(i,j) = 1;
end
end
end
%计算对应的目标值
MINY = func_object2(Ci,lemda1,lemda2,rij,Cij,M);
J2(ind2,1) = 1/(MINY+0.001);
end
ind3 = 0;
xij = [w1_NIND(ind1), w2_NIND(ind1), w3_NIND(ind1);
w4_NIND(ind1), w5_NIND(ind1), w6_NIND(ind1);
w7_NIND(ind1), w8_NIND(ind1), w9_NIND(ind1);
w10_NIND(ind1), w11_NIND(ind1), w12_NIND(ind1);
w13_NIND(ind1), w14_NIND(ind1), w15_NIND(ind1)];
%为0-1变量,取1时,表示任务Ti和Tj分到了同一个节点上
rij = zeros(M,M);
for i = 1:M
t1 = xij(i,:);
ind1 = find(t1 == 1);
for j = 1:M
t2 = xij(j,:);
ind2 = find(t2 == 1);
if ind1 == ind2
rij(i,j) = 1;
end
end
end
%计算对应的目标值
MAXZ = func_object3(wj,ECTLj,Ci,lemda1,xij,lemda2,rij,Cij,M,N);
J3(ind3,1) = 1/MAXZ;
end
Objvsel1 = J1;
Objvsel2 = J2;
Objvsel3 = J3;
%多目标优化
Objvsel =[Objvsel1 ;Objvsel2 ;Objvsel3];
[Chrom,Objv] = reins(Chrom,Selch,1,1,Objv,Objvsel);
gen = gen+1;
%多目标收敛效果
fitness1(gen)= mean(Objv(1:NIND/3));
fitness2(gen)= mean(Objv(NIND/3+1:2*NIND/3));
fitness3(gen)= mean(Objv(2*NIND/3+1:end));
end
figure;
plot(fitness1(4:end),'b','linewidth',2);
hold on;
plot(fitness2(4:end),'r','linewidth',2);
hold on;
plot(fitness3(4:end),'k','linewidth',2);
hold on;
grid on;
xlabel('迭代次数');
ylabel('最优值变化');
legend('目标X','目标Y','目标Z');
save GA.mat fitness1 fitness2 fitness3
up4092
4.仿真结果
遗传算法在解决三目标优化问题时,通过加权综合目标函数值,简化了多目标优化问题到单目标优化问题的过程,但同时也引入了权重分配的主观性和可能的优化偏见。