目录
- 单目标线性规划
- 多目标线性规划
- 理想解法
- 线性加权法
- 最大最小法
- 目标规划法
- 模糊数学解法
单目标线性规划
MATLAB中有一个专门求解线性规划问题的函数:linprog(),其使用方法如下:
[x,fval]=linprog(c,A,b,Aeq,beq,lb,ub,x0,options)
用于求解以下模型
其中fval表示最优解处的目标函数值,lb和ub分别表示决策变量的下界和上界,若不存在可以用空矩阵代替,x0表示迭代初始点,options是控制参数,用于指定模型求解算法、计算精度和最大迭代次数等例:
求解:
f = [3 -1 -1];
A = [1 -2 1;4 -1 -2];
b = [11,-3]';
Aeq = [-2 0 1];
beq = [1];
[x,y] = linprog(-f,A,b,Aeq,beq,zeros(3,1));
z = y
求解:
%这里是一个到线性规划的转换,要做一个变量的变换,把每一个绝对值x都替换成一个u和v的表示变量
%如: u = (x + |x|) / 2 v = (|x| - x) / 2
clc,clear
c = 1:4;
c = [c,c];
aeq = [1 -1 -1 1;1 -1 1 -3;1 -1 -2 3];
Aeq = [aeq,-aeq];
beq = [0 1 -1/2];
[x,y] = linprog(c,[],[],Aeq,beq,zeros(8,1))
x = x(1:4)-x(5:8)
如果只是线性规划,lingo更好用
多目标线性规划
多目标线性规划是多目标最优化理论的重要组成部分,由于多个目标之间的矛盾性和不可公度性,要求使所有目标均达到最优解是不可能的,因此多目标规划问题往往只是求其有效解(非劣解)。目前求解多目标线性规划问题有效解的方法,有理想点法、线性加权和法、最大最小法、目标规划法,模糊数学解法等。为了求得多目标规划问题的非劣解,常常需要将多目标规划问题转化为单目标规划问题去处理。实现这种转化,有如下几种建模方法。
- 效用最优化模型
- 罚款模型
- 约束模型
- 目标达到法
- 目标规划模型
- 效用最优化模型(线性加权法)
思想:规划问题的各个目标函数可以通过一定的方式进行求和运算。这种方法将一系列的目标函数与效用函数建立相关关系,各目标之间通过效用函数协调,使多目标规划问题转化为传统的单目标规划问题。 - 罚款模型(理想点法)
思想: 规划决策者对每一个目标函数都能提出所期望的值(或称满意值);通过比较实际值与期望值之间的偏差来选择问题的解。 - 约束模型(极大极小法)
理论依据:若规划问题的某一目标可以给出一个可供选择的范围,则该目标就可以作为约束条件而被排除出目标组,进入约束条件组中。假如,除第一个目标外,其余目标都可以提出一个可供选择的范围,则该多目标规划问题就可以转化为单目标规划问题。 - 目标达到法
首先将多目标规划模型化为标准形式,在求解之前,先设计与目标函数相应的一组目标值理想化的期望目标与每一个目标对应的权重系数,再设松弛因子,对多目标规划问题进行转化。 - 目标规划模型(目标规划法)
需要预先确定各个目标的期望值,同时给每一个目标赋予一个优先因子和权系数,假定有K个目标,L个优先级( L≤K),再通过建立目标规划模型进行求解。
多目标线性规划模型是有两个或两个以上的目标函数,且所有的目标函数和约束条件都是线性的,数学模型表示为:
常用的求解最优化问题的函数,有线性规划问题的linprog,非线性规划问题的fmincon,最大最小问题的fminimax,求解多目标的fgoalattain等。调用形式分别为:
理想解法
解:先对单目标进行求解
对第一个目标求解的matlab程序为:
f=[3;-2];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
[x,favl]=linprog(f,a,b,[],[],lb,ub);
输出结果为:x=0.0000 6.0000,favl=-12.0000,所以最大值为12.0000
对第二个目标求解的matlab程序为:
f=[-4;-3];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
[x,favl]=linprog(f,a,b,[],[],lb,ub);
输出结果为:x=3.0000 4.0000,favl=-24.0000,所以最大值为24.0000
于是得到理想点:(12,24)
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);
线性加权法
求解的matlab程序为:
f=[-0.5;-2.5];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
x=linprog(f,a,b,[],[],lb,ub);
输出结果为:x1=0.0000,x2=6.0000,对应的目标值为f1=12.0000,f2=18.0000
最大最小法
首先编写M函数文件:
function f=mutiplesubjiect(x)
f(1)=3*x(1)-2*x(2);
f(2)=-4*x(1)-3*x(2);
然后输入
x0=[0;0];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
[x,favl]=fminimax('mutiplesubjiect',x0,a,b,[],[],lb,[])
目标规划法
首先编写M函数文件,和上述M函数相同。然后输入:
goal=[12,24];
weight=[12,24];
x0=[0;0];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
[x,fval]=fgoalattain('mutiplesubjiect',goal,weight,x0,a,b,[],[],lb,[])
输出结果为:x1=0.0000,x2=6.0000,对应的目标值为f1=12.0000,f2=18.0000
模糊数学解法
求解的matlab程序为:
f=[0;0;-1];
a=[3 -2 27
-4 -3 24
2 3 0
2 1 0];
b=[15;0;18;10];
lb=[0;0;0];
ub=[];
[x,favl]=linprog(f,a,b,[],[],lb,ub);
f1=-3*x(1)+2*x(2);
f2=4*x(1)+3*x(2);
输出结果为:x1=1.0253,x2=5.3165,x3=0.8354,对应的目标值为f1=7.5570,f2=20.0506