其他分享
首页 > 其他分享> > 多目标规划——以Matlab中fgoalattain为主

多目标规划——以Matlab中fgoalattain为主

作者:互联网

多目标规划

目录

在实际问题中,衡量一个设计方案的好坏往往不止一个标准,常常要考虑多个目标。我们把在这样的背景下建立起来的最优化称之为多目标规划问题。

求解方法

约束法

约束法又称主要目标法,它根据问题的实际情况.确定一个目标为主要目标,而把其余目标作为次要目标,并根据决策者的经验给次要的目标选取—定的界限值,这样就可以把次要目标作为约束来处理,从而就将原有多目标规划问题转化为一个在新的约束下,求主要目标的单目标最优化问题。

假设在p个目标中,\(f_1(x)\)为主要目标,而对应于其余\((p-1)\)个目标函数\(f_i(x)\)均可以确定其允许的边界值:\(a~i~⩽ f_i\leqslant b_i,i=2,3,…,p\)。这样我们就可以将这\((p-1)\)个目标函数当作最优化问题的约束来处理,于是多目标规划问题转化为单目标规划问题

\[\left\{\begin{array}{l}min~f_1(x)\\ s.t.~~ g_{j}(x) \geq 0, \quad j=1,2, \cdots, m \\ ~~~~~~~~a_j\leq f_j\leq b_j(j=2,3,…,p)\end{array}\right. \]

评价函数法

例如原多目标规划问题的目标函数为\(F(x)\),则我们可以通过不同的方式构造评价函\(h(F(x))\),然后求解如下问题

\[\left\{\begin{array}{l}min~h(F(x))\\ s.t.~~ x\subset R\end{array}\right. \]

求解上述问题之后,可以用上述问题的最优解x作为多目标规划问题的最优解,正是由于可以用不同的方法来构造评价函数,因此有各种不同的评价函数方法,下面介绍几种常用的方法。
评价函数法中主要有:理想点法、平方和加权法、线性加权和法、乘除法、最大最小法。

目标规划的一般数学模型

\[\min \quad z=\sum_{k=1}^{q} P_{k}\left(\sum_{j=1}^{l} w_{k j}^{-} d_{j}^{-}+w_{k j}^{+} d_{j}^{+}\right)\\\left\{\begin{array}{l}\sum_{j=1}^{n} a_{i j} x_{j} \leq(=, \geq) b_{i}, \quad i=1, \cdots, m \\ \sum_{j=1}^{n} c_{i j} x_{j}+d_{i}^{-}-d_{i}^{+}=g_{i}, \quad i=1,2, \cdots, l \\ x_{j} \geq 0, \quad j=1,2, \cdots, n \\ d_{i}^{-}, d_{i}^{+} \geq 0, \quad i=1,2, \cdots, l\end{array}\right. \]

设\(x_j~(j=1,2,...,n)\)是目标规划的决策变量,共有\(m\)个约束是刚性约束,可能是等式约束,也可能是不等式约束。设有了l个柔性目标,其目标规划约束的偏差为\(d_i~^+,d_i~^-(i=1,2,...,l)\)。设有\(q\)个优先级别,分别为\(P_1~,P_2~,…,P_q~\)。在同一个优先级Pk中,有不同的权重,分别记为\(w_{kj}~ ^+,w_{kj}~^-(j=1,2,…,l)\)。

建立目标规划的数学模型时,需要确定目标值、优先等级、权系数等,它都具有一 定的主观性和模糊性,可以用专家评定法给以量化。 (其实就是查文献)

求解目标规划的序贯式算法

序贯式算法是求解目标规划的一种早期算法,其核心是根据优先级的先后次序, 将目标规划问题分解成一系列的单目标规划问题,然后再依次求解。

对于\(k=1,2,…,q\),求解单目标规划

\[\min \quad z=\sum_{j=1}^{l}\left(w_{k j}^{-} d_{j}^{-}+w_{k j}^{+} d_{j}^{+}\right)\\s.t.~~\sum_{j=1}^{n} a_{i j} x_{j} \leq(=, \geq) b_{i}, \quad i=1, \cdots, m\\~~~~~~~~~~~~~~~~\sum_{j=1}^{n} c_{i j} x_{j}+d_{i}^{-}-d_{i}^{+}=g_{i}, \quad i=1,2, \cdots, l\\\begin{array}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\sum_{j=1}^{l}\left(w_{s j}^{-} d_{j}^{-}+w_{s j}^{+} d_{j}^{+}\right) \leq z_{s}^{*}, \quad s=1,2, \cdots, k-1, \\x_{j} \geq 0, \quad j=1,2, \cdots, n \\d_{i}^{-}, d_{i}^{+} \geq 0, \quad i=1,2, \cdots, l\end{array} \]

其最优目标值为\(z_k^*\) ,当\(k=1\)时,第三个约束为空约束。当\(k=q\)时,\(z_q^*\)对应的解\(x^*\)为目标规划的最优解。

Matlab中的多目标规划解法

语法及说明

x = fgoalattain(fun,x0,goal,weight)
%尝试从 x0 开始、用 weight 指定的权重更改 x,使 fun 提供的目标函数达到 goal 指定的目标。
x = fgoalattain(fun,x0,goal,weight,A,b)
%求解满足不等式 A*x ≤ b 的目标达到问题。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
%求解满足等式 Aeq*x = beq 的目标达到问题。如果不存在不等式,则设置 A = [] 和 b = []。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
%求解满足边界 lb ≤ x ≤ ub 的目标达到问题。如果不存在等式,请设置 Aeq = [] 和 beq = []。如果 x(i) 无下界,则设置 lb(i) = -Inf;如果 x(i) 无上界,则设置 ub(i) = Inf。如果为问题指定的输入边界不一致,则输出 x 为 x0,输出 fval 为 []。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
%求解满足 nonlcon 所定义的非线性不等式 c(x) 或等式 ceq(x) 的目标达到问题。fgoalattain 进行优化,以满足 c(x) ≤ 0 和 ceq(x) = 0。如果不存在边界,则设置 lb = [] 和/或 ub = []。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
%使用 options 所指定的优化选项求解目标达到问题。使用 optimoptions 可设置这些选项。
x = fgoalattain(problem)
%求解 problem 所指定的目标达到问题,它是 problem 中所述的一个结构体。
[x,fval] = fgoalattain(___)
%对上述任何语法,返回目标函数 fun 在解 x 处计算的值。
[x,fval,attainfactor,exitflag,output] = fgoalattain(___)
%还返回在解 x 处的达到因子、描述 fgoalattain 退出条件的值 exitflag,以及包含优化过程信息的结构体 output。
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(___)
%还返回结构体 lambda,其字段包含在解 x 处的拉格朗日乘数。

fgoalattain 求解目标达到问题,这是多目标优化问题最小化的一种表示。

fgoalattain 求以下问题的最小值:

\[\min_{x,\gamma}~ _{\gamma}~such~that \left\{\begin{aligned} F(x)-\text { weight } \cdot \gamma & \leq \text { goal } \\ x, \gamma & \leq 0 \\ c e q(x) &=0 \\ A \cdot x & \leq b \\ A e q \cdot x &=b e q \\ l b & \leq x \leq u b . \end{aligned}\right. \]

weightgoal、b 和 beq 是向量,A 和 Aeq 是矩阵,F(x)、c(x) 和 ceq(x) 是返回向量的函数。F(x)、c(x) 和 ceq(x) 可以是非线性函数。

x、lb 和 ub 可以作为向量或矩阵传递

输入参数

goal——要到达的目标

要达到的目标,指定为实数向量。fgoalattain 尝试找到最小乘数 γ,使以下不等式对于解 x 处的所有 i 值都成立:

\[F_{i}(x)-\operatorname{goal}_{i} \leq weight _{i~\gamma} \]

假设 weight 是正向量:

weight——相对到达因子

相对达到因子,指定为实数向量。fgoalattain 尝试找到最小乘数 γ,使以下不等式对于解 x 处的所有 i 值都成立:

\[F_{i}(x)-\operatorname{goal}_{i} \leq weight _{i~\gamma} \]

goal 的值全部非零时,为确保溢出或低于活动目标的百分比相同,请将 weight 设置为 abs(goal)。(活动目标是一组目标,它们阻碍解处的目标进一步改进。)

weight 为正时,fgoalattain 尝试使目标函数小于目标值。要使目标函数大于目标值,请将 weight 设置为负值而不是正值。

要使目标函数尽可能接近目标值,请使用 EqualityGoalCount 选项,并将目标指定为 fun 返回的向量的第一个元素(

输出参数

attainfactor - 达到因子

达到因子,以实数形式返回。attainfactor 包含解处的 γ 值。如果 attainfactor 为负,则目标过达到;如果 attainfactor 为正,则目标欠达到。

示例

基本目标到达问题

假设有以下双目标函数

\[F(x)=\left[\begin{array}{c}2+(x-3)^{2} \\ 5+x^{2} / 4\end{array}\right] \]

显然,在此函数中,当 \(x=3\) 时,\(F_1(x)\) 最小,达到 2;当$ x=0$ 时,\(F2(x)\) 最小,达到 5。

设置目标 [3,6] 和权重 [1,1],并从 x0 = 1 开始求解目标达到问题。

fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
x = fgoalattain(fun,x0,goal,weight);

运行脚本得到

x =

    2.0000

计算\(F(x)\)在解处的值。

fun(x)
ans =

    3.0000
    6.0000

fgoalattain 完全达到了目标。

具有线性约束的目标达到问题

目标函数是

\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]

此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)

创建目标函数、目标和权重。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

创建表示 A*x <= b 的线性约束矩阵 Ab

A = [1,1];
b = 4;

设置初始点 [1,1] 并求解目标达到问题。

x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b)

运行脚本

x = 

    2.0694    1.9306

计算$ F(x)$在解处的值。

fun(x)
ans = 

    3.1484
    6.1484

fgoalattain 没有满足目标。由于权重相等,求解器溢出每个目标的量是相同的。

有边界的目标达到问题

目标函数是

\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]

此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],边界是 \(0≤x_1≤3、2≤x_2≤5\)。

创建目标函数、目标和权重。

fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
x = fgoalattain(fun,x0,goal,weight);

创建边界。

lb = [0,2];
ub = [3,5];

将初始点设置为 [1,4],并求解目标达到问题

x0 = [1,4];
A = []; % no linear constraints
b = [];
Aeq = [];
beq = [];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)

运行脚本得到

x = 

    2.6667    2.3333

计算$ F(x)$在解处的值。

fun(x)
ans = 

    2.8889
    5.8889

fgoalattain 超出满足目标。由于权重相等,求解器结果溢出每个目标的量是相同的。

具有非线性约束的目标达到

目标函数是

\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]

此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]\(。目标是 [3,6],权重是 [1,1],非线性约束是\) ||x||^2≤4。$

创建目标函数、目标和权重。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

非线性约束函数在 norm4.m 文件中。

type norm4
function [c,ceq] = norm4(x)
ceq = [];
c = norm(x)^2 - 4;

为线性约束和边界创建空输入参数。

A = [];
Aeq = [];
b = [];
beq = [];
lb = [];
ub = [];

将初始点设置为 [1,1],并求解目标达到问题。

x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,@norm4)

运行脚本得到

x = 

    1.1094    1.6641

计算$ F(x)$在解处的值。

fun(x)
ans = 

    4.5778
    7.1991

fgoalattain 没有满足目标。尽管权重相等,但$ F_1(x) \(与其目标 3 相差约 1.58,\)F_2(x) $与其目标 6 相差约 1.2。非线性约束会防止解 x 同等地达到各目标。

获取目标达到中的目标函数值

目标函数是

\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]

此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)

创建目标函数、目标和权重。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

创建表示 A*x <= b 的线性约束矩阵 Ab

A = [1,1];
b = 4;

设置初始点 [1,1] 并求解目标达到问题。

x0 = [1,1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)

运行脚本得到

x = 

    2.0694    1.9306
fval =

    3.1484
    6.1484 

目标函数值高于目标,这意味着 fgoalattain 不满足目标。

获得目标达到运算中的所有输出

目标函数是

\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]

此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)

创建目标函数、目标和权重。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

创建表示 A*x <= b 的线性约束矩阵 Ab

A = [1,1];
b = 4;

设置初始点 [1,1] 并求解目标达到问题。请求返回目标函数的值、实现因子、退出标志、输出结构体和拉格朗日乘数。

x0 = [1,1];
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(fun,x0,goal,weight,A,b)

运行脚本得到

x = 

    2.0694    1.9306

fval = 

    3.1484
    6.1484

attainfactor = 0.1484
exitflag = 4
output = struct with fields:
         iterations: 6
          funcCount: 29
       lssteplength: 1
           stepsize: 4.1263e-13
          algorithm: 'active-set'
      firstorderopt: []
    constrviolation: 6.8393e-13
            message: '...'

lambda = struct with fields:
         lower: [2x1 double]
         upper: [2x1 double]
         eqlin: [0x1 double]
      eqnonlin: [0x1 double]
       ineqlin: 0.5394
    ineqnonlin: [0x1 double]

attainfactor 为正值表明目标没有达到;您也可以通过比较 fvalgoal 来确定这一点。

lambda.ineqlin 值非零,表明线性不等式对解进行了约束。

权重、目标和约束对目标达到的影响

目标函数是

\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]

此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)

创建目标函数、目标和权重。

p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

创建表示 A*x <= b 的线性约束矩阵 Ab

A = [1,1];
b = 4;

从点 x0 = [1 1] 开始求解目标达到问题。

x0 = [1 1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)

运行脚本得到

x = 

    2.0694    1.9306

fval = 

    3.1484
    6.1484

fval 的每个分量都高于 goal 的对应分量,表明目标未达到。

通过将 weight(1) 设置为较小的值,提高满足第一个目标的重要性。

weight(1) = 1/10;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)

再次运行脚本得到

x =

    2.0115    1.9885

fval =

    3.0233
    6.2328

现在,fval(1) 的值更接近 goal(1),而 fval(2) 更远离 goal(2)

goal(2) 更改为 7,该值高于当前解。解发生变化。

goal(2) = 7;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)

再次运行脚本得到

x = 

    1.9639    2.0361

fval = 

    2.9305
    6.3047

fval 的两个分量都小于 goal 的对应分量。但是,与 fval(2)goal(2) 的接近程度相比,fval(1) 更接近 goal(1)。在目标无法达到时,权重越小,会使对应分量更可能接近达到,但在目标能够达到时,则会使溢出目标的量更小。

将权重更改为相等。各个 fval 结果与其对应目标的距离相等。

再次运行脚本得到

x = 

    1.7613    2.2387

fval = 

    2.6365
    6.6365

约束可防止各个 fval 结果与对应目标等距。例如,对 x(2) 设置上界 2。

ub = [Inf,2];
lb = [];
Aeq = [];
beq = [];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)

再次运行脚本得到

x = 

    2.0000    2.0000

fval = 

    3.0000
    6.2500

在这种情况下,fval(1) 正好达到其目标,但 fval(2) 低于其目标。

标签:goal,weight,目标,Matlab,fun,x0,规划,fgoalattain
来源: https://www.cnblogs.com/plzplz/p/16486738.html