求解线性规划问题
线性规划求解器
找到最低指明的问题
f,x,b,说真的,磅和UB是矢量,和一个和Aeq是矩阵。
请注意
linprog
仅适用于基于解算器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或求解器为基础的方法.
您可以导入问题
使用从MPS文件结构mpsread
.您还可以创建一个问题
结构的OptimizationProblem
对象的使用prob2struct
.
解一个由线性不等式定义的简单线性规划。
对于这个例子,使用这些线性不等式约束:
A = [1 1 1 1 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 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 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 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,选项)
找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
X =2×10.1875 1.2500
linprog
此示例演示如何使用基于问题的方法设置问题,然后使用基于求解器的方法解决问题。问题是
创建一个OptimizationProblem
对象命名概率
来表示这个问题。
x = optimvar (“x”,“下界”, 1“UpperBound”, 1.5);y = optimvar (“是的”,“下界”1/2,“UpperBound”,1.25); prob=优化问题(“目标”,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消息:“找到最佳解决方案”。算法:“双单纯形”firstorderopt:0
返回fval
是负的,尽管解的分量是正的。在内部,prob2struct
将最大化问题转化为目标函数负的最小化问题。看到最大化目标.
其中的组成部分溶胶
对应哪个优化变量?检查变量
的属性概率
.
问题变量
ans=带字段的结构:x: [1 x1 optim.problemdef。y: [1x1 optimi .problemdef.OptimizationVariable]
如你所料,溶胶(1)
对应于x
和溶胶(2)
对应于y
.看到算法.
计算用于一个简单的线性程序的溶液和目标函数值。
不等式约束为
A = [1 1 1 1 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 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
输出=带字段的结构:迭代次数:1:0消息:“找到最佳解决方案”。算法:“双单纯形”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 = [];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×1一
lambda.ineqlin
第二个和第三个分量是非零的吗x
.这表明第二、三线性不等式约束满足等式:
检查这是否正确:
A*x
ans=3×1-12.0000 42.0000 30.0000
兰博达酒店
第一个分量是不是非零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
通过输入以下约束指定不等式。
A = [1,2; 3,4; 5,6];B = [10; 20; 30]。
例子:要指定x分量加起来在1以下,取A =酮(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];说真的=(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
通过输入以下约束指定不等式。
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(我)> =磅(我)
对所有人我
.
如果元素个数(磅)<元素个数(f)
,然后磅
指定
x(我)> =磅(我)
为1<=i<=numel(磅)
.
在这种情况下,解决者发出警告。
例子:要指定所有x分量都是正数,请使用磅= 0(大小(f))
.
数据类型:双
UB
- - - - - -上界上界,指定为实向量或实数组。如果长度f
等于……的长度UB
,然后UB
指定
X(ⅰ)<= UB(I)
对所有人我
.
如果numel(UB)
UB
指定
X(ⅰ)<= UB(I)
为1 <= I <= numel(ub)
.
在这种情况下,解决者发出警告。
例子:指定所有x分量小于1
使用乌兰巴托= 1(大小(f))
.
数据类型:双
选项
- - - - - -优化选项optimoptions
|结构优化集
返回的输出,指定为优化选项optimoptions
或者一个结构优化集
回报。
有些选项适用于所有算法,有些则与特定算法相关。看到优化选项参考的详细信息。
控件中缺少一些选项optimoptions
展示。这些选项出现在以下表中斜体字。有关详细信息,请参阅查看选项.
所有算法 | |
算法 |
选择优化算法:
有关选择算法的信息,请参见线性规划算法. |
诊断 | 显示关于要最小化或解决的函数的诊断信息。选择 |
|
显示水平(见迭代显示):
|
|
允许的最大迭代次数,一个正整数。默认的是:
为 |
|
对偶可行性的终止容限,一个正标量。默认的是:
为 |
内点算法 | |
ConstraintTolerance |
可行性容忍的限制,从标 为 |
进行预处理 | 算法迭代前LP预处理水平。指定 |
双单工算法 | |
ConstraintTolerance |
可行性容忍的限制,从标 为 |
MaxTime |
算法运行的最大时间(以秒为单位)。默认值是 |
进行预处理 | 对偶单纯形算法迭代前LP预处理水平。指定 |
例子:选择= optimoptions(“linprog”、“算法”,“内点”,“显示”,“iter”)
问题
- - - - - -问题结构问题结构,指定为具有以下字段的结构。
字段名 | 条目 |
---|---|
|
线性目标函数向量f |
|
线性不等式约束的矩阵 |
|
线性不等式约束向量 |
|
线性等式约束的矩阵 |
|
线性等式约束的向量 |
磅 |
下界向量 |
UB |
上界的矢量 |
|
“linprog” |
|
选择创建optimoptions |
你必须至少提供求解器
在现场问题
结构体。
数据类型:结构
x
-解决方案解,返回实向量或实数组。的大小x
相同的尺寸f
.
fval
-目标函数在解处的值在该解决方案的目标函数值,返回一个实数。一般来说,fval
=f'*x
.
exitflag
- 原因linprog
停了下来原因linprog
已停止,作为整数返回。
|
这个解相对于相对值是可行的 |
|
函数收敛到一个解 |
|
超过迭代次数 |
|
没有找到可行的点。 |
|
问题是无限的。 |
|
|
|
原始问题和对偶问题都是不可行的。 |
|
搜索方向太小。无法取得进一步进展。 |
|
解决了可行性。 |
Exitflags3.
和-9
与具有很大不可行性的金宝搏官方网站解决方案相关。这些通常是由具有较大条件数的线性约束矩阵或具有较大解分量的问题产生的。为了纠正这些问题,尝试缩放系数矩阵,消除冗余的线性约束,或给变量更严格的界限。
输出
- 关于优化过程的信息有关优化过程的信息,作为带有这些字段的结构返回。
迭代 |
迭代次数 |
算法 |
采用优化算法 |
CG迭代 |
0(只包含内部点算法,用于向后兼容) |
消息 |
退出消息 |
违反合同 |
的约束函数最大 |
firstorderopt |
一阶最优性测量 |
有关描述,请参见双单工算法.
的“内点遗留”
基于线性内点求解器(Linear Interior Point Solver,[3]),这是梅赫罗特拉的预测-校正算法的一个变体[2],一个偶内点法。发生一些预处理步骤的算法开始迭代之前。看到内点线性规划.
算法的第一阶段可能涉及一些约束的预处理(参见内点线性规划).有几种情况可能导致linprog
以不可行消息退出。在每种情况下,linprog
返回负数exitflag
,表示表示失败。
如果在中检测到一行全零Aeq
,但说真的
如果不为零,则退出消息为
由于不可行而退出:约束矩阵中的全零行在相应的右手边项中没有零。
如果元素之一x
被发现,但将在下面限定,则退出消息是
由于不可行性退出:目标F'* x是无界的下方。
如果行之一Aeq
只有一个非零元素,那么关联的值在x
被称为独生子多变的。在这种情况下,的分量的值x
可根据Aeq
和说真的
.如果计算的值违反了另一个约束,则退出消息为
由于不可行而退出:等式约束中的单例变量是不可行的。
如果单例变量可以被解出,但是解违反了上限或下限,那么退出消息是
由于不可行而退出:等式约束中的单例变量不在范围内。
请注意
预处理步骤是累积的。例如,即使约束矩阵不是以全零开头的行,其他预处理步骤也可能导致出现这样的行。
当预处理完成后,算法开始迭代,直到满足停止准则。(有关残差、原问题、对偶问题和相关停止准则的更多信息,请参阅内点线性规划)如果残差不是变小而是在增长,或者残差既不是在增长也不是在收缩,则分别显示以下两条终止消息之一,
一个或多个残差、对偶间隙或总相对误差已增长到其最小值的100000倍以上:
或
一个或多个残差、对偶间隙或总相对误差停止:
在显示这些消息之一之后,后面跟着下列消息之一,表示对偶、原始或两者都是不可行的。
对偶似乎是不可行的(原始无界)。(原始剩余<最优耐受。)
原初似乎是不可行的(和双无界)。(双残余
双似乎是不可行的(和原始无界),因为双残余> SQRT(OptimalityTolerance)。(太极残余<10 * OptimalityTolerance。)
原初似乎是不可行的(和双无界),因为原始的残留> SQRT(OptimalityTolerance)。(双残余<10 * OptimalityTolerance。)
双似乎是不可行的,因为原始目标<-1e + 10和双重目标<1E + 6的原始的无界的。
由于双目标> 1e+10和原目标> -1e+6,原目标出现不可行和对偶无界。
原始的和二元的似乎都是不可行的。
例如,原始(目标)可以是无界的,原始残差(原始约束满足的度量)可以很小。
的“内点”
算法类似于“内点遗留”
,但更有效的分解程序,并用不同的预处理。看到内点linprog算法.
的优化活动编辑器任务为linprog
.
[1]丹,G.B.,A.奥登和P.沃尔夫。“广义单纯形法最小化线性表线性不等式约束。”太平洋数学》杂志上。1955年第5卷,第183-195页。
[2] 关于原始-对偶内点法的实现SIAM优化学报, 1992年第2卷,575-601页。
[3] Zhang,Y.,“在MATLAB环境下用内点法求解大型线性规划。”技术报告TR96-01,数学与统计,美国马里兰大学巴尔的摩县,马里兰州巴尔的摩市,1995年7月系。
你点击一个链接对应于这个MATLAB命令:
在MATLAB命令窗口中输入它来运行命令。Web浏览器不支持MATLAB命令。金宝app
您还可以从以下列表中选择网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。