linprog
解决线性规划问题
语法
描述
线性规划求解
找到指定的问题的最小值
f,x,b,说真的,磅,乌兰巴托向量,一个而且Aeq矩阵。
请注意
linprog
只适用于基于求解器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或基于求解器的方法.
找到最小值x
= linprog (问题
)问题
中描述的结构问题
.
您可以导入问题
结构从MPS文件使用mpsread
.您也可以创建问题
结构的OptimizationProblem
对象的使用prob2struct
.
例子
线性规划,线性不等式约束
解一个由线性不等式定义的简单线性程序。
对于本例,使用以下线性不等式约束:
A = [1 1 1 1/4 1 -1 -1/4 -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 -1/4 -1 -1 -1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];说真的= 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 -1/4 -1 -1 -1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];说真的= 1/2;
设置这些界限:
磅= (-0.5);乌兰巴托= [1.5,1.25];
利用目标函数 .
F = [-1 -1/3];
求解线性规划。
x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托)
找到最优解。
x =2×10.1875 - 1.2500
线性规划“内点”
算法
求解一个线性规划“内点”
算法。
对于本例,使用以下线性不等式约束:
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];说真的= 1/2;
设置这些界限:
磅= (-0.5);乌兰巴托= [1.5,1.25];
利用目标函数 .
F = [-1 -1/3];
设置选项以使用“内点”
算法。
选择= optimoptions (“linprog”,“算法”,“内点”);
求解线性规划“内点”
算法。
x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在函数公差的选定值内,约束满足在约束公差的选定值内。
x =2×10.1875 - 1.2500
用基于问题的方法解决LPlinprog
此示例演示如何使用基于问题的方法设置问题,然后使用基于求解器的方法解决问题。现在的问题是
创建一个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 constrbreach: 0消息:“找到最佳解决方案。'算法:'dual-simplex' firstorderopt: 0
返回的fval
是负的,即使溶液组分是正的。在内部,prob2struct
将最大化问题转化为目标函数负的最小化问题。看到最大化客观.
它的组成部分索尔
对应哪个优化变量?检查变量
的属性概率
.
概率。变量
ans =结构体字段:x: [1 x1 optim.problemdef。y: [1x1 optim.problemdef.OptimizationVariable]
如你所料,索尔(1)
对应于x
,索尔(2)
对应于y
.看到算法.
返回目标函数值
计算一个简单线性程序的解和目标函数值。
不等式约束条件是
A = [1 1 1 1/4 1 -1 -1/4 -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 -1/4 -1 -1 -1 1];B = [2 1 2 1 -1 2];
使用线性等式约束 .
Aeq = [1 1/4];说真的= 1/2;
设置这些界限:
磅= (-0.5);乌兰巴托= [1.5,1.25];
利用目标函数 .
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 constrbreach: 0消息:“找到最佳解决方案。'算法:'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);
约束所有变量为正:
磅= 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
.这表明等式满足第二和第三个线性不等式约束:
确认这是真的:
* 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 < =
,
在哪里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
- - - - - -线性等式约束
真正的矩阵
线性等式约束,指定为实矩阵。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
作为一个稀疏向量。
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
或者一个结构optimset
的回报。
一些选项适用于所有算法,而其他选项则与特定算法相关。看到优化选择参考的详细信息。
的选项中缺少一些选项optimoptions
显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项.
所有的算法 | |
算法 |
选择优化算法:
有关选择算法的信息,请参见线性规划算法. |
诊断 | 显示关于要最小化或解决的功能的诊断信息。选择 |
|
显示水平(参见迭代显示):
|
|
允许的最大迭代次数,一个正整数。默认的是:
为 |
|
终止公差对对偶可行性,是一个正标量。默认的是:
为 |
内点算法 | |
ConstraintTolerance |
约束的可行性公差,非负标量。 为 |
进行预处理 | 算法迭代前的LP预处理级别。指定 |
对偶单纯形算法 | |
ConstraintTolerance |
可行性公差为约束条件,一个标量从 为 |
MaxTime |
算法运行的最大时间(以秒为单位)。默认值是 |
进行预处理 | 对偶单纯形算法迭代之前的LP预处理级别。指定 |
例子:选择= optimoptions(“linprog”、“算法”,“内点”,“显示”,“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(线性内点求解器,[3]),这是Mehrotra预测校正算法的一个变体[2],一种原对偶内点法。在算法开始迭代之前,会有许多预处理步骤。看到Interior-Point-Legacy线性规划.
算法的第一阶段可能涉及对约束的一些预处理(参见Interior-Point-Legacy线性规划).以下几种情况可能会导致linprog
以不可行消息退出。在每种情况下,linprog
返回一个负exitflag
,表示失败。
中检测到一行全为0
Aeq
的对应元素说真的
不为0,那么退出消息为由于不可行而退出:约束矩阵中的全零行在对应的右侧项中没有零。
的元素之一
x
发现不在以下有界,那么退出消息是由于不可行而退出:目标f'*x在以下无界。
如果其中一行
Aeq
只有一个非零元素,那么关联值在x
被称为单例变量。在这种情况下,这个分量的值x
可以从Aeq
而且说真的
.如果计算的值违反了另一个约束,则退出消息为由于不可行而退出:等式约束中的单例变量是不可行的。
如果可以求解单例变量,但解违反了上界或下界,则退出消息为
由于不可行而退出:等式约束中的单例变量不在边界内。
请注意
预处理步骤是累积的。例如,即使约束矩阵的开头没有一行全为0,其他预处理步骤也会导致出现这样一行。
当预处理结束后,算法的迭代部分开始,直到满足停止条件。(有关残差、原始问题、对偶问题和相关停止准则的更多信息,请参见Interior-Point-Legacy线性规划)。如果残差不是变小而是变大,或者残差既不变大也不变小,则分别显示以下两个终止消息之一:
到目前为止,一个或多个残差、对偶差或总相对误差比其最小值增长了100000倍:
或
一个或多个残差、对偶差或总相对误差已经停止:
在显示这些消息中的一个之后,后面会显示以下消息中的一个,表明对偶、原始或两者都是不可行的。
对偶似乎是不可行的(原始的无界)。(原始残差< OptimalityTolerance.)
原始的似乎是不可行的(而对偶是无界的)。(对偶残差< OptimalityTolerance.)
由于对偶残差>√(OptimalityTolerance),对偶似乎是不可行的(且原始无界)。(原始残差< 10*OptimalityTolerance。)
由于原始剩余>根号(OptimalityTolerance),原始似乎是不可行的(对偶无界)。(双残差< 10*OptimalityTolerance。)
由于原始目标< -1e+10和对偶目标< 1e+6,对偶似乎不可行,原始目标无界。
原始目标似乎是不可行的,而对偶目标是无界的,因为双重目标> 1e+10和原始目标> -1e+6。
原性和对偶性似乎都是不可行的。
例如,原始(目标)可以是无界的,原始残差(原始约束满意度的度量)可以很小。
内点算法
的“内点”
算法类似于“interior-point-legacy”
,但采用了更有效的因式分解程序,并采用了不同的预处理。看到内点linprog算法.
选择功能
应用程序
的优化Live Editor任务提供了一个可视化的界面linprog
.
参考文献
丹齐格,g.b., A.奥登,P.沃尔夫。线性不等式约束下线性形式最小化的广义单纯形法。太平洋数学》杂志上。1955年第5卷,第183-195页。
[2] Mehrotra, S. <关于原对偶内点法的实现>。SIAM优化期刊1992年,第2卷,第575-601页。
张勇,“在MATLAB环境下求解大规模线性规划的内点方法”。技术报告TR96-011995年7月,马里兰州巴尔的摩市巴尔的摩市马里兰大学数学与统计学系。
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。