主要内容

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 =说真的.集一个= []而且b = []如果不存在不平等。

例子

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

请注意

如果问题的指定输入边界不一致,则输出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 -1/4 -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];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];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];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

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

马克斯 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 constrbreach: 0消息:“找到最佳解决方案。'算法:'dual-simplex' firstorderopt: 0

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

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

概率。变量
ans =结构体字段:x: [1 x1 optim.problemdef。y: [1x1 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];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];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 constrbreach: 0消息:“找到最佳解决方案。'算法:'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

磅= 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
3.x1+ 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
3.x1+ 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 <= I <= numel(lb)

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

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

数据类型:

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

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

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

x (i) < =乌兰巴托(我)1 <= I <= numel(ub)

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

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

数据类型:

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

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

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

所有的算法
算法

选择优化算法:

  • 对偶单纯形的(默认)

  • “interior-point-legacy”

  • “内点”

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

诊断

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

显示

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

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

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

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

MaxIterations

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

  • 85“interior-point-legacy”算法

  • 200“内点”算法

  • 10*(numberofequality + numberofinequequ+ 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

目标函数在解处的值,作为实数返回。一般来说,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(线性内点求解器,[3]),这是Mehrotra预测校正算法的一个变体[2],一种原对偶内点法。在算法开始迭代之前,会有许多预处理步骤。看到Interior-Point-Legacy线性规划

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

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

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

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

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

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

请注意

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

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

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

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

在显示这些消息中的一个之后,后面会显示以下消息中的一个,表明对偶、原始或两者都是不可行的。

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

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

  • 由于对偶残差>√(OptimalityTolerance),对偶似乎是不可行的(且原始无界)。(原始残差< 10*OptimalityTolerance。)

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

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

  • 原始目标似乎是不可行的,而对偶目标是无界的,因为双重目标> 1e+10和原始目标> -1e+6。

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

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

内点算法

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

选择功能

应用程序

优化Live Editor任务提供了一个可视化的界面linprog

参考文献

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

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

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

版本历史

之前介绍过的R2006a

Baidu
map