主要内容

linprog

解决线性编程问题

描述

线性编程求解器

查找最低问题所指定的问题

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

f,x,b,说真的,, 和UB.是载体,和一个Aeq是矩阵。

请注意

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

例子

x= linprog(f,一个,b)解决分钟f'* x这样斧头≤.b

例子

x= linprog(f,一个,b,Aeq,说真的)包括等式约束aeq * x = beq。集a = []b = []如果没有不等式。

例子

x= linprog(f,一个,b,Aeq,说真的,,UB.)定义一组设计变量的下界和上界,x,使解决方案始终在范围内lb≤x≤ub。集Aeq = []beq = []如果没有平等性存在。

请注意

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

例子

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

例子

x= linprog(问题)查找最小值问题,描述的结构问题

您可以导入问题使用MPS文件的结构硕士。您也可以创建一个问题结构的优化问题通过使用prob2struct

例子

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

例子

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

例子

(x,fval,exitflag,输出,lambda.] = linprog(___)另外返回一个结构lambda.其字段在解决方案中包含Lagrange乘法器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];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 -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];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 -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];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

创建一个优化问题对象命名概率来表示这个问题。

x = optimvar ('X','indowbound',-1,“UpperBound”, 1.5);y = optimvar ('是','indowbound'1/2,“UpperBound”,1.25);prob = 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(prob);

解决结果的问题结构。

[SOL,FVAL,EXITFLAG,输出] = LINPROG(问题)
找到最佳解决方案。
sol =2×10.1875 1.2500
fval = -0.6042.
EXITFLAG = 1
输出=结构与字段:迭代:0 constrviroation:0消息:'找到最佳解决方案。'算法:'Dual-Simplex'FirstOrderOpt:0

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

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

prob.variables.
ans =.结构与字段:X:[1x1 Optim.Problemdef.OptimizationVariable] Y:[Optim.ProBlubleDef.OptimizationVariable]

如你所料,Sol(1)对应于x, 和Sol(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];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];

设置选项以使用'双重simplex'算法。

选项= Optimoptions(“linprog”,'算法','双重simplex');

解决线性程序并请求功能值,退出标志和输出结构。

[x,fval,出口,输出] = linprog(f,a,b,aeq,beq,lb,Ub,选项)
找到最佳解决方案。
X =2×10.1875 1.2500
fval = -0.6042.
EXITFLAG = 1
输出=结构与字段:迭代:0 constrviroation: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

LB =零(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×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

检查这是真的:

斧头
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。

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

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-Components Sum为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(i)> = lb(i)对所有人

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

x(i)> = lb(i)1 <= i <= numel(lb)

在这种情况下,索盘发出警告。

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

数据类型:双倍的

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

x(i)<= UB(i)对所有人

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

x(i)<= UB(i)1 <= i <= numel(UB)

在这种情况下,索盘发出警告。

例子:指定所有X组件少于1, 用乌兰巴托= 1(大小(f))

数据类型:双倍的

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

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

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

所有算法
算法

选择优化算法:

  • '双重simplex'(默认)

  • '内部点遗留'

  • '内点'

有关选择算法的信息,请参见线性编程算法

诊断

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

展示

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

  • '最终的'(默认)只显示最终输出。

  • '离开'或者“没有”显示无输出。

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

MaxIterations

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

  • 85.'内部点遗留'算法

  • 200.'内点'算法

  • 10 *(NumberoFequalities + Numberofinequalities + NumberoFvariables)'双重simplex'算法

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

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

最优法

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

  • 1E-8'内部点遗留'算法

  • 1E-7'双重simplex'算法

  • 1E-6'内点'算法

优化集, 名字是塔尔芬。看到当前和遗留选项名称

内点算法
约束特许

限制的可行性公差,标量1E-10通过1E-3约束特许措施原始可行性公差。默认为1E-6

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

进行预处理

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

双单算法
约束特许

限制的可行性公差,标量1E-10通过1E-3约束特许措施原始可行性公差。默认为1E-4

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

MaxTime.

算法运行的最大时间内以秒为单位的最大时间。默认为INF.

进行预处理

双单简单算法迭代之前的LP预处理级别。指定'基本的'(默认)或“没有”

例子:选项= Optimoptions('Linprog','算法','内部点','显示','iter')

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

字段名称 条目

f

线性目标函数矢量f

Aineq.

线性不等式约束的矩阵

Bineq.

线性不等式约束的矢量

Aeq

矩阵的线性等式约束

说真的

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

求解器

“linprog”

选项

选择创建optimoptions

你必须至少提供求解器田野问题结构体。

数据类型:塑造

输出参数

全部收缩

解决方案,作为实向量或实数组返回。的大小x与大小相同f

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

原因linprog停止,返回整数。

3.

就相对而言,这个解是可行的约束特许耐受性,但对绝对耐受性是不可行的。

1

功能融合到解决方案x

0

超过迭代次数options.maxIterations.或在几秒钟内解决时间options.maxtime.

-2

没有发现可行的点。

-3

问题是无限的。

-4

在执行算法期间遇到值。

-5

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

-7

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

-9

解决了可行性。

ExitFlags.3.-9联系那些有很大不可行万博 尤文图斯性的解决方案。这些问题通常来自于条件数较大的线性约束矩阵,或具有较大解分量的问题。为了纠正这些问题,尝试缩放系数矩阵,消除冗余线性约束,或给变量更紧的界限。

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

迭代

迭代次数

算法

优化算法使用

cgiteration.

0(仅包含向后兼容性的内部点算法)

消息

退出消息

CONSTRVIOMATION.

最大约束函数

firstorderopt

一阶最优性测量

Lagrange乘法器在解决方案中,返回与这些字段的结构。

降低

对应的下限

上限对应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拉格朗日乘法器是相关的“影子价格”的负面。

算法

全部收缩

双单算法

有关描述,请参阅双单算法

内部点传统算法

'内部点遗留'基于LIPSOL (Linear inner Point Solver,[3]),这是Mehrotra预测校正器算法的变种[2],一种原始 - 双内点法。在算法开始迭代之前发生许多预处理步骤。看到内部点遗留线性规划

算法的第一阶段可能涉及一些限制的预处理(见内部点遗留线性规划)。有几个条件可能会导致linprog退出不可行消息。在每种情况下,linprog返回消极exitflag,表示表示失败。

  • 如果检测到所有零的行Aeq,但相应的元素说真的不是零,然后退出消息是

    由于不可行性而退出:约束矩阵中的全零行在相应的右侧项中没有零。
  • 如果其中一个元素x被发现不符合下面,然后退出消息是

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

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

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

请注意

预处理步骤是累积的。例如,即使您的约束矩阵没有一行全为零的开始,其他预处理步骤也可能导致这样一行的发生。

当预处理结束时,算法的迭代部分开始,直到满足停止标准。(有关残差的更多信息,原始问题,双重问题以及相关停止标准,见内部点遗留线性规划。)如果残差越来越多,而不是越来越小,或者残差既不生长也不缩小,则分别显示两个终止消息中的一个,

到目前为止,一个或多个残差,二元间隙或总相对误差的总体相对误差会大于其最小值的100000倍:

或者

剩余一个或多个残差,二元间隙或相对误差的一个或多个已经停止了:

在显示这些消息之后,它之后是以下消息之一,指示双重,原始或两者似乎是不可行的。

  • 双重似乎是不可行的(以及原始无界的)。(原始残留

  • 原始似乎是不可行的(和双无限的)。(双重残差

  • 由于双残差> SQRT(OptimalallyTolerance),双重似乎是不可行的(和原始无界的)。(原始残留<10 *最优分器。)

  • 由于原始残留> SQRT(OptimalalcalalTolerance),原始原始似乎是不可行的(和双无界的)。(双重残留<10 *最优性1.)

  • 双重似乎是不可行的,并且由于原始物镜<-1e + 10和双目标<1e + 6的原始未绑定。

  • 原始似乎是不可行的,并且由于双目标> 1E + 10和原始物镜> -1e + 6的双无界。

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

例如,原始(目标)可以是无界的,并且是一种原始约束满足的量度的原始残留物可以很小。

内部点算法

'内点'算法类似于'内部点遗留',但具有更有效的分解程序,以及不同的预处理。看到内点linprog算法

替代功能

应用程序

优化Live Editor任务提供可视界面linprog

参考文献

[1] Dantzig,G.B.,A. Orden和P. Wolfe。“用于最小化线性不等式限制下线性形式的通用单纯性方法。”太平洋数学》杂志上。第5卷,1955年,第183-195页。

[2] Mehrotra,S。“关于基于双重内部点法的实施。”暹罗期刊优化,卷。2,1992,PP。575-601。

[3]张,Y.,“通过Matlab环境下的内部点方法解决大规模线性计划。”技术报告TR96-01,马里兰大学,巴尔的摩县马里兰大学数学与统计系,1995年7月。

在R2006A之前介绍