【GP】多目标规划建模方法

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)] xRminϕ[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=1mλifi(x)
其中 λ i ≥ 0 , i = 1 , 2 , … , m \lambda_i\geq 0, i=1,2,\dots, m λi0,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 xRminfi(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=1mλ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)]=1immax{ 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)\} xRminϕ[F(x)]=xRminmax{ fi(x)}

乘除法

在VMP中,设对任意 x ∈ R x\in R xR,各目标函数值均满足 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算法

与传统优化算法相比有以下优点:

  1. 不需要目标函数的导数,可以扩大算法的应用领域,尤其适合很难求导的复杂优化问题
  2. 采用群体搜索策略,扩大了解的搜索空间,提高了算法的求解质量
  3. 算法采用局部搜索策略,改善了种群结构,提高了算法的局部搜索能力
  4. 算法提供了一种解决优化问题的方法,对于不同领域的优化问题,可以通过改变交叉,变异和局部搜索策略求解

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+[x1210cos(2πx1)]+[x2210cos(2πx2)],xi5.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(yx2)2+(1x)2s.t.g1(x,y)=xy20g2(x,y)=x2y00.5x0.5,y1
将其转为无约束问题求解
fitness

Reference

最优化方法及其MATLAB实现

猜你喜欢

转载自blog.csdn.net/qq_18822147/article/details/117441359