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实现