主要内容

linprog.

求解线性规划问题

描述

线性规划求解

查找指定问题的最小值

最小值 X F T. X 这样 { 一种 X B. 一种 E. 问: X = B. E. 问: L. B. X B.

FXB.贝卡,乌兰巴托向量,一种AEQ.矩阵。

笔记

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

例子

X= linprog (F一种B.解决了最小值f ' * x这样* xB.

例子

X= linprog (F一种B.AEQ.贝卡包括平等约束Aeq * x =说真的.放一个= []b = []如果不存在不平等。

例子

X= linprog (F一种B.AEQ.贝卡乌兰巴托在设计变量上定义一组下限和上限,X,所以解总是在这个范围内Lb≤x≤ub.放AEQ = []说真的= []如果不存在平等。

笔记

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

例子

X= linprog (F一种B.AEQ.贝卡乌兰巴托选项通过指定的优化选项最小化选项.采用优化选择设置这些选项。

例子

X= linprog (问题找到最低限度问题中所描述的结构问题

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

例子

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

例子

[Xfval.ExitFlag.输出) = linprog (___另外返回一个值ExitFlag.描述出口条件和结构输出包含优化过程的信息。

例子

[Xfval.ExitFlag.输出λ) = 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. S. 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'上行',1.5);y = Optimvar(“y”下界的,-1 / 2,'上行', 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
输出=结构体字段:迭代:0构造: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
输出=结构体字段:迭代:0构造:0消息:“找到了最佳解决方案。' algorithm: 'dual-simplex' firstorderopt: 0
  • fval.时,目标函数值大于返回目标函数值,因为有更多的约束。

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

  • 输出= 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,出口,输出,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 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)

数据类型:

线性不等式约束,指定为实矩阵。一种是一个m——- - - - - -N矩阵,其中m是不平等的数量,而且N是变量的数量(长度F).对于大问题,通过一种作为稀疏矩阵。

一种编码m线性不等式

a * x <= b

在哪里X列向量是N变量x (:),B.是一个列向量m元素。

例如,考虑这些不等式:

X1+ 2X2≤10
3.X1+ 4X2≤20
5.X1+ 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];Beq = [10; 20];

例子:要指定x分量和为1,请取AEQ = ONE(1,N)Beq = 1

数据类型:

线性不平等约束,指定为真正的矢量。B.是一个m元素向量相关的一种矩阵。如果你通过了B.作为一排矢量,求解器内部转换B.到列向量b (:).对于大问题,通过B.作为一个稀疏向量。

B.编码m线性不等式

a * x <= b

在哪里X列向量是N变量x (:),一种矩阵的大小是多少m——- - - - - -N

例如,考虑这些不等式:

X1+ 2X2≤10
3.X1+ 4X2≤20
5.X1+ 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];Beq = [10; 20];

例子:要指定x分量的和为1,使用AEQ = ONE(1,N)Beq = 1

数据类型:

下限,指定为真实的矢量或真实数组。如果长度F等于, 然后指定

x(我)> =磅(我)对所有一世

如果numel(lb), 然后指定

x(我)> =磅(我)为了1 <= I <= numel(lb)

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

例子:指定所有X组件都是正的,使用LB =零(尺寸(f))

数据类型:

上限,指定为真实的矢量或真实数组。如果长度F等于乌兰巴托, 然后乌兰巴托指定

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

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

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

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

例子:指定所有x分量小于1,使用UB =α(大小(f))

数据类型:

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

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

某些选择缺席优化选择显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项

所有的算法
算法

选择优化算法:

  • 对偶单纯形的(默认)

  • “interior-point-legacy”

  • “内点”

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

诊断

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

显示

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

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

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

  • 'iter'显示每次迭代的输出。

最大

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

  • 85为了“interior-point-legacy”算法

  • 200为了“内点”算法

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

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

为了optimset,名字是maxiter..看当前和遗留选项名称

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'

选项

选择的选项优化选择

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

数据类型:结构体

输出参数

全部折叠

解决方案,返回真正的矢量或真实数组。的大小X和尺寸一样吗F

目标函数在解处的值,以实数返回。一般来说,fval.=f ' * x

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

3.

该解决方案对于相对而是可行的ConstraintTolerance宽容,但就绝对宽容而言是行不通的。

1

函数收敛到一个解X

0.

超出迭代次数选项。maxiter.ations或超过解决时间(秒)选项。MaxTime

-2

没有找到可行点。

-3

问题是无限的。

-4

值在执行算法时遇到。

-5

原始和双重问题都是不可行的。

-7

搜索方向变小了。不可能取得进一步进展。

9

求解器损失了可行性。

Exitflags3.9涉及具有很大侵犯性的金宝搏官方网站解决方案。这些通常由具有大条件数量的线性约束矩阵或具有大解决方案组件的问题。为了纠正这些问题,尝试缩放系数矩阵,消除冗余线性约束,或者在变量上给出更紧的边界。

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

迭代

的迭代次数

算法

优化算法

cgiterations

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

信息

退出消息

constrviolation

约束函数的最大值

firstordopt.

一阶最优测量

解的拉格朗日乘数,返回为带有这些场的结构。

较低的

下界对应于

上界对应于乌兰巴托

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]),这是梅赫罗特拉的预测-校正算法的一个变体[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。“在线性不等式约束下最小化线性形式的广义单纯形方法”。太平洋杂志数学。,卷。5,1955,第183-195页。

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

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

之前介绍过的R2006a