主要内容

linprog

解决线性规划问题

描述

线性规划求解

找到指定的最小的问题

最小值 x f T x 这样 { 一个 x b , 一个 e x = b e , l b x u b

f,x,b,说真的,,乌兰巴托向量,一个Aeq矩阵。

请注意

linprog仅适用于solver-based方法。两种优化方法的讨论,请参阅首先选择具体问题具体分析或Solver-Based方法

例子

x= linprog (f,一个,b)解决了最小值f ' * x这样* xb

例子

x= linprog (f,一个,b,Aeq,说真的)包括等式约束Aeq * x =说真的。集一个= []b = []如果不存在不平等。

例子

x= linprog (f,一个,b,Aeq,说真的,,乌兰巴托)定义了一组上下界限的设计变量,x,这样的解决方案总是范围磅≤x≤乌兰巴托。集Aeq = []说真的= []如果没有平等的存在。

请注意

如果指定的输入范围不一致的问题,输出fval[]

例子

x= linprog (f,一个,b,Aeq,说真的,,乌兰巴托,选项)最小化的优化选项指定的选项。使用optimoptions设置这些选项。

例子

x= linprog (问题)发现的最低标准问题描述的结构问题

您可以导入一个问题结构从一个议员文件使用mpsread。您还可以创建一个问题结构的OptimizationProblem对象的使用prob2struct

例子

(x,fval)= linprog (___),对于任何输入参数,返回的值目标函数有趣的在解决方案x:fval = f ' * x

例子

(x,fval,exitflag,输出)= linprog (___)此外,返回一个值exitflag描述退出条件和结构输出包含的信息优化过程。

例子

(x,fval,exitflag,输出,λ)= linprog (___)此外返回一个结构λ字段包含拉格朗日乘数法的解决方案吗x

例子

全部折叠

解决一个简单的线性程序由线性不等式定义的。

对于这个示例,使用这些线性不等式约束:

x ( 1 ) + x ( 2 ) 2

x ( 1 ) + x ( 2 ) / 4 1

x ( 1 ) - - - - - - x ( 2 ) 2

- - - - - - x ( 1 ) / 4 - - - - - - x ( 2 ) 1

- - - - - - x ( 1 ) - - - - - - x ( 2 ) - - - - - - 1

- - - - - - x ( 1 ) + x ( 2 ) 2

A = [1 1 1 1/4 1 1 1/4 1 1 1 1 1];b = (2 1 2 1 1 2);

使用目标函数 - - - - - - x ( 1 ) - - - - - - x ( 2 ) / 3

f = [1] 1/3;

解决线性规划。

x = linprog (f, A, b)
找到最优解。
x =2×10.6667 - 1.3333

解决一个简单的线性程序定义为线性不等式和线性等式。

对于这个示例,使用这些线性不等式约束:

x ( 1 ) + x ( 2 ) 2

x ( 1 ) + x ( 2 ) / 4 1

x ( 1 ) - - - - - - x ( 2 ) 2

- - - - - - x ( 1 ) / 4 - - - - - - x ( 2 ) 1

- - - - - - x ( 1 ) - - - - - - x ( 2 ) - - - - - - 1

- - - - - - x ( 1 ) + x ( 2 ) 2

A = [1 1 1 1/4 1 1 1/4 1 1 1 1 1];b = (2 1 2 1 1 2);

使用线性等式约束 x ( 1 ) + x ( 2 ) / 4 = 1 / 2

Aeq = [1 1/4];说真的= 1/2;

使用目标函数 - - - - - - x ( 1 ) - - - - - - x ( 2 ) / 3

f = [1] 1/3;

解决线性规划。

x = linprog (f, A、b、Aeq beq)
找到最优解。
x =2×10 2

用线性不等式解决一个简单的线性规划、线性等式,。

对于这个示例,使用这些线性不等式约束:

x ( 1 ) + x ( 2 ) 2

x ( 1 ) + x ( 2 ) / 4 1

x ( 1 ) - - - - - - x ( 2 ) 2

- - - - - - x ( 1 ) / 4 - - - - - - x ( 2 ) 1

- - - - - - x ( 1 ) - - - - - - x ( 2 ) - - - - - - 1

- - - - - - x ( 1 ) + x ( 2 ) 2

A = [1 1 1 1/4 1 1 1/4 1 1 1 1 1];b = (2 1 2 1 1 2);

使用线性等式约束 x ( 1 ) + x ( 2 ) / 4 = 1 / 2

Aeq = [1 1/4];说真的= 1/2;

设置这些界限:

- - - - - - 1 x ( 1 ) 1 5

- - - - - - 0 5 x ( 2 ) 1 2 5

磅= (-0.5);乌兰巴托= [1.5,1.25];

使用目标函数 - - - - - - x ( 1 ) - - - - - - x ( 2 ) / 3

f = [1] 1/3;

解决线性规划。

x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托)
找到最优解。
x =2×10.1875 - 1.2500

解决线性规划使用“内点”算法。

对于这个示例,使用这些线性不等式约束:

x ( 1 ) + x ( 2 ) 2

x ( 1 ) + x ( 2 ) / 4 1

x ( 1 ) - - - - - - x ( 2 ) 2

- - - - - - x ( 1 ) / 4 - - - - - - x ( 2 ) 1

- - - - - - x ( 1 ) - - - - - - x ( 2 ) - - - - - - 1

- - - - - - x ( 1 ) + x ( 2 ) 2

A = [1 1 1 1/4 1 1 1/4 1 1 1 1 1];b = (2 1 2 1 1 2);

使用线性等式约束 x ( 1 ) + x ( 2 ) / 4 = 1 / 2

Aeq = [1 1/4];说真的= 1/2;

设置这些界限:

- - - - - - 1 x ( 1 ) 1 5

- - - - - - 0 5 x ( 2 ) 1 2 5

磅= (-0.5);乌兰巴托= [1.5,1.25];

使用目标函数 - - - - - - x ( 1 ) - - - - - - x ( 2 ) / 3

f = [1] 1/3;

设置选项来使用“内点”算法。

选择= optimoptions (“linprog”,“算法”,“内点”);

解决线性规划使用“内点”算法。

x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)
最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在选择价值函数的宽容,和约束中满意的选择价值约束宽容。
x =2×10.1875 - 1.2500

这个例子展示了如何设置一个问题通过具体问题具体分析的方法,然后使用solver-based方法解决它。现在的问题是

马克斯 x ( x + y / 3 ) 年代 u b j e c t t o { x + y 2 x + y / 4 1 x - - - - - - y 2 x / 4 + y - - - - - - 1 x + y 1 - - - - - - x + y 2 x + y / 4 = 1 / 2 - - - - - - 1 x 1 5 - - - - - - 1 / 2 y 1 2 5

创建一个OptimizationProblem对象命名概率代表这个问题。

x = optimvar (“x”,下界的,1“UpperBound”,1.5);y = optimvar (“y”,下界的1/2,“UpperBound”,1.25);概率= optimproblem (“目标”,x + y / 3,“ObjectiveSense”,“马克斯”);prob.Constraints。c1 = x + y < = 2;prob.Constraints。c2=x+y/4<= 1; prob.Constraints.c3 = x - y <= 2; prob.Constraints.c4 = x/4 + y >= -1; prob.Constraints.c5 = x + y >= 1; prob.Constraints.c6 = -x + y <= 2; prob.Constraints.c7 = x + y/4 == 1/2;

转换对象问题结构的问题。

问题= prob2struct(概率);

解决由此产生的问题结构。

[溶胶,fval exitflag、输出]= linprog(问题)
找到最优解。
索尔=2×10.1875 - 1.2500
fval = -0.6042
exitflag = 1
输出=结构体字段:迭代:1 constrviolation: 0消息:“找到最优解。”算法:“对偶单纯形”firstorderopt: 0

返回的fval是负的,即使是积极的解决方案组件。在内部,prob2struct最大化问题转化为目标函数的最小化问题的负面。看到最大化客观

它的组成部分索尔对应的优化变量?检查变量的属性概率

prob.Variables
ans =结构体字段:x: [1 x1 optim.problemdef。OptimizationVariable] y: [1 x1 optim.problemdef.OptimizationVariable]

如您所料,索尔(1)对应于x,索尔(2)对应于y。看到算法

计算一个简单的解决方案和目标函数值线性规划。

不等式约束的

x ( 1 ) + x ( 2 ) 2

x ( 1 ) + x ( 2 ) / 4 1

x ( 1 ) - - - - - - x ( 2 ) 2

- - - - - - x ( 1 ) / 4 - - - - - - x ( 2 ) 1

- - - - - - x ( 1 ) - - - - - - x ( 2 ) - - - - - - 1

- - - - - - x ( 1 ) + x ( 2 ) 2

A = [1 1 1 1/4 1 1 1/4 1 1 1 1 1];b = (2 1 2 1 1 2);

目标函数是 - - - - - - x ( 1 ) - - - - - - x ( 2 ) / 3

f = [1] 1/3;

解决问题并返回目标函数值。

[x, fval] = linprog (f, A, b)
找到最优解。
x =2×10.6667 - 1.3333
fval = -1.1111

获得出口标志和输出结构更好地理解解决方案过程和质量。

对于这个示例,使用这些线性不等式约束:

x ( 1 ) + x ( 2 ) 2

x ( 1 ) + x ( 2 ) / 4 1

x ( 1 ) - - - - - - x ( 2 ) 2

- - - - - - x ( 1 ) / 4 - - - - - - x ( 2 ) 1

- - - - - - x ( 1 ) - - - - - - x ( 2 ) - - - - - - 1

- - - - - - x ( 1 ) + x ( 2 ) 2

A = [1 1 1 1/4 1 1 1/4 1 1 1 1 1];b = (2 1 2 1 1 2);

使用线性等式约束 x ( 1 ) + x ( 2 ) / 4 = 1 / 2

Aeq = [1 1/4];说真的= 1/2;

设置这些界限:

- - - - - - 1 x ( 1 ) 1 5

- - - - - - 0 5 x ( 2 ) 1 2 5

磅= (-0.5);乌兰巴托= [1.5,1.25];

使用目标函数 - - - - - - x ( 1 ) - - - - - - x ( 2 ) / 3

f = [1] 1/3;

设置选项来使用对偶单纯形的算法。

选择= optimoptions (“linprog”,“算法”,对偶单纯形的);

解决线性规划和请求的函数值,退出国旗,和输出结构。

[x, fval exitflag、输出]= linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)
找到最优解。
x =2×10.1875 - 1.2500
fval = -0.6042
exitflag = 1
输出=结构体字段:迭代:1 constrviolation: 0消息:“找到最优解。”算法:“对偶单纯形”firstorderopt: 0
  • fval目标函数值大于返回目标函数值,因为有更多的限制。

  • exitflag= 1表明,解决方案是可靠的。

  • output.iterations= 0表示linprog在presolve找到解决方案,不需要进行迭代。

解决一个简单的线性程序并检查解决方案和拉格朗日乘数法。

使用目标函数

f ( x ) = - - - - - - 5 x 1 - - - - - - 4 x 2 - - - - - - 6 x 3

f = [5;4;6);

使用线性不等式约束

x 1 - - - - - - x 2 + x 3 2 0

3 x 1 + 2 x 2 + 4 x 3 4 2

3 x 1 + 2 x 2 3 0

一个= [1 1 1 2 3 4 3 2 0];b = (20; 42; 30);

限制所有的变量是积极的:

x 1 0

x 2 0

x 3 0

磅= 0 (3,1);

Aeq说真的[],这表明没有线性等式约束。

Aeq = [];说真的= [];

调用linprog拉格朗日乘数法,获得。

[x, fval exitflag、输出λ)= linprog (f, A、b Aeq,说真的,磅);
找到最优解。

检查解决方案和拉格朗日乘数法。

x lambda.ineqlin lambda.lower
x =3×10 15.0000 3.0000
ans =3×10 1.5000 0.5000
ans =3×11.0000 0 0

lambda.ineqlin非零的第二个和第三个组件吗x。这表明,第二个和第三个线性不等式约束等式感到满意:

3 x 1 + 2 x 2 + 4 x 3 = 4 2

3 x 1 + 2 x 2 = 3 0

检查,这是正确的:

* x
ans =3×1-12.0000 42.0000 30.0000

lambda.lower是第一个非零组件的x。这表明x (1)0的下界。

输入参数

全部折叠

系数向量,向量指定为一个真正的或真正的数组。代表了目标函数的系数向量f ' * x。假定的符号f是一个列向量,但是您可以使用一个行向量或数组。在内部,linprog转换f的列向量f (:)

例子:f = (1、3、5、6)

数据类型:

线性不等式约束,指定为一个真正的矩阵。一个是一个——- - - - - -N矩阵,不平等的数量,N是变量的数量(长度f)。对于大型问题,通过一个作为一个稀疏矩阵。

一个编码线性不等式

A * x < =,

在哪里x的列向量N变量x (:),b是一个列向量元素。

例如,考虑这些不平等:

x1+ 2x2≤10
3x1+ 4x2≤20
5x1+ 6x2≤30。

输入以下命令来指定不等式约束条件。

= [1,2,3,4,5,6);b = (10、20、30);

例子:指定的x分量加起来1或更少,一个= 1 (1,N)b = 1

数据类型:

线性等式约束,指定为一个真正的矩阵。Aeq是一个——- - - - - -N矩阵,是平等的,N是变量的数量(长度f)。对于大型问题,通过Aeq作为一个稀疏矩阵。

Aeq编码线性等式

Aeq * x =说真的,

在哪里x的列向量N变量x (:),说真的是一个列向量元素。

例如,考虑这些等式:

x1+ 2x2+ 3x3= 10
2x1+ 4x2+x3= 20。

输入以下命令来指定等式约束。

Aeq = [1、2、3、2、4、1];说真的= (10、20);

例子:指定x分量之和为1,Aeq = 1 (1, N)说真的= 1

数据类型:

线性不等式约束,指定为一个真正的向量。b是一个元向量相关一个矩阵。如果你通过b作为一个行向量,解决内部转换b的列向量b (:)。对于大型问题,通过b作为一个稀疏的向量。

b编码线性不等式

A * x < =,

在哪里x的列向量N变量x (:),一个是一个矩阵的大小——- - - - - -N

例如,考虑这些不平等:

x1+ 2x2≤10
3x1+ 4x2≤20
5x1+ 6x2≤30。

输入以下命令来指定不等式约束条件。

= [1,2,3,4,5,6);b = (10、20、30);

例子:指定的x分量总和为1或更少,使用一个= 1 (1,N)b = 1

数据类型:

线性等式约束,指定为一个真正的向量。说真的是一个元向量相关Aeq矩阵。如果你通过说真的作为一个行向量,解决内部转换说真的的列向量说真的(:)。对于大型问题,通过说真的作为一个稀疏的向量。

说真的编码线性等式

Aeq * x =说真的,

在哪里x的列向量N变量x (:),Aeq是一个矩阵的大小——- - - - - -N

例如,考虑这些等式:

x1+ 2x2+ 3x3= 10
2x1+ 4x2+x3= 20。

输入以下命令来指定等式约束。

Aeq = [1、2、3、2、4、1];说真的= (10、20);

例子:指定的x分量之和为1,使用Aeq = 1 (1, N)说真的= 1

数据类型:

下界,指定为一个真正的向量或真正的数组。如果的长度f等于的长度,然后指定

x(我)> =磅(我)对所有

如果元素个数(磅)<元素个数(f),然后指定

x(我)> =磅(我)1我< < = =元素个数(磅)

在这种情况下,解决者发出警告。

例子:指定,所有的x分量都是积极的,使用磅= 0(大小(f))

数据类型:

上界,指定为一个真正的向量或真正的数组。如果的长度f等于的长度乌兰巴托,然后乌兰巴托指定

x (i) < =乌兰巴托(我)对所有

如果元素个数(乌兰巴托)<元素个数(f),然后乌兰巴托指定

x (i) < =乌兰巴托(我)1我< < = =元素个数(乌兰巴托)

在这种情况下,解决者发出警告。

例子:指定所有的x分量都不到1,使用乌兰巴托= 1(大小(f))

数据类型:

优化选项,指定的输出optimoptions或一个结构optimset的回报。

一些选项适用于所有算法,以及其他相关的特定算法。看到优化选择参考的详细信息。

有些选项是缺席的optimoptions显示。这些选项出现在以下表中斜体。有关详细信息,请参见视图选项

所有的算法
算法

选择优化算法:

  • 对偶单纯形的(默认)

  • “interior-point-legacy”

  • “内点”

选择算法的信息,请参阅线性规划算法

诊断

显示诊断信息函数最小化或解决。选择“关闭”(默认)或“上”

显示

显示(见水平迭代显示):

  • “最后一次”(默认)显示最终的输出。

  • “关闭”“没有”显示没有输出。

  • “通路”在每一次迭代时显示输出。

MaxIterations

最大允许的迭代次数,一个正整数。默认的是:

  • 85年“interior-point-legacy”算法

  • 200年“内点”算法

  • 10 * (numberOfEqualities + numberOfInequalities + numberOfVariables)对偶单纯形的算法

看到公差和停止条件迭代和函数计算

optimset,名字是麦克斯特。看到当前和遗留选项名称

OptimalityTolerance

终止宽容对偶可行性,积极的标量。默认的是:

  • 1 e-8“interior-point-legacy”算法

  • 1 e -对偶单纯形的算法

  • 1 e-6“内点”算法

optimset,名字是TolFun。看到当前和遗留选项名称

内点算法
ConstraintTolerance

可行性公差约束,一个负的标量。ConstraintTolerance措施的可行性宽容。默认值是1 e-6

optimset,名字是TolCon。看到当前和遗留选项名称

进行预处理

LP预处理算法迭代前的水平。指定“基本”(默认)或“没有”

对偶单纯形算法
ConstraintTolerance

对可行性约束,一个标量1 e-9通过1 e - 3ConstraintTolerance措施的可行性宽容。默认值是1的军医

optimset,名字是TolCon。看到当前和遗留选项名称

MaxTime

最大算法运行时间以秒为单位。默认值是

进行预处理

LP水平预处理前对偶单纯形算法迭代。指定“基本”(默认)或“没有”

例子:选择= optimoptions (“linprog”、“算法”,“内点”,“显示”,“iter”)

问题的结构,与以下字段指定为一个结构。

字段名 条目

f

线性目标函数向量f

Aineq

矩阵线性不等式约束

bineq

向量的线性不等式约束

Aeq

矩阵线性等式约束

说真的

向量的线性等式约束
向量的下界
乌兰巴托 向量的上界

解算器

“linprog”

选项

选择创建optimoptions

你必须提供至少解算器字段问题结构。

数据类型:结构体

输出参数

全部折叠

解决方案,作为真正的向量或返回数组。的大小x是一样的尺寸吗f

目标函数值的解决方案,作为一个实数返回。一般来说,fval=f ' * x

原因linprog停止,返回一个整数。

3

对相对的解决方案是可行的ConstraintTolerance宽容,但对绝对宽容并不可行。

1

功能融合解决方案x

0

迭代次数超过options.MaxIterations或解决方案时间超过在秒options.MaxTime

2

没有找到可行点。

3

问题是无限的。

4

价值是在执行过程中遇到的算法。

5

原始与对偶问题是不可行的。

7

搜索方向变得太小了。不可能取得进一步进展。

9

解决了可行性。

Exitflags39与有很大的不可行性的金宝搏官方网站解决方案。这些通常来自线性约束矩阵条件数大,或问题解决方案组件。纠正这些问题,尝试规模系数矩阵,消除冗余的线性约束,或给予更严格的边界变量。

优化过程的信息,作为一个结构返回这些字段。

迭代

的迭代次数

算法

优化算法

cgiterations

0(包括内点算法,向后兼容性)

消息

退出消息

constrviolation

最大的约束功能

firstorderopt

一阶最优性测量

拉格朗日乘数法在解决方案,作为结构返回这些字段。

较低的

下界对应

上界对应乌兰巴托

ineqlin

线性不等式对应一个b

eqlin

线性等式对应Aeq说真的

满足线性约束方程的拉格朗日乘数法长度(f)组件:

f + 一个 T λ ineqlin + Aeq T λ eqlin + λ λ 较低的 = 0 ,

基于拉格朗日

f T x + λ ineqlin T ( 一个 x b ) + λ eqlin T ( Aeq x 说真的 ) + λ T ( x 乌兰巴托 ) + λ 较低的 T ( x )

这个符号惯例匹配非线性动力学(见约束最优性理论)。然而,这个标志是截然相反的信号在线性规划文学,所以linprog拉格朗日乘子的负相关的“影子价格”。

算法

全部折叠

对偶单纯形算法

的描述,请参阅对偶单纯形算法

Interior-Point-Legacy算法

“interior-point-legacy”方法是基于LIPSOL(线性内点解算器,[3]),这是一个变体Mehrotra预估的算法[2],一个内点方法。大量的预处理步骤发生在算法迭代开始之前。看到Interior-Point-Legacy线性规划

第一阶段的算法可能涉及的一些预处理约束(见Interior-Point-Legacy线性规划)。几个条件可能会导致linprog退出的消息不可能实行。在每种情况下,linprog返回一个负exitflag,表示表示失败。

  • 如果一行的检测到零Aeq,但相应的元素说真的不为零,那么退出消息

    退出不可行性:约束矩阵的零行没有零在相应的眼睛水平的条目。
  • 如果一个元素x发现下面不是有界,然后退出消息

    退出不可行性:客观f ' * x是无界的。
  • 如果一个行Aeq只有一个非零元素,那么相关的价值呢x被称为单例变量。在这种情况下,价值的组成部分x可以计算Aeq说真的。如果该值计算违反另一个约束,那么退出消息

    退出不可行性:单变量等式约束是不可行的。
  • 如果单变量可以解决,但是解决方案违背了上界或下界,然后退出消息

    退出不可行性:单变量的等式约束并不在允许范围内。

请注意

累积的预处理步骤。例如,即使你的约束矩阵没有行0开始,等预处理步骤可能导致连续发生。

预处理结束时,迭代算法的一部分开始直到满足停止条件。(关于残差的更多信息,原始问题,对偶问题,和相关的停止标准,明白了Interior-Point-Legacy线性规划)。如果剩余工资的增长,而不是越来越小,或残差既不增加也不减少,其中一个终止消息显示后,分别

一个或更多的剩余工资,二元性缺口,或全部相对误差增长100000倍它的最小值:

一个或更多的剩余工资,二元性差距,或总相对误差已经停滞:

这些消息的显示,紧随其后的是下面的消息表明双之一,原始的,或者两者都似乎不可行。

  • 双重似乎不可行(原始的)。(原始残余< OptimalityTolerance。)

  • 原始的似乎不可行(双无限)。(双重残余< OptimalityTolerance。)

  • 双重似乎不可行(原始的)自对偶残余> sqrt (OptimalityTolerance)。(原始残余< 10 * OptimalityTolerance。)

  • 原始似乎不可行(双无界)自原始残余> sqrt (OptimalityTolerance)。(双重残余< 10 * OptimalityTolerance。)

  • 双似乎不可行和原始的无限自原始目标< 1 e + 10和双重目标< 1 e + 6。

  • 原始似乎不可行和双无限自双重目标> 1 e + 10和原始目标> 1 e + 6。

  • 原始和双重似乎不可行。

例如,原始(客观)可以无限和原始的残余,这是一个原始的约束满足,可以小。

内点算法

“内点”算法类似于“interior-point-legacy”,但有一个更有效的分解的习惯,和不同的预处理。看到内点linprog算法

选择功能

应用程序

优化住编辑任务提供了一个可视化界面linprog

引用

[1]Dantzig G.B.,一个。Orden, and P. Wolfe. “Generalized Simplex Method for Minimizing a Linear Form Under Linear Inequality Restraints.”太平洋数学》杂志上。5卷,1955年,页183 - 195。

[2]Mehrotra,美国“在一个非内点方法的实现。”暹罗杂志上优化2卷,1992年,页575 - 601。

[3],Y。,“Solving Large-Scale Linear Programs by Interior-Point Methods Under the MATLAB Environment.”技术报告TR96-01、数学和统计,马里兰大学巴尔的摩县,巴尔的摩,医学博士,1995年7月。

版本历史

之前介绍过的R2006a