ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-17 13:35:21  阅读:233  来源: 互联网

标签:goal weight 目标 Matlab fun x0 规划 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 是正向量:

  • 如果求解器找到同时达到所有目标的点 x,则达到因子 γ 为负,目标过达到。
  • 如果求解器找不到同时达到所有目标的点 x,则达到因子 γ 为正,目标欠达到。

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有