线性规划算法
线性规划的定义
线性规划是寻找一个向量的问题
使下列一项或多项成立:
·x≤
Aeq·x=
l≤
内点linprog算法
的“内点”
算法非常类似<一个href="//www.ru-cchi.com/help/optim/ug/quadratic-programming-algorithms.html" class="a">interior-point-convex quadprog算法.它也有许多与“interior-point-legacy”
算法。这些算法有相同的总体轮廓:
即将问题简化并转化为标准形式。
生成一个初始点。初始点的选择对于有效求解内点算法尤为重要,这一步骤非常耗时。
用预测-校正迭代法求解KKT方程。这一步通常是最耗时的。
Presolve
该算法首先试图通过删除冗余和简化约束来简化问题。在presolve步骤中执行的任务包括:
检查变量是否有相等的上界和下界。如果是,检查其可行性,然后修复和删除变量。
检查是否任何线性不等式约束只涉及一个变量。如果是,检查其可行性,然后将线性约束更改为一个边界。
检查是否任何线性等式约束只涉及一个变量。如果是,检查其可行性,然后修复并删除该变量。
检查线性约束矩阵是否有零行。如果是,检查其可行性,然后删除这些行。
确定边界和线性约束是否一致。
检查是否有变量只在目标函数中作为线性项出现而不出现在任何线性约束中。如果是,检查可行性和有界性,然后将变量固定在适当的边界上。
通过添加松弛变量,将任何线性不等式约束更改为线性等式约束。
如果算法检测到一个不可行的或无界的问题,它将停止并发出适当的退出消息。
算法可能会到达一个单一可行点,这个点代表解。
如果算法在求解步骤中没有检测到不可行的或无界问题,并且如果求解步骤没有产生解,则算法继续进行下一步。在达到停止条件后,算法重构原问题,撤销任何解变换。最后一步是后解步骤。
为简单起见,如果在求解步骤中没有解决问题,算法将所有有限下界移为零。
生成初始点
要设置起始点,
初始化
x0来 的(n, 1),在那里 n目标函数向量的元素个数是多少 f. 将所有有界分量转换为下界为0。如果组件
我有一个有限的上界吗 u(我),然后 x0 (i) = u / 2. 对于只有一个边界的组件,如果有必要,可以修改该组件,使其严格位于边界内。
把
x0靠近中心路径,执行一个预测-校正步骤,然后修改结果位置和松弛变量,使其位于任何边界内。关于中心路径的细节,请参见Nocedal和Wright<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[7], 397页。
预估
类似于
现在假设所有变量都至少有一个有限界。如果有必要,通过移动和否定组件,这个假设意味着所有
x组件的下界为0。 是扩展的线性矩阵,它包含线性不等式和线性等式。<年代p一个ncl一个年代年代="inlineequation"> 是相应的线性等式向量。<年代p一个ncl一个年代年代="inlineequation"> 还包括扩展向量的术语
x与松弛变量 年代将不平等约束转化为平等约束: 在哪里
x0意味着原 x向量。 t是将上界转换为等式的松弛向量。
该系统的拉格朗日量包含以下向量:
y,与线性等式相关的拉格朗日乘子
v,与下界相关的拉格朗日乘子(正性约束)
w,与上界相关的拉格朗日乘子
拉格朗日是
因此,该系统的KKT条件为
的λ
.
该算法首先根据Newton-Raphson公式预测步长,然后计算校正步长。该校正器试图减小非线性互补方程中的残差<年代p一个ncl一个年代年代="inlineequation">年代<年代ub>我z<年代ub>我= 0.牛顿-拉弗森阶是
(1) |
在哪里
r<年代ub>d,对偶残差
r<年代ub>p,原始残差
r<年代ub>乌兰巴托,上限残差
r<年代ub>vx,下界互补残差
r<年代ub>wt,上限互补残差
迭代显示报告了这些量:
来解决<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程1,首先将其转换为对称矩阵形式
(2) |
在哪里
定义中的所有矩阵逆
获得<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程2从<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程1,注意第二行<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程2是否与矩阵的第二行相同<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程1.第一行<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程2来自于解的最后两行<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程1对于Δ
方程2是对称的,但它不是正定的,因为-
第二组行<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程2是
第一组行是
替换
给了
(3) |
通常,求牛顿阶的最有效方法是求解<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程3对于Δ
更多算法细节,参见Mehrotra<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[6].
在计算修正的牛顿步长后,算法执行更多的计算,以获得更长的当前步长,并为更好的后续步长做准备。这些多次校正计算可以提高性能和鲁棒性。详情请参见gonzio<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[4].
预测-校正算法与完整的算法大致相同“interior-point-convex”
版本,除了二次项。看到<一个href="//www.ru-cchi.com/help/optim/ug/quadratic-programming-algorithms.html" class="a">完整的预估.
停止条件
预测-校正算法迭代,直到它达到一个可行的点(满足公差内的约束)和相对步长较小。具体来说,定义
当满足所有这些条件时,算法停止:
在哪里
r<年代ub>c实质上是衡量互补残差的大小
Interior-Point-Legacy线性规划
简介
内部点遗留方法是基于<一个cl一个年代年代="indexterm" name="d124e34915">LIPSOL (<一个href="//www.ru-cchi.com/help/optim/ug/selected-bibliography.html" class="a">[52])的变体<一个cl一个年代年代="indexterm" name="d124e34920">Mehrotra预测-校正算法(<一个href="//www.ru-cchi.com/help/optim/ug/selected-bibliography.html" class="a">[47]),一个<一个cl一个年代年代="indexterm" name="d124e34925">内点方法。
主要算法
该算法首先应用一系列的<一个cl一个年代年代="indexterm" name="d124e34934">预处理步骤(见<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">预处理).经过预处理,问题有了形式
(4) |
上界约束隐式地包含在约束矩阵中
(5) |
这被称为<年代p一个ncl一个年代年代="emphasis">原始的问题:
(6) |
在哪里
(7) |
在哪里
的λ
.
二次方程<年代p一个ncl一个年代年代="inlineequation">x<年代ub>我z<年代ub>我= 0而且<年代p一个ncl一个年代年代="inlineequation">年代<年代ub>我w<年代ub>我= 0被称为“<年代p一个ncl一个年代年代="emphasis">互补线性规划的条件;其他(线性)方程称为<一个cl一个年代年代="indexterm" name="d124e35041">可行性条件。的数量
x<年代up>Tz+
是<年代p一个ncl一个年代年代="emphasis">二元性的差距的互补部分的残差
算法是一个<年代p一个ncl一个年代年代="emphasis">非算法,即原程序和对偶程序同时求解。它可以被认为是一种类似牛顿的方法,应用于线性二次方程组<年代p一个ncl一个年代年代="inlineequation">F(
该算法是<一个cl一个年代年代="indexterm" name="d124e35100">Mehrotra提出的预测校正算法。考虑一个迭代<年代p一个ncl一个年代年代="inlineequation">v= (
这是牛顿方向;那么所谓的<年代p一个ncl一个年代年代="emphasis">校正器方向
在哪里<年代p一个ncl一个年代年代="inlineequation">μ> 0被称为<年代p一个ncl一个年代年代="emphasis">定心参数,必须仔细选择。<年代p一个ncl一个年代年代="inlineequation">
0 - 1向量是否与二次方程对应
步长参数在哪里
v<年代up>+= (
满足
[
在求解前面的预测器/校正器方向时,算法在的Cholesky因子的修改上计算一个(稀疏的)直接因子分解<年代p一个ncl一个年代年代="inlineequation">一个?<年代up>T.如果低密度脂蛋白
函数引用页面。)
然后,算法循环,直到迭代收敛。主要停止标准为:
在哪里
分别为原始残差、对偶残差和上限可行性(<年代p一个ncl一个年代年代="inlineequation">{
原始和双重客观价值之间的区别是什么<年代p一个ncl一个年代年代="emphasis">托尔是一些宽容。和在<一个cl一个年代年代="indexterm" name="d124e35257">停止准则测量在最优条件下的总相对误差<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程7.
衡量原始不可行性的方法是<年代p一个ncl一个年代年代="inlineequation">||
预处理
该算法首先试图通过删除冗余和简化约束来简化问题。在presolve步骤中执行的任务包括:
检查变量是否有相等的上界和下界。如果是,检查其可行性,然后修复和删除变量。
检查是否任何线性不等式约束只涉及一个变量。如果是,检查其可行性,然后将线性约束更改为一个边界。
检查是否任何线性等式约束只涉及一个变量。如果是,检查其可行性,然后修复并删除该变量。
检查线性约束矩阵是否有零行。如果是,检查其可行性,然后删除这些行。
确定边界和线性约束是否一致。
检查是否有变量只在目标函数中作为线性项出现而不出现在任何线性约束中。如果是,检查可行性和有界性,然后将变量固定在适当的边界上。
通过添加松弛变量,将任何线性不等式约束更改为线性等式约束。
如果算法检测到一个不可行的或无界的问题,它将停止并发出适当的退出消息。
算法可能会到达一个单一可行点,这个点代表解。
如果算法在求解步骤中没有检测到不可行的或无界问题,并且如果求解步骤没有产生解,则算法继续进行下一步。在达到停止条件后,算法重构原问题,撤销任何解变换。最后一步是后解步骤。
为了简单起见,算法将所有下界都移为零。
虽然这些预处理步骤可以大大加快算法的迭代部分,但如果<一个cl一个年代年代="indexterm" name="d124e35306">需要拉格朗日乘子,预处理步骤必须取消,因为在算法中计算的乘子是针对转换后的问题,而不是原始问题。因此,如果乘数是<年代p一个ncl一个年代年代="emphasis">不如果请求,则不计算此转换返回,并且可能在计算上节省一些时间。
对偶单纯形算法
在较高的水平上对偶单纯形的
算法本质上执行了一个单纯形算法
算法首先进行预处理,如<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">预处理.详情请参见安徒生<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[1]Nocedal和Wright<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[7]第13章。这种预处理将原来的线性规划问题简化为<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程4:
一个而且
原始可行性可以用<年代up>+函数
衡量原始不可行性的方法是
在解释<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">方程6对偶问题就是求向量
的λ
.
双重不可行性的衡量标准是
这是众所周知的(例如,参见。<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[7])对偶问题的任何有限解都是原问题的一个解,原问题的任何有限解都是对偶问题的一个解。此外,如果原问题或对偶问题中有一个是无界的,那么另一个问题也是不可行的。如果原问题或对偶问题中有一个不可行,那么另一个问题要么不可行,要么无界。因此,如果存在有限解,这两个问题在获得有限解方面是等价的。由于原问题和对偶问题在数学上是等价的,但计算步骤不同,因此通过求解对偶问题可以更好地解决原问题。
为了帮助减轻退化(参见Nocedal和Wright<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[7],第366页),对偶单纯形算法从扰动目标函数开始。
对偶单纯形算法的第1阶段是寻找对偶可行点。该算法通过解决一个辅助线性规划问题来实现这一点。
在阶段2中,求解器重复选择一个进入变量和一个离开变量。该算法根据Forrest和Goldfarb提出的技术选择一个离开变量<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[3]称为双最陡边缘定价。该算法利用Koberstein提出的Harris比值检验的变异来选择输入变量<一个href="//www.ru-cchi.com/help/optim/ug/linear-programming-algorithms.html" class="intrnllnk">[5].为了帮助减轻简并性,算法可以在阶段2中引入额外的扰动。
求解器迭代,试图保持对偶可行性同时减少原始不可行性,直到减少的扰动问题的解既原始可行又对偶可行。该算法消除了它引入的扰动。如果(摄动问题的)解对于未摄动(原始)问题是对偶不可行的,则求解器使用原始单纯形或阶段1算法恢复对偶可行性。最后,求解器展开预处理步骤,返回原始问题的解。
基本变量和非基本变量
本节定义术语<年代p一个ncl一个年代年代="emphasis">基础,<年代p一个ncl一个年代年代="emphasis">nonbasis,<年代p一个ncl一个年代年代="emphasis">基本可行的解决方案对于线性规划问题。该定义假设问题以以下标准形式给出:
(注意,
如果
参考文献
安徒生,E. D.和K. D.安徒生。
[2]阿普尔盖特,D. L, R. E.比克斯比,V. Chvátal和W. J.库克,
[3]福雷斯特,J. J.和D.戈德法布。
[4] Gondzio J. "线性规划的原对偶方法中的多重中心性修正"。https://www.maths.ed.ac.uk/~gondzio/software/correctors.ps
.
[5] Koberstein,。
[6] Mehrotra, S. <关于原对偶内点法的实现>。
[7]诺西德尔,J.和S. J.赖特。