linprog
解决线性规划问题
语法
描述
线性规划求解器
查找指定的问题的最小值
f,x,b,说真的,磅,乌兰巴托是向量,并且一个而且Aeq矩阵。
请注意
linprog
仅适用于基于求解器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或基于解决方案的方法.
求最小值x
= linprog (问题
)问题
中描述的结构问题
.
您可以导入问题
结构从MPS文件使用mpsread
.您还可以创建一个问题
结构,从OptimizationProblem
对象,使用prob2struct
.
例子
线性规划,线性不等式约束
求解一个由线性不等式定义的简单线性程序。
对于这个例子,使用这些线性不等式约束:
A = [1 1 1 1/4 1 -1/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];
使用目标函数 .
F = [-1 -1/3];
求解线性规划。
x = linprog(f,A,b)
找到最优解。
x =2×10.6667 - 1.3333
具有线性不等式和等式的线性规划
求解一个由线性不等式和线性等式定义的简单线性程序。
对于这个例子,使用这些线性不等式约束:
A = [1 1 1 1/4 1 -1/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];Beq = 1/2;
使用目标函数 .
F = [-1 -1/3];
求解线性规划。
x = linprog(f,A,b,Aeq,beq)
找到最优解。
x =2×10 2
所有约束类型的线性规划
用线性不等式、线性等式和边界解一个简单的线性程序。
对于这个例子,使用这些线性不等式约束:
A = [1 1 1 1/4 1 -1/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];Beq = 1/2;
设置这些界限:
Lb = [-1,-0.5];Ub = [1.5,1.25];
使用目标函数 .
F = [-1 -1/3];
求解线性规划。
x = linprog(f,A,b,Aeq,beq,lb,ub)
找到最优解。
x =2×10.1875 - 1.2500
线性规划使用“内点”
算法
求解线性规划“内点”
算法。
对于这个例子,使用这些线性不等式约束:
A = [1 1 1 1/4 1 -1/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];Beq = 1/2;
设置这些界限:
Lb = [-1,-0.5];Ub = [1.5,1.25];
使用目标函数 .
F = [-1 -1/3];
设置选项以使用“内点”
算法。
选项= optimoptions(“linprog”,“算法”,“内点”);
求解线性规划“内点”
算法。
x = linprog(f,A,b,Aeq,beq,lb,ub,options)
最小值满足约束条件。优化完成是因为目标函数在可行方向上不递减,在函数公差选定值范围内,约束条件满足在约束公差选定值范围内。
x =2×10.1875 - 1.2500
使用基于问题的方法解决LPlinprog
此示例演示如何使用基于问题的方法设置问题,然后使用基于求解器的方法解决问题。问题是
创建一个OptimizationProblem
对象命名概率
来表示这个问题。
X = optimvar(“x”,下界的, 1“UpperBound”, 1.5);Y = optimvar(“y”,下界的1/2,“UpperBound”, 1.25);问题=优化问题(“目标”,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;
将问题对象转换为问题结构。
Problem = prob2struct(probb);
解决产生的问题结构。
[sol,fval,exitflag,output] = linprog(problem)
找到最优解。
索尔=2×10.1875 - 1.2500
Fval = -0.6042
Exitflag = 1
输出=带字段的结构:消息:'找到最佳解决方案。'算法:'dual-simplex' firstorderopt: 0
返回的fval
是负的,即使溶液组分是正的。在内部,prob2struct
将最大化问题转化为目标函数负的最小化问题。看到最大化目标.
哪个成分索尔
对应于哪个优化变量?检查变量
的属性概率
.
概率。变量
ans =带字段的结构:X: [1x1 optimt .problemdef.]OptimizationVariable] y: [1x1 optimize .problemdef.OptimizationVariable]
如你所料,索尔(1)
对应于x
,索尔(2)
对应于y
.看到算法.
返回目标函数值
计算一个简单线性规划的解和目标函数值。
不等式约束条件是
A = [1 1 1 1/4 1 -1/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];
目标函数为 .
F = [-1 -1/3];
求解问题并返回目标函数值。
[x,fval] = linprog(f,A,b)
找到最优解。
x =2×10.6667 - 1.3333
Fval = -1.1111
获取更多输出以检查解决方案过程
获取出口标志和输出结构,以更好地理解解决方案过程和质量。
对于这个例子,使用这些线性不等式约束:
A = [1 1 1 1/4 1 -1/4 -1 -1 -1 -1 -1 -1 1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];Beq = 1/2;
设置这些界限:
Lb = [-1,-0.5];Ub = [1.5,1.25];
使用目标函数 .
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
输出=带字段的结构:消息:'找到最佳解决方案。'算法:'dual-simplex' firstorderopt: 0
fval
,目标函数值大于返回目标函数值,因为有更多的约束。exitflag
= 1表示解决方案可靠。output.iterations
= 0表示linprog
在预解过程中找到了解决方案,根本不需要迭代。
获得解和拉格朗日乘子
求解一个简单的线性规划,并检验解和拉格朗日乘子。
使用目标函数
F = [-5;4;6);
使用线性不等式约束
A = [1 -1 1 3 2 4 3 2 0];B = [20;42;30];
约束所有变量为正:
Lb = 0 (3,1);
集Aeq
而且说真的
来[]
,表示不存在线性等式约束。
Aeq = [];Beq = [];
调用linprog
,得到拉格朗日乘子。
[x,fval,exitflag,output,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
lambda.ineqlin
的第二分量和第三分量是不是非零x
.这表明第二个和第三个线性不等式约束满足如下等式:
检查这是真的:
* x
ans =3×1-12.0000 42.0000 30.0000
lambda.lower
的第一个分量非零吗x
.这表明x (1)
是0的下界。
输入参数
f
- - - - - -系数向量
真正的向量|真正的数组
系数向量,指定为实向量或实数组。系数向量表示目标函数f ' * x
.这个符号假设f
是列向量,但也可以使用行向量或数组。在内部,linprog
转换f
对列向量f (:)
.
例子:F = [1,3,5,-6]
数据类型:双
一个
- - - - - -线性不等式约束
真正的矩阵
线性不等式约束,指定为实矩阵。一个
是一个米
——- - - - - -N
矩阵,米
不等式的数量,和N
变量的数量(长度f
).对于大问题,可以通过一个
作为一个稀疏矩阵。
一个
编码米
线性不等式
A*x <= b
,
在哪里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 = ones(1,N)
而且B = 1
.
数据类型:双
Aeq
- - - - - -线性等式约束
真正的矩阵
线性等式约束,指定为实矩阵。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];Beq = [10;20];
例子:要指定x分量的和为1,取Aeq = ones(1,N)
而且Beq = 1
.
数据类型:双
b
- - - - - -线性不等式约束
真正的向量
线性不等式约束,指定为实向量。b
是一个米
元素的相关向量一个
矩阵。如果你通过了b
作为行向量,解算器内部转换b
对列向量b (:)
.对于大问题,可以通过b
作为一个稀疏向量。
b
编码米
线性不等式
A*x <= b
,
在哪里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 = ones(1,N)
而且B = 1
.
数据类型:双
说真的
- - - - - -线性等式约束
真正的向量
线性等式约束,指定为实向量。说真的
是一个我
元素的相关向量Aeq
矩阵。如果你通过了说真的
作为行向量,解算器内部转换说真的
对列向量说真的(:)
.对于大问题,可以通过说真的
作为一个稀疏向量。
说真的
编码我
线性等式
Aeq*x = beq
,
在哪里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 = ones(1,N)
而且Beq = 1
.
数据类型:双
磅
- - - - - -下界
真正的向量|真正的数组
下界,指定为实向量或实数组。如果的长度f
等于的长度磅
,然后磅
指定
X (i) >= lb(i)
对所有我
.
如果数值(lb) <数值(f)
,然后磅
指定
X (i) >= lb(i)
为1 <= I <= number (lb)
.
在这种情况下,求解器发出警告。
例子:要指定所有x分量都是正的,使用Lb = 0 (size(f))
.
数据类型:双
乌兰巴托
- - - - - -上界
真正的向量|真正的数组
上界,指定为实向量或实数组。如果的长度f
等于的长度乌兰巴托
,然后乌兰巴托
指定
X (i) <= ub(i)
对所有我
.
如果Numel (ub) < Numel (f)
,然后乌兰巴托
指定
X (i) <= ub(i)
为1 <= I <= numel(ub)
.
在这种情况下,求解器发出警告。
例子:指定所有x分量都小于1
,使用Ub = ones(size(f))
.
数据类型:双
选项
- - - - - -优化选项
的输出optimoptions
|结构optimset
返回
的优化选项,指定为的输出optimoptions
或者一种结构optimset
的回报。
一些选项适用于所有算法,而其他选项则与特定算法相关。看到优化选项参考有关详细信息。
中缺少一些选项optimoptions
显示。这些选项在下表中以斜体字显示。详细信息请参见视图选项.
所有的算法 | |
算法 |
选择优化算法:
有关选择算法的信息,请参见线性规划算法. |
诊断 | 显示有关要最小化或解决的功能的诊断信息。选择 |
|
显示水平(见迭代显示):
|
|
允许的最大迭代次数,一个正整数。默认为:
为 |
|
终止公差对对偶可行,为正标量。默认为:
为 |
内点算法 | |
ConstraintTolerance |
约束的可行性公差,一个非负标量。 为 |
进行预处理 | 算法迭代前的LP预处理级别。指定 |
对偶单纯形算法 | |
ConstraintTolerance |
可行性公差为约束,一个标量从 为 |
MaxTime |
算法运行的最大时间(以秒为单位)。默认为 |
进行预处理 | 对偶单纯形算法迭代前的LP预处理水平。指定 |
例子:options = optimoptions('linprog','Algorithm',' internal -point','Display','iter')
问题
- - - - - -问题的结构
结构
问题结构,指定为具有以下字段的结构。
字段名 | 条目 |
---|---|
|
线性目标函数向量f |
|
线性不等式约束的矩阵 |
|
线性不等式约束的向量 |
|
矩阵的线性等式约束 |
|
线性等式约束的向量 |
磅 |
下界向量 |
乌兰巴托 |
上界向量 |
|
“linprog” |
|
创建的选项optimoptions |
你必须提供至少解算器
在问题
结构。
数据类型:结构体
输出参数
x
——解决方案
实向量|实数组
解,作为实向量或实数组返回。的大小x
和的尺寸一样吗f
.
fval
-解处的目标函数值
实数
目标函数在解处的值,作为实数返回。一般来说,fval
=f ' * x
.
exitflag
- - -原因linprog
停止
整数
原因linprog
停止,以整数形式返回。
|
解是相对可行的 |
|
函数收敛到一个解 |
|
超过迭代次数 |
|
没有找到可行点。 |
|
问题是无界的。 |
|
|
|
原始问题和对偶问题都是不可行的。 |
|
搜索方向变得太小。没有进一步的进展。 |
|
求解器失去了可行性。 |
Exitflags3.
而且9
涉及到有很大的不可行金宝搏官方网站性的解决方案。这些问题通常产生于具有大条件数的线性约束矩阵,或具有大解分量的问题。要纠正这些问题,请尝试缩放系数矩阵,消除冗余线性约束,或对变量给出更严格的边界。
输出
—优化过程信息
结构
关于优化过程的信息,作为带有这些字段的结构返回。
迭代 |
迭代次数 |
算法 |
所使用的优化算法 |
cgiterations |
0(仅包含内点算法,用于向后兼容) |
消息 |
退出消息 |
constrviolation |
约束函数的最大值 |
firstorderopt |
一阶最优测度 |
算法
对偶单纯形算法
有关描述,请参见对偶单纯形算法.
Interior-Point-Legacy算法
的“interior-point-legacy”
该方法基于LIPSOL (Linear Interior Point Solver,线性内点求解器),[3]),这是Mehrotra的预测-校正算法的变体[2],一种原对偶内点方法。在算法开始迭代之前,会进行许多预处理步骤。看到内点遗留线性规划.
算法的第一阶段可能涉及一些约束的预处理(参见内点遗留线性规划).有几种情况可能导致linprog
用一个不可行的消息退出。在每种情况下,linprog
返回一个负数exitflag
,表示故障。
如果在中检测到一行全为0
Aeq
的对应元素说真的
不为零,那么退出消息是由于不可行而退出:约束矩阵中的全零行在对应的右侧项中没有零。
的元素之一
x
发现不在下面有界,那么退出消息是不可行退出:目标f'*x在下面是无界的。
如果其中一排
Aeq
只有一个非零元素,那么关联值在x
叫做单例变量。在这种情况下,的分量的值x
可由Aeq
而且说真的
.如果计算的值违反了另一个约束,则退出消息为由于不可行而退出:在等式约束中的单例变量是不可行的。
如果可以求解单例变量,但解决方案违反了上界或下界,则退出消息为
由于不可行而退出:等式约束中的单例变量不在边界内。
请注意
预处理步骤是累积的。例如,即使约束矩阵的开头没有全0行,其他预处理步骤也会导致出现这样的行。
预处理结束后,开始算法的迭代部分,直到满足停止条件。(有关残差、原始问题、对偶问题和相关停止准则的更多信息,请参见内点遗留线性规划)。如果残差在增长而不是变小,或者残差既不增长也不缩小,则分别显示以下两个终止消息中的一个:
到目前为止,残差、对偶差或总相对误差中的一个或多个已经比其最小值增长了100000倍:
或
残差、对偶差或总相对误差中的一个或多个已经停止:
在显示这些消息之一之后,它后面会跟着下列消息之一,表明对偶、原数或两者都是不可行的。
对偶似乎是不可行的(而原始无界)。(原始残差< OptimalityTolerance。)
原元似乎是不可行的(而对偶是无界的)。(双残差< OptimalityTolerance。)
对偶似乎是不可行的(原始无界),因为对偶残差>根号(OptimalityTolerance)。(原始残差< 10*OptimalityTolerance。)
原始似乎是不可行的(和对偶无界),因为原始残差>根号(OptimalityTolerance)。(双残差< 10*OptimalityTolerance。)
由于原始目标< -1e+10而对偶目标< 1e+6,因此对偶似乎是不可行的,原始无界。
由于对偶目标> 1e+10和原始目标> -1e+6,原始目标似乎是不可行的,对偶无界。
原初和对偶似乎都是不可行的。
例如,原始(目标)可以是无界的,原始残差(用于衡量原始约束满足程度)可以很小。
内点算法
的“内点”
算法类似于“interior-point-legacy”
,但采用了更有效的分解程序,并采用了不同的预处理。看到内点linprog算法.
选择功能
应用程序
的优化活动编辑器任务提供了一个可视化界面linprog
.
参考文献
[1]丹齐格、g.b.、A.奥登和P.沃尔夫。线性不等式约束下最小化线性形式的广义单纯形方法。太平洋数学杂志,第5卷,1955年,第183-195页。
[2] Mehrotra, S.《关于原始-对偶内点方法的实现》。SIAM优化期刊,第2卷,1992,第575-601页。
[3]张勇,“MATLAB环境下求解大规模线性规划的内点法”。技术报告TR96-01, 1995年7月,马里兰州巴尔的摩县马里兰大学数学与统计系。
版本历史
R2006a之前介绍
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。