现实世界中的多目标优化问题往往包含不等式约束和等式约束,对于这类带约束条件的多目标优化问题,需要使用有别于无约束优化问题的处理方法。下面首先给出带约束条件的多目标优化问题的的定义:
在这个定义式中,为了描述方便,将所有的不等式约束都转换为了 g(x)≤0的形式。其中m为目标函数的个数,n为决策变量的个数,J为不等式约束条件的个数,K为等式约束条件的个数
针对这类带约束条件的优化问题,使用无约束多目标进化算法处理的方法显然是不可行的,为了解决这类约束多目标优化问题,针对基于Pareto支配关系的算法,主要使用带约束的支配关系(constrained-dominance)来处理,而对于基于分解的算法,则使用新的替换策略来更新解。
为了详细说明上述两种方法,现介绍几个重要的概念。
对于一个解x,若其满足约束条件,则称该解为可行解(feasible solution),若不满足,则称之为不可行解(infeasible solution)。
对于不可行解,如何描述其违反约束的程度呢,一般使用约束违反值(constraint violation value),该值用来定量描述一个解违反约束条件的程度。对于一个解x,其值可如下表达
其中⟨α⟩ 表示若α≤0,则⟨α⟩=0否则⟨α⟩=∣α∣。显然,对于一个解,其CV值越小,说明该解越优。同时,对于一个可行解,其CV值为0,对于不可行解,其CV值则大于0。
下面介绍约束支配关系,对于任意两个解x,y,x约束支配y的条件满足以下条件的任一项即可:
- x 是可行解,而y是不可行解;
- x,y都不是可行解,但CV(x)
- x,y都是可行解,且x Pareto支配 y
以上便是约束支配关系的描述,对于一个带约束的多目标优化问题,便可直接将该支配关系应用到基于Pareto支配关系的多目标进化算法中,如NSGA-II,NSGA-III等,同时,对于无约束多目标优化问题,该支配关系显然也是有效的。
需要在非支配主导排序之前进行可行解和不可行解的筛选,对于不可行解,进行惩罚函数进行惩罚,其中针对不同的目标函数,加以不同的权重进行惩罚。
PopCon=constrained_dominance(x(:,1:24), 3, 24);
PopObj=x(:,25:27);
Infeasible =any(PopCon>0,2);
PopObj(Infeasible,:) = PopObj(Infeasible,:)+ repmat(max(PopObj,[],1),sum(Infeasible),1) + repmat(sum(max(0,PopCon(Infeasible,:)),2),1,size(PopObj,2));
下面介绍基于分解的算法处理约束多目标优化问题中的替换策略。假设y是新生成的子代解,选择一个邻居解x来确定是否用解y替换解x,满足以下条件的任一项则替换之:
- x是不可行解,y是可行解;
- x,y都不是可行解,但CV(x)>CV(y)
- x,y都是可行解,但解y的聚合函数值更小
该替换策略可直接用到MOEA/D或其他基于分解思想的多目标进化算法中来处理约束多目标优化问题。
以上便是目前约束多目标优化问题处理的一些常用方法。
以下代码计算约束值
function [cv]= constrained_dominance(x, M, V)
cv=[];
x=round(x);
x11=x(:,1);
x12 =x(:,2);
x21 =x(:,3);
x22 =x(:,4);
x31 =x(:,5);
x32 =x(:,6);
x41 =x(:,7);
x42 =x(:,8);
y11 =x(:,9);
y12 =x(:,10);
y13 =x(:,11);
y14 =x(:,12);
y15 =x(:,13);
y16 =x(:,14);
y17 =x(:,15);
y18 =x(:,16);
y21 =x(:,17);
y22 =x(:,18);
y23 =x(:,19);
y24 =x(:,20);
y25 =x(:,21);
y26 =x(:,22);
y27 =x(:,23);
y28 =x(:,24);
cf(:,1)=x11+x12-800;
cf(:,2)=x21+x22-1200;
cf(:,3)=x31+x32-1000;
cf(:,4)=x41+x42-1100;
cf(:,5)=62-(y11+y21);
cf(:,6)=70-(y12+y22);
cf(:,7)=17-(y13+y23);
cf(:,8)=260.9-(y14+y24);
cf(:,9)=79.8-(y15+y25);
cf(:,10)=593-(y16+y26);
cf(:,11)=333-(y17+y27);
cf(:,12)=36-(y18+y28);
cf(:,13)=y11+y21-88;
cf(:,14)=y12+y22-100;
cf(:,15)=y13+y23-23;
cf(:,16)=y14+y24-372;
cf(:,17)=y15+y25-114;
cf(:,18)=y16+y26-847;
cf(:,19)=y17+y27-476;
cf(:,20)=y18+y28-51;
cf(:,21)=y11+y12+y13+y14+y15+y16+y17+y18-(x11+x21+x31+x41);
cf(:,22)=y21+y22+y23+y24+y25+y26+y27+y28-(x12+x22+x32+x42);
cf(:,23)=0;
cv=zeros(pop,1);
for a =1 :pop
for b =1 :22
if cf(a,b)>0
cv(a,1)= cv(a,1)+1;
else cf(a,23)=cf(a,23)+1;
end
end
end
cv=cv;
end