主要内容

linprog

求解线性规划问题

描述

线性规划求解器

找到最低指明的问题

x f T x 这样 一个 x ≤. b 一个 e x b e l b ≤. x ≤. u b

fxb说真的UB是矢量,和一个Aeq是矩阵。

请注意

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

例子

x=linprog(f一个b解决了分f'*x这样A*x≤.b

例子

x=linprog(f一个bAeq说真的包括等式约束AEQ * X = BEQ.集A = []B = []如果不存在不平等现象。

例子

x=linprog(f一个bAeq说真的UB定义一组设计变量的上下限,x,使溶液总是在范围磅≤ x≤ 乌兰巴托.集Aeq = []说真的= []如果不存在平等。

请注意

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

例子

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

例子

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

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

例子

xfval]=linprog(___,对于任何输入参数,返回目标函数的值享乐在解决方案xFVAL = F'* X

例子

xfvalexitflag输出]=linprog(___另外返回一个值exitflag描述退出条件,以及结构输出其中包含有关优化过程的信息。

例子

xfvalexitflag输出lambda.]=linprog(___另外返回结构lambda.其字段包含拉格朗日乘子的解决方案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 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 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 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 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,选项)
找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
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 (“是的”“下界”1/2,“UpperBound”,1.25); prob=优化问题(“目标”,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:0消息:“找到最佳解决方案”。算法:“双单纯形”firstorderopt:0

返回fval是负的,尽管解的分量是正的。在内部,prob2struct将最大化问题转化为目标函数负的最小化问题。看到最大化目标

其中的组成部分溶胶对应哪个优化变量?检查变量的属性概率

问题变量
ans=带字段的结构:x: [1 x1 optim.problemdef。y: [1x1 optimi .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 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 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
输出=带字段的结构:迭代次数:1:0消息:“找到最佳解决方案”。算法:“双单纯形”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 = [];BEQ = [];

称呼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×1

lambda.ineqlin第二个和第三个分量是非零的吗x.这表明第二、三线性不等式约束满足等式:

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

3. x 1 + 2 x 2 3. 0

检查这是否正确:

A*x
ans=3×1-12.0000 42.0000 30.0000

兰博达酒店第一个分量是不是非零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

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

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

例子:要指定x分量加起来在1以下,取A =酮(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];说真的=(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

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

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

例子:要指定x分量的总和等于或小于1,请使用A =酮(1,N)b=1

数据类型:

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

说真的编码线性等式

AEQ * X = BEQ

在哪里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(磅)

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

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

数据类型:

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

X(ⅰ)<= UB(I)对所有人

如果numel(UB),然后UB指定

X(ⅰ)<= UB(I)1 <= I <= numel(ub)

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

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

数据类型:

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

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

控件中缺少一些选项optimoptions展示。这些选项出现在以下表中斜体字。有关详细信息,请参阅查看选项

所有算法
算法

选择优化算法:

  • 对偶单纯形的(默认)

  • “内点遗留”

  • “内点”

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

诊断

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

展示

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

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

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

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

MaxIterations

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

  • 85.“内点遗留”算法

  • 200“内点”算法

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

看到公差和停止标准迭代和函数计数

优化集,名字是麦克斯特.看到当前和遗留选项名称

OptimalityTolerance

对偶可行性的终止容限,一个正标量。默认的是:

  • 1E-8“内点遗留”算法

  • 1E-7对偶单纯形的算法

  • 1E-6“内点”算法

优化集,名字是TolFun.看到当前和遗留选项名称

内点算法
ConstraintTolerance

可行性容忍的限制,从标1E-10通过1E-3ConstraintTolerance测量原始可行性公差。默认值是1E-6

优化集,名字是TolCon.看到当前和遗留选项名称

进行预处理

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

双单工算法
ConstraintTolerance

可行性容忍的限制,从标1E-10通过1E-3ConstraintTolerance测量原始可行性公差。默认值是1E-4

优化集,名字是TolCon.看到当前和遗留选项名称

MaxTime

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

进行预处理

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

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

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

字段名 条目

f

线性目标函数向量f

Aineq

线性不等式约束的矩阵

bineq

线性不等式约束向量

Aeq

线性等式约束的矩阵

说真的

线性等式约束的向量
下界向量
UB 上界的矢量

求解器

“linprog”

选项

选择创建optimoptions

你必须至少提供求解器在现场问题结构体。

数据类型:结构

输出参数

全部崩溃

解,返回实向量或实数组。的大小x相同的尺寸f

在该解决方案的目标函数值,返回一个实数。一般来说,fvalf'*x

原因linprog已停止,作为整数返回。

3.

这个解相对于相对值是可行的ConstraintTolerance公差,但相对于绝对公差而言不可行。

1

函数收敛到一个解x

0

超过迭代次数选项。麦克斯特ations或超出了以秒为单位的解决方案时间options.MaxTime

-2

没有找到可行的点。

-3

问题是无限的。

-4

在执行算法期间遇到值。

-5

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

-7

搜索方向太小。无法取得进一步进展。

-9

解决了可行性。

Exitflags3.-9与具有很大不可行性的金宝搏官方网站解决方案相关。这些通常是由具有较大条件数的线性约束矩阵或具有较大解分量的问题产生的。为了纠正这些问题,尝试缩放系数矩阵,消除冗余的线性约束,或给变量更严格的界限。

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

迭代

迭代次数

算法

采用优化算法

CG迭代

0(只包含内部点算法,用于向后兼容)

消息

退出消息

违反合同

的约束函数最大

firstorderopt

一阶最优性测量

在该溶液拉格朗日乘数,返回与这些字段的结构。

降低

下界对应于

对应于UB

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 - UB + λ 降低 T - x

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

算法

全部崩溃

双单工算法

有关描述,请参见双单工算法

Interior-Point-Legacy算法

“内点遗留”基于线性内点求解器(Linear Interior Point Solver,[3]),这是梅赫罗特拉的预测-校正算法的一个变体[2],一个偶内点法。发生一些预处理步骤的算法开始迭代之前。看到内点线性规划

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

  • 如果在中检测到一行全零Aeq,但说真的如果不为零,则退出消息为

    由于不可行而退出:约束矩阵中的全零行在相应的右手边项中没有零。
  • 如果元素之一x被发现,但将在下面限定,则退出消息是

    由于不可行性退出:目标F'* x是无界的下方。
  • 如果行之一Aeq只有一个非零元素,那么关联的值在x被称为独生子多变的。在这种情况下,的分量的值x可根据Aeq说真的.如果计算的值违反了另一个约束,则退出消息为

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

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

请注意

预处理步骤是累积的。例如,即使约束矩阵不是以全零开头的行,其他预处理步骤也可能导致出现这样的行。

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

一个或多个残差、对偶间隙或总相对误差已增长到其最小值的100000倍以上:

一个或多个残差、对偶间隙或总相对误差停止:

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

  • 对偶似乎是不可行的(原始无界)。(原始剩余<最优耐受。)

  • 原初似乎是不可行的(和双无界)。(双残余

  • 双似乎是不可行的(和原始无界),因为双残余> SQRT(OptimalityTolerance)。(太极残余<10 * OptimalityTolerance。)

  • 原初似乎是不可行的(和双无界),因为原始的残留> SQRT(OptimalityTolerance)。(双残余<10 * OptimalityTolerance。)

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

  • 由于双目标> 1e+10和原目标> -1e+6,原目标出现不可行和对偶无界。

  • 原始的和二元的似乎都是不可行的。

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

内点算法

“内点”算法类似于“内点遗留”,但更有效的分解程序,并用不同的预处理。看到内点linprog算法

替代功能

应用程序

优化活动编辑器任务为linprog

参考文献

[1]丹,G.B.,A.奥登和P.沃尔夫。“广义单纯形法最小化线性表线性不等式约束。”太平洋数学》杂志上。1955年第5卷,第183-195页。

[2] 关于原始-对偶内点法的实现SIAM优化学报, 1992年第2卷,575-601页。

[3] Zhang,Y.,“在MATLAB环境下用内点法求解大型线性规划。”技术报告TR96-01,数学与统计,美国马里兰大学巴尔的摩县,马里兰州巴尔的摩市,1995年7月系。

在R2006a之前引入