数学建模学习(76):多目标线性规划模型(理想法、线性加权法、最大最小法),模型敏感性分析

一、多目标线性规划模型

1.1 定义

多目标线性规划模型是有两个或两个以上的目标函数,且所有的目标函数和约束条件都是线性的。其数学模型表示为:
在这里插入图片描述

在这里插入图片描述
摘自百度百科:

https://baike.baidu.com/item/%E5%A4%9A%E7%9B%AE%E6%A0%87%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92/19134131

1.2 相关函数使用方法

常用的求解最优化问题的函数,有线性规划问题的linprog,非线性规划问题的fmincon,最大最小问题的fminimax,求解多目标的fgoalattain等

线性规划问题函数:
在这里插入图片描述
寻找约束非线性多变量函数的最小值:
在这里插入图片描述
求解涉及多目标的目标达到问题fgoalattain:
在这里插入图片描述

1.3 求解方法

多目标线性规划是多目标最优化理论的重要组成部分,由于多个目标之间的矛盾性和不可公度性,要求使所有目标均达到最优解是不可能的,因此多目标规划问题往往只是求其有效解(非劣解)。目前求解多目标线性规划问题有效解的方法,有理想点法、线性加权和法、最大最小法、目标规划法,模糊数学解法等。为了求得多目标规划问题的非劣解,常常需要将多目标规划问题转化为单目标规划问题去处理。实现这种转化,有如下几种建模方法:

  1. 效用最优化模型(线性加权法):线性加权和法(linear weighted sum method)是一种评价函数方法,是按各目标的重要性赋予它相应的权系数,然后对其线性组合进行寻优的求解多目标规划问题的方法。

  2. 罚款模型(理想点法):规划决策者对每一个目标函数都能提出所期望的值(或称满意值);通过比较实际值与期望值之间的偏差来选择问题的解。
    在这里插入图片描述

  3. 约束模型(极大极小法):若规划问题的某一目标可以给出一个可供选择的范围,则该目标就可以作为约束条件而被排除出目标组,进入约束条件组中。假如,除第一个目标外,其余目标都可以提出一个可供选择的范围,则该多目标规划问题就可以转化为单目标规划问题。
    在这里插入图片描述

  4. 目标达到法:先将多目标规划模型化为标准形式,在求解之前,先设计与目标函数相应的一组目标值理想化的期望目标与每一个目标对应的权重系数,再设松弛因子,对多目标规划问题进行转化。

  5. 目标规划模型(目标规划法):需要预先确定各个目标的期望值,同时给每一个目标赋予一个优先因子和权系数,假定有K个目标,L个优先级( L≤K),再通过建立目标规划模型进行求解。

    扫描二维码关注公众号,回复: 14428356 查看本文章

摘自百度百科:

https://baike.baidu.com/item/%E5%A4%9A%E7%9B%AE%E6%A0%87%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92/19134131

二、理想点法

2.1 问题

多目标规划问题如下:
在这里插入图片描述

2.2 求解

2.2.1 第一步

第一步:分别求解目标函数的最值
1)第一个目标函数

clc 
clear all
f=[3;-2]; %linprog函数求的是最小值,取反
a=[2  3;2 1];%约束左侧系数
b=[18;10]; %约束右侧系数
lb=[0;0]; %瞎想
ub=[]; %上限
[x,favl]=linprog(f,a,b,[],[],lb,ub);
x
-favl %f取反后就是球的最小值,相反就是最大值

结果如下:
在这里插入图片描述
2)同理,第二个目标函数

clc
clear all
f=[-4;-3];
a=[2  3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
[x,favl]=linprog(f,a,b,[],[],lb,ub);
x
-favl

如下:
在这里插入图片描述
我们可以看到两个目标函数最大值分别为12和24。因此理想点:(12,24)

2.2.2 第二步

根据以上求解的结果,就变成求解:
在这里插入图片描述
代码如下:

clc
clear all
x0=[1;1];%初始点,指定为实数向量或实数数组
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
%多目标函数就是带入两个目标函数开平方
x=fmincon('((-3*x(1)+2*x(2)-12)^2+(4*x(1)+3*x(2)-24)^2)^(1/2)',x0,a,b,[],[],lb,ub);
f1=-3*x(1)+2*x(2)
f2=4*x(1)+3*x(2)

如下:
在这里插入图片描述
以上就是f1和f2的最佳值了。

三、线性加权法

我们假设每个目标函数的权重为0.5,带入后得到x1系数为0.5,x2系数为2.5,由于需要取最大值,所以取反为-0.5,-2.5
加粗样式
代码如下:

clc
clear all
%这个系数要不断尝试,因为没有实际场景。实际场景能直接看出权重。
f=[-0.5;-2.5]; %目标函数的系数
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
x=linprog(f,a,b,[],[],lb,ub)
%x为06,带入目标函数:f1=12,f2=18

如下:
在这里插入图片描述

四、最大最小法

4.1 第一步

第一步,编写目标函数mubiao.m:

function f=mubiaot(x)
f(1)=3*x(1)-2*x(2);
f(2)=-4*x(1)-3*x(2);

4.2 第二步

第二步:计算

clc 
clear all
x0=[0;0]; %起点设置特殊点0 0
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
[x,favl]=fminimax(@mubiaot,x0,a,b,[],[],lb,[]);
x
-favl %最小值取反就是最大值

如下:
在这里插入图片描述
输出结果为:x1=0,x2=6,对应的目标值为f1=12,f2=18

五、线性加权与敏感性分析

5.1 参考

先以这位博主的案例作为分析,原文

https://blog.csdn.net/weixin_54338498/article/details/125996359

题目如下:
在这里插入图片描述
利用我们前面学到的线性加权法,很容易写出代码如下:

clc
clear all
%线性加权法
w1 = 0.4;  w2 = 0.6;  % 两个目标函数的权重  x1 = 5  x2 = 2
c = [w1/30*2+w2/2*0.4 ;w1/30*5+w2/2*0.3]  % 线性规划目标函数的系数,就是合并题目中的x1和x2
A = [-1 -1];  b = -7; % 不等式约束
lb = [0 0]'; ub = [5 6]'; % 上下界
[x,fval] = linprog(c,A,b,[],[],lb,ub)
f1 = 2*x(1)+5*x(2)
f2 = 0.4*x(1) + 0.3*x(2)

如下:
在这里插入图片描述
敏感性分析就是一点点修改参数查看变化:

clear;clc
W1 = 0.1:0.001:0.5;  W2 = 1- W1;  
n =length(W1);
F1 = zeros(n,1);  F2 = zeros(n,1);   X1 = zeros(n,1);  X2 = zeros(n,1);   FVAL = zeros(n,1);
A = [-1 -1];  b = -7; % 不等式约束
lb = [0 0]; ub = [5 6]; % 上下界
for i = 1:n
    w1 = W1(i);  w2 = W2(i);
    c = [w1/30*2+w2/2*0.4 ;w1/30*5+w2/2*0.3];  % 线性规划目标函数的系数
    [x,fval] = linprog(c,A,b,[],[],lb,ub);
    F1(i) = 2*x(1)+5*x(2);
    F2(i) = 0.4*x(1) + 0.3*x(2);
    X1(i) = x(1);
    X2(i) = x(2);
    FVAL(i) = fval;
end

% 「Matlab」“LaTex字符汇总”讲解:https://blog.csdn.net/Robot_Starscream/article/details/89386748
% 在图上可以加上数据游标,按住Alt加鼠标左键可以设置多个数据游标出来。
figure(1) 
plot(W1,F1,W1,F2)
xlabel('f_{1}的权重') 
ylabel('f_{1}和f_{2}的取值')
legend('f_{1}','f_{2}')

figure(2)
plot(W1,X1,W1,X2)
xlabel('f_{1}的权重') 
ylabel('x_{1}和x_{2}的取值')
legend('x_{1}','x_{2}')

figure(3)
plot(W1,FVAL)  % 看起来是两个直线组合起来的下半部分
xlabel('f_{1}的权重') 
ylabel('综合指标的值')

如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2 解题

在这里插入图片描述

应用到本篇文章中题目,我们只需要修改一些参数即可,不必大量修改,因此当作模板用了。
可修改的参数:W1、A、b、lb、ub、c (这个参数需要根据题意修改,请对比上面参考的题目),具体地方我已在代码中做了注释:


clear;clc
%权重和为1
W1 = 0.1:0.001:0.5;  W2 = 1- W1;  
n =length(W1);
F1 = zeros(n,1);  F2 = zeros(n,1);   X1 = zeros(n,1);  X2 = zeros(n,1);   FVAL = zeros(n,1);
%修改为符合本题目的约束
A = [2 3;2 1];  b = [18;10]; % 不等式约束
lb=[0;0];
ub=[]; % 上下界
for i = 1:n
    w1 = W1(i);  w2 = W2(i);
    %根据具体情况修改
    % 这里应该是:w1*f1+w2*f2=(-3w1+4w2)x1+(2w1+3w2)x2,最大值系数取反
    c = [-(-3*w1+4*w2) ;-(2*w1+3*w2)];  % 线性规划目标函数的系数
    [x,fval] = linprog(c,A,b,[],[],lb,ub);
    %修改目标函数
    F1(i) = -3*x(1)+2*x(2);
    F2(i) = 4*x(1) + 3*x(2);
    X1(i) = x(1);
    X2(i) = x(2);
    FVAL(i) = fval;
end

figure(1) 
plot(W1,F1,W1,F2)
xlabel('f_{1}的权重') 
ylabel('f_{1}和f_{2}的取值')
legend('f_{1}','f_{2}')

figure(2)
plot(W1,X1,W1,X2)
xlabel('f_{1}的权重') 
ylabel('x_{1}和x_{2}的取值')
legend('x_{1}','x_{2}')

figure(3)
plot(W1,FVAL)  % 看起来是两个直线组合起来的下半部分
xlabel('f_{1}的权重') 
ylabel('综合指标的值')

如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六、总结

以上介绍了三种方法的使用,综合这三种方法:理想点法和最大最小法效果应该一样;线性加权法需要设定权重,这个应该要根据应用场景来对目标函数进行权重设置,注意权重和为1。

如有不理解,可以v咨询:

sprintf('我的v:hxgsrubxjogxeeag')

如下:
在这里插入图片描述
这篇教程我用了很久时间来编写,同时也参考了一些文献,引用网址在具体地方已注明。希望这篇教程能够帮助你轻松学会多目标规划的求解。

猜你喜欢

转载自blog.csdn.net/weixin_46211269/article/details/126112626