主要内容

linprog

解决线性规划问题

描述

线性规划求解器

查找指定的问题的最小值

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

fxb说真的,乌兰巴托是向量,并且一个而且Aeq矩阵。

请注意

linprog仅适用于基于求解器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或基于解决方案的方法

例子

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

例子

x= linprog (f一个bAeq说真的包括等式约束Aeq*x = beq.集A = []而且B = []如果不存在不平等。

例子

x= linprog (f一个bAeq说真的乌兰巴托定义一组设计变量的下界和上界,x,使解总是在值域内Lb≤x≤ub.集Aeq = []而且Beq = []如果等式不存在。

请注意

如果问题的指定输入边界不一致,则输出fval[]

例子

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

例子

x= linprog (问题求最小值问题中描述的结构问题

您可以导入问题结构从MPS文件使用mpsread.您还可以创建一个问题结构,从OptimizationProblem对象,使用prob2struct

例子

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

例子

xfvalexitflag输出= linprog(___另外返回一个值exitflag它描述了退出条件和结构输出其中包含关于优化过程的信息。

例子

xfvalexitflag输出λ= 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/4 -1 -1 -1 -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/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];

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

Aeq = [1 1/4];Beq = 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/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];

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

Aeq = [1 1/4];Beq = 1/2;

设置这些界限:

- 1 x 1 1 5

- 0 5 x 2 1 2 5

Lb = [-1,-0.5];Ub = [1.5,1.25];

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

F = [-1 -1/3];

求解线性规划。

x = linprog(f,A,b,Aeq,beq,lb,ub)
找到最优解。
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/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];

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

Aeq = [1 1/4];Beq = 1/2;

设置这些界限:

- 1 x 1 1 5

- 0 5 x 2 1 2 5

Lb = [-1,-0.5];Ub = [1.5,1.25];

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

F = [-1 -1/3];

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

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

求解线性规划“内点”算法。

x = linprog(f,A,b,Aeq,beq,lb,ub,options)
最小值满足约束条件。优化完成是因为目标函数在可行方向上不递减,在函数公差选定值范围内,约束条件满足在约束公差选定值范围内。
x =2×10.1875 - 1.2500

此示例演示如何使用基于问题的方法设置问题,然后使用基于求解器的方法解决问题。问题是

马克斯 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);问题=优化问题(“目标”,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;

将问题对象转换为问题结构。

Problem = prob2struct(probb);

解决产生的问题结构。

[sol,fval,exitflag,output] = linprog(problem)
找到最优解。
索尔=2×10.1875 - 1.2500
Fval = -0.6042
Exitflag = 1
输出=带字段的结构:消息:'找到最佳解决方案。'算法:'dual-simplex' firstorderopt: 0

返回的fval是负的,即使溶液组分是正的。在内部,prob2struct将最大化问题转化为目标函数负的最小化问题。看到最大化目标

哪个成分索尔对应于哪个优化变量?检查变量的属性概率

概率。变量
ans =带字段的结构:X: [1x1 optimt .problemdef.]OptimizationVariable] y: [1x1 optimize .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/4 -1 -1 -1 -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/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];

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

Aeq = [1 1/4];Beq = 1/2;

设置这些界限:

- 1 x 1 1 5

- 0 5 x 2 1 2 5

Lb = [-1,-0.5];Ub = [1.5,1.25];

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

F = [-1 -1/3];

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

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

求解线性规划,请求函数值、退出标志和输出结构。

[x,fval,exitflag,output] = linprog(f,A,b,Aeq,beq,lb,ub,options)
找到最优解。
x =2×10.1875 - 1.2500
Fval = -0.6042
Exitflag = 1
输出=带字段的结构:消息:'找到最佳解决方案。'算法:'dual-simplex' firstorderopt: 0
  • fval,目标函数值大于返回目标函数值,因为有更多的约束。

  • exitflag= 1表示解决方案可靠。

  • output.iterations= 0表示linprog在预解过程中找到了解决方案,根本不需要迭代。

求解一个简单的线性规划,并检验解和拉格朗日乘子。

使用目标函数

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

A = [1 -1 1 3 2 4 3 2 0];B = [20;42;30];

约束所有变量为正:

x 1 0

x 2 0

x 3. 0

Lb = 0 (3,1);

Aeq而且说真的[],表示不存在线性等式约束。

Aeq = [];Beq = [];

调用linprog,得到拉格朗日乘子。

[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb);
找到最优解。

检查解和拉格朗日乘子。

x lambda.ineqlin lambda.lower
x =3×10 15.0000 3.0000
ans =3×10 1.5000 0.5000
ans =3×11.0000 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 <= b

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

例如,考虑以下不等式:

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

通过输入以下约束来指定不等式。

A = [1,2;3,4;5,6];B = [10;20;30];

例子:要指定x分量之和小于等于1,取A = ones(1,N)而且B = 1

数据类型:

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

Aeq编码线性等式

Aeq*x = beq

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

例如,考虑以下等式:

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

通过输入以下约束来指定等式。

Aeq = [1,2,3;2,4,1];Beq = [10;20];

例子:要指定x分量的和为1,取Aeq = ones(1,N)而且Beq = 1

数据类型:

线性不等式约束,指定为实向量。b是一个元素的相关向量一个矩阵。如果你通过了b作为行向量,解算器内部转换b对列向量b (:).对于大问题,可以通过b作为一个稀疏向量。

b编码线性不等式

A*x <= b

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

例如,考虑以下不等式:

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

通过输入以下约束来指定不等式。

A = [1,2;3,4;5,6];B = [10;20;30];

例子:要指定x分量的和为1或更小,请使用A = ones(1,N)而且B = 1

数据类型:

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

说真的编码线性等式

Aeq*x = beq

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

例如,考虑以下等式:

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

通过输入以下约束来指定等式。

Aeq = [1,2,3;2,4,1];Beq = [10;20];

例子:要指定x分量的和为1,使用Aeq = ones(1,N)而且Beq = 1

数据类型:

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

X (i) >= lb(i)对所有

如果数值(lb) <数值(f),然后指定

X (i) >= lb(i)1 <= I <= number (lb)

在这种情况下,求解器发出警告。

例子:要指定所有x分量都是正的,使用Lb = 0 (size(f))

数据类型:

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

X (i) <= ub(i)对所有

如果Numel (ub) < Numel (f),然后乌兰巴托指定

X (i) <= ub(i)1 <= I <= numel(ub)

在这种情况下,求解器发出警告。

例子:指定所有x分量都小于1,使用Ub = ones(size(f))

数据类型:

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

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

中缺少一些选项optimoptions显示。这些选项在下表中以斜体字显示。详细信息请参见视图选项

所有的算法
算法

选择优化算法:

  • 对偶单纯形的(默认)

  • “interior-point-legacy”

  • “内点”

有关选择算法的信息,请参见线性规划算法

诊断

显示有关要最小化或解决的功能的诊断信息。选择“关闭”(默认)或“上”

显示

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

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

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

  • “通路”显示每次迭代的输出。

MaxIterations

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

  • 85“interior-point-legacy”算法

  • 200“内点”算法

  • 10*(numberofetraits + 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预处理水平。指定“基本”(默认)或“没有”

例子:options = optimoptions('linprog','Algorithm',' internal -point','Display','iter')

问题结构,指定为具有以下字段的结构。

字段名 条目

f

线性目标函数向量f

Aineq

线性不等式约束的矩阵

bineq

线性不等式约束的向量

Aeq

矩阵的线性等式约束

说真的

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

解算器

“linprog”

选项

创建的选项optimoptions

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

数据类型:结构体

输出参数

全部折叠

解,作为实向量或实数组返回。的大小x和的尺寸一样吗f

目标函数在解处的值,作为实数返回。一般来说,fvalf ' * x

原因linprog停止,以整数形式返回。

3.

解是相对可行的ConstraintTolerance公差,但就绝对公差而言是不可行的。

1

函数收敛到一个解x

0

超过迭代次数选项。麦克斯特ations或者超过了解决时间(以秒为单位)选项。MaxTime

-2

没有找到可行点。

3

问题是无界的。

4

在执行算法时遇到的错误。

5

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

7

搜索方向变得太小。没有进一步的进展。

9

求解器失去了可行性。

Exitflags3.而且9涉及到有很大的不可行金宝搏官方网站性的解决方案。这些问题通常产生于具有大条件数的线性约束矩阵,或具有大解分量的问题。要纠正这些问题,请尝试缩放系数矩阵,消除冗余线性约束,或对变量给出更严格的边界。

关于优化过程的信息,作为带有这些字段的结构返回。

迭代

迭代次数

算法

所使用的优化算法

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

这个符号约定与非线性求解器相匹配(参见约束最优理论).然而,这个符号与许多线性规划文献中的符号相反,所以alinprog拉格朗日乘数是相关“影子价格”的负数。

算法

全部折叠

对偶单纯形算法

有关描述,请参见对偶单纯形算法

Interior-Point-Legacy算法

“interior-point-legacy”该方法基于LIPSOL (Linear Interior Point Solver,线性内点求解器),[3]),这是Mehrotra的预测-校正算法的变体[2],一种原对偶内点方法。在算法开始迭代之前,会进行许多预处理步骤。看到内点遗留线性规划

算法的第一阶段可能涉及一些约束的预处理(参见内点遗留线性规划).有几种情况可能导致linprog用一个不可行的消息退出。在每种情况下,linprog返回一个负数exitflag,表示故障。

  • 如果在中检测到一行全为0Aeq的对应元素说真的不为零,那么退出消息是

    由于不可行而退出:约束矩阵中的全零行在对应的右侧项中没有零。
  • 的元素之一x发现不在下面有界,那么退出消息是

    不可行退出:目标f'*x在下面是无界的。
  • 如果其中一排Aeq只有一个非零元素,那么关联值在x叫做单例变量。在这种情况下,的分量的值x可由Aeq而且说真的.如果计算的值违反了另一个约束,则退出消息为

    由于不可行而退出:在等式约束中的单例变量是不可行的。
  • 如果可以求解单例变量,但解决方案违反了上界或下界,则退出消息为

    由于不可行而退出:等式约束中的单例变量不在边界内。

请注意

预处理步骤是累积的。例如,即使约束矩阵的开头没有全0行,其他预处理步骤也会导致出现这样的行。

预处理结束后,开始算法的迭代部分,直到满足停止条件。(有关残差、原始问题、对偶问题和相关停止准则的更多信息,请参见内点遗留线性规划)。如果残差在增长而不是变小,或者残差既不增长也不缩小,则分别显示以下两个终止消息中的一个:

到目前为止,残差、对偶差或总相对误差中的一个或多个已经比其最小值增长了100000倍:

残差、对偶差或总相对误差中的一个或多个已经停止:

在显示这些消息之一之后,它后面会跟着下列消息之一,表明对偶、原数或两者都是不可行的。

  • 对偶似乎是不可行的(而原始无界)。(原始残差< OptimalityTolerance。)

  • 原元似乎是不可行的(而对偶是无界的)。(双残差< OptimalityTolerance。)

  • 对偶似乎是不可行的(原始无界),因为对偶残差>根号(OptimalityTolerance)。(原始残差< 10*OptimalityTolerance。)

  • 原始似乎是不可行的(和对偶无界),因为原始残差>根号(OptimalityTolerance)。(双残差< 10*OptimalityTolerance。)

  • 由于原始目标< -1e+10而对偶目标< 1e+6,因此对偶似乎是不可行的,原始无界。

  • 由于对偶目标> 1e+10和原始目标> -1e+6,原始目标似乎是不可行的,对偶无界。

  • 原初和对偶似乎都是不可行的。

例如,原始(目标)可以是无界的,原始残差(用于衡量原始约束满足程度)可以很小。

内点算法

“内点”算法类似于“interior-point-legacy”,但采用了更有效的分解程序,并采用了不同的预处理。看到内点linprog算法

选择功能

应用程序

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

参考文献

[1]丹齐格、g.b.、A.奥登和P.沃尔夫。线性不等式约束下最小化线性形式的广义单纯形方法。太平洋数学杂志,第5卷,1955年,第183-195页。

[2] Mehrotra, S.《关于原始-对偶内点方法的实现》。SIAM优化期刊,第2卷,1992,第575-601页。

[3]张勇,“MATLAB环境下求解大规模线性规划的内点法”。技术报告TR96-01, 1995年7月,马里兰州巴尔的摩县马里兰大学数学与统计系。

版本历史

R2006a之前介绍