Navigator
Goal programming
多目标规划的一般形式,即多目标LP问题
{ min ( f 1 ( x ) , f 2 ( x ) , … , f p ( x ) ) g i ( x ) ≤ 0 , i = 1 , 2 , … , k h j ( x ) = 0 , j = 1 , 2 , … , l \left\{ \begin{aligned} &\min(f_1(x), f_2(x), \dots, f_p(x))\\ & g_i(x)\leq 0, i=1,2, \dots, k\\ &h_j(x)=0, j=1,2,\dots, l \end{aligned} \right. ⎩⎪⎨⎪⎧min(f1(x),f2(x),…,fp(x))gi(x)≤0,i=1,2,…,khj(x)=0,j=1,2,…,l
考虑到多目标问题中的量纲规范化问题,对于 j j j个带量纲的目标 F j ( x ) F_j(x) Fj(x),令
f j ( x ) = F j ( x ) / F j F j = min F j ( x ) \begin{aligned} &f_j(x)=F_j(x)/F_j\\ &F_j=\min F_j(x) \end{aligned} fj(x)=Fj(x)/FjFj=minFj(x)
处理多目标规划问题的方法
评价函数法
评价函数法是将模型(VMP)中的分目标函数转化为一个与之相关的单目标函数问题,对于一个多目标极小化模型 V = min R F ( x ) V=\min_R F(x) V=minRF(x),其中 F ( x ) = [ f 1 ( x ) , … , f m ( x ) ] T F(x)=[f_1(x), \dots, f_m(x)]^T F(x)=[f1(x),…,fm(x)]T, R R R为约束集,构造一个单目标极小化问题
min x ∈ R ϕ [ f 1 ( x ) , … , f m ( x ) ] = min ϕ [ F ( x ) ] \min_{x\in R}\phi[f_1(x), \dots, f_m(x)]=\min \phi[F(x)] x∈Rminϕ[f1(x),…,fm(x)]=minϕ[F(x)]
线性加权法
设置评价函数为
ϕ [ F ( x ) ] = ∑ i = 1 m λ i f i ( x ) \phi[F(x)]=\sum_{i=1}^m\lambda_if_i(x) ϕ[F(x)]=i=1∑mλifi(x)
其中 λ i ≥ 0 , i = 1 , 2 , … , m \lambda_i\geq 0, i=1,2,\dots, m λi≥0,i=1,2,…,m, 且 ∑ i = 1 m λ i = 1 \sum_{i=1}^m\lambda_i=1 ∑i=1mλi=1
平方和加权法
先求出各个单目标规划问题的一个尽可能好的下界 f 1 0 , f 2 0 , … , f p 0 f_1^0, f_2^0, \dots, f_p^0 f10,f20,…,fp0,满足
min x ∈ R f i ( x ) ≥ f i 0 \min_{x\in R} f_i(x)\geq f_i^0 x∈Rminfi(x)≥fi0
然后构造评价函数
ϕ [ F ( x ) ] = ∑ i = 1 m λ i [ f i ( x ) − f i 0 ] 2 \phi[F(x)]=\sum_{i=1}^m\lambda_i[f_i(x)-f_i^0]^2 ϕ[F(x)]=i=1∑mλi[fi(x)−fi0]2
极小-极大法
min-max
决策偏好为:希望在最不利的情况下找出最优解,设置评价函数为
ϕ [ F ( x ) ] = max 1 ≤ i ≤ m { f i ( x ) } \phi[F(x)]=\max_{1\leq i\leq m}\{f_i(x)\} ϕ[F(x)]=1≤i≤mmax{
fi(x)}
则VMP可以转换为如下极小化问题
min x ∈ R ϕ [ F ( x ) ] = min x ∈ R max { f i ( x ) } \min_{x\in R}\phi[F(x)]=\min_{x\in R}\max\{f_i(x)\} x∈Rminϕ[F(x)]=x∈Rminmax{
fi(x)}
乘除法
在VMP中,设对任意 x ∈ R x\in R x∈R,各目标函数值均满足 f i ( x ) > 0 , i = 1 , 2 , … , m f_i(x)>0, i=1,2,\dots, m fi(x)>0,i=1,2,…,m,将目标分为两类,不妨设其分别为:
- f 1 ( x ) , f 2 ( x ) , … , f t ( x ) → min f_1(x), f_2(x), \dots, f_t(x)\to \min f1(x),f2(x),…,ft(x)→min
- f t + 1 ( x ) , f t + 2 ( x ) , … , f m ( x ) → max f_{t+1}(x), f_{t+2}(x), \dots, f_m(x)\to \max ft+1(x),ft+2(x),…,fm(x)→max
构造评价函数求解
ϕ [ F ( x ) ] = ∏ j = 1 t f j ( x ) ∏ j = t + 1 m f j ( x ) \phi[F(x)]=\frac{\prod_{j=1}^t f_j(x)}{\prod_{j=t+1}^m f_j(x)} ϕ[F(x)]=∏j=t+1mfj(x)∏j=1tfj(x)
理想点法
可以先分别求出各个分目标函数的极小值,然后让各个目标尽量接近极小值来获得解.
MSEP算法
MSEP算法是一种混合策略进化算法,该算法将进化博弈论的思想运用到个体的进化过程中,个体通过变异和选择进行进化博弈,并通过调整进化策略获得更好的结果。设 I I I是由 μ \mu μ个个体组成的种群,由CEP,FEP,LEP和SPMEP四种变异方式组成了一个变异算子集合,对每个个体定义一个混合策略向量 ρ \rho ρ,该向量的每一个分量与变异算子集合中的变异方式一一对应,在进化过程中,在进化过程中,每个个体根据混合策略向量的值进行更新。
差分进化计算
差分进化计算与GA的主要不同点在于变异算子和交叉算子。差分进化计算中,每个基因位的改变值都取决于其他个体之间的差值。
Memetic算法
与传统优化算法相比有以下优点:
- 不需要目标函数的导数,可以扩大算法的应用领域,尤其适合很难求导的复杂优化问题
- 采用群体搜索策略,扩大了解的搜索空间,提高了算法的求解质量
- 算法采用局部搜索策略,改善了种群结构,提高了算法的局部搜索能力
- 算法提供了一种解决优化问题的方法,对于不同领域的优化问题,可以通过改变交叉,变异和局部搜索策略求解
GA求解案例1
求解目标函数的极小值
f ( x ) = 20 + [ x 1 2 − 10 cos ( 2 π x 1 ) ] + [ x 2 2 − 10 cos ( 2 π x 2 ) ] , ∣ x i ∣ ≤ 5.12 , i = 1 , 2 f(x)=20+[x_1^2-10\cos(2\pi x_1)]+[x_2^2-10\cos(2\pi x_2)], |x_i|\leq 5.12, i=1,2 f(x)=20+[x12−10cos(2πx1)]+[x22−10cos(2πx2)],∣xi∣≤5.12,i=1,2
Code
function cbest = MLYGA(func, numvar, popsize, iter_max, pm, px, LB, UB)
% parameters check
% 默认设置变异概率为0.1
if isempty(pm)
pm=0.1;
end
if isempty(px)
px=0.9;
end
if isempty(iter_max)
iter_max=5000;
end
if isempty(popsize)
popsize=30;
end
pop=init(numvar, popsize, LB, UB); % 初始化函数
for i=1:popsize
pop(i).fitness = func(pop(i).x);
end
cbest = pop(1);
cworst=pop(1);
[cbest, cworst, ~] = f(pop, 1, cbest, cworst); % 获得最优解和最差解
% 进行遗传迭代
for iter=1:iter_max
pop = ca(pop); % 适应度值
pop = s(pop); % 选择
pop = c(pop,px, LB, UB); % 交叉
pop = m(pop, pm, LB, UB, iter, iter_max); % 变异
for i=1:popsize
pop(i).fitness = func(pop(i).x);
end
[cbest, cworst, best] = f(pop, iter, cbest, cworst);
pop(popsize) = best;
end
end
%----------------function:init-----------------------------初始化
function pop = init(numvar, popsize, LB, UB)
for i=1:popsize
pop(i).x=LB'+rand(1, numvar).*(UB-LB)';
end
end
%----------------function:f--------------------------------解分离
function [cbest, cworst, best] = f(pop, iter, cbest, cworst)
popsize = size(pop, 2);
best = pop(1);
worst = pop(1);
% 迭代得到最优值和最坏值
for i=2:popsize
if pop(i).fitness<best.fitness
best = pop(i);
elseif pop(i).fitness>worst.fitness
worst = pop(i);
end
end
if iter==1
cbest=best;
cbest.index=1;
else
if best.fitness<cbest.fitness
cbest = best;
cbest.index=iter; % 记录在第几轮迭代得到了最优值
end
end
end
%--------------function:ca--------------------------------计算种群中个体的适应度
function pop = ca(pop)
popsize = size(pop, 2);
for i=1:popsize
pop(i).index = -1;
end
for i=1:popsize
index=1;
for j=1:popsize
if pop(j).fitness<pop(i).fitness && i~=j
index = index+1;
elseif pop(i).fitness==pop(j).fitness && pop(j).index~=-1&&i~=j
index = index+1;
end
end
pop(i).index=index;
end
al=0.6;
for i=1:popsize
pop(i).fitness = al*(1-al)^(pop(i).index-1);
end
end
%--------------------function:select------------------------选择算子
function pop = s(pop)
popsize = size(pop, 2);
totalfit = zeros(1, popsize);
for i=1:popsize
if i==1
totalfit(i) = pop(i).fitness;
else
totalfit(i) = totalfit(i-1)+pop(i).fitness;
end
end
totalfit = totalfit/totalfit(popsize); % 归一化操作
% 轮盘赌的方法选择,组成新的种群
for i=1:popsize
p = rand;
index=1;
while totalfit(index)<p
index=index+1;
end
new(i)=pop(index);
end
pop=new;
end
%---------------------function:crossover---------------交叉算子
function pop=c(pop, px, LB, UB)
popsize=size(pop, 2);
ndim = length(pop(1).x);
for i=1:popsize
index = ceil(rand(1, 2).*popsize);
if rand<px
pos = ceil(rand.*ndim);
v1 = pop(index(1)).x(pos);
v2 = pop(index(2)).x(pos);
% crossover
pop(index(1)).x(pos)=rand*v2+(1-rand)*v1;
pop(index(2)).x(pos)=rand*v1+(1-rand)*v2;
pop(index(1)).x(pos)=b(pop(index(1)).x(pos), LB(pos), UB(pos));
pop(index(2)).x(pos)=b(pop(index(1)).x(pos), LB(pos), UB(pos));
end
end
end
%--------------------function:mutation----------------变异算子
function pop=m(pop, pm, LB, UB, iter, iter_max)
popsize = size(pop, 2);
genelen=length(pop(1).x);
for i=1:popsize
for j=1:genelen
if rand<pm
v1 = pop(i).x(j)-UB(j);
v2 = LB(j)-pop(i).x(j);
fg = rand*(1-iter/iter_max)^2;
if rand>0.5
pop(i).x(j)=pop(i).x(j)+v1*fg;
else
pop(i).x(j)=pop(i).x(j)+v2*fg;
end
pop(i).x(j)=b(pop(i).x(j), LB(j), UB(j));
end
end
end
end
%--------------------------function: b--------------------------边界检测
function y=b(x, LB, UB)
if x>=UB
y=LB+(x-UB);
elseif x<=LB
y=UB-(LB-x);
else
y=x;
end
end
GA求解案例2
求解函数的极小值
min f ( x , y ) = 100 ( y − x 2 ) 2 + ( 1 − x ) 2 s . t . { g 1 ( x , y ) = − x − y 2 ≤ 0 g 2 ( x , y ) = − x 2 − y ≤ 0 − 0.5 ≤ x ≤ 0.5 , y ≤ 1 \begin{aligned} &\min f(x, y)=100(y-x^2)^2+(1-x)^2\\ &s.t. \begin{cases} &g_1(x, y)=-x-y^2\leq 0\\ &g_2(x, y)=-x^2-y\leq 0\\ &-0.5\leq x\leq 0.5, y\leq 1 \end{cases} \end{aligned} minf(x,y)=100(y−x2)2+(1−x)2s.t.⎩⎪⎨⎪⎧g1(x,y)=−x−y2≤0g2(x,y)=−x2−y≤0−0.5≤x≤0.5,y≤1
将其转为无约束问题求解
Reference
最优化方法及其MATLAB实现