主要内容

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 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];说真的= 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];说真的= 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 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];说真的= 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构造:0消息:“找到了最佳解决方案。' algorithm: 'dual-simplex' 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];说真的= 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构造:0消息:“找到了最佳解决方案。' algorithm: '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*(numberOfEqualities + numberOfInequalities + numberOfVariables)对偶单纯形的算法

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

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

OptimalityTolerance

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

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

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

  • 1 e-6“内点”算法

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

内点算法
ConstraintTolerance

约束的可行性容差,一个标量1平台以及通过1 e - 3ConstraintTolerance测量原始可行性公差。默认值是1 e-6

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

进行预处理

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

对偶单纯形算法
ConstraintTolerance

约束的可行性容差,一个标量1平台以及通过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”基于线性内点求解器(Linear Interior Point Solver,[3]),这是梅赫罗特拉的预测-校正算法的一个变体[2],一种原-对偶内点法。在算法开始迭代之前,需要进行许多预处理步骤。看到Interior-Point-Legacy线性规划

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

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

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

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

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

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

请注意

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

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

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

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

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

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

  • 原始的似乎是不可行的(和对偶无界)。(双残留<优化公差。)

  • 由于双剩余>根号(OptimalityTolerance),这个对偶看起来是不可行的(原始无界)。(原始残留< 10*优化公差。)

  • 由于原始残差>根号(OptimalityTolerance),所以原始看起来是不可行的(并且对偶无界)。(双残留< 10*优化公差。)

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

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

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

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

内点算法

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

选择功能

应用程序

优化活动编辑器任务为linprog

参考文献

Dantzig, g.b., A. Orden和P. Wolfe。“在线性不等式约束下最小化线性形式的广义单纯形方法”。太平洋数学》杂志上。1955年第5卷,第183-195页。

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

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

之前介绍过的R2006a