主要内容

混合整数线性编程算法

混合整数线性编程定义

混合整数线性程序(MILP)是一个问题

  • 线性目标函数,fTx, 在哪里f是常数的列向量x列向量是未知数吗

  • 界限和线性约束,但没有非线性约束(有关定义,请参阅写约束

  • 对某些组成部分的限制x要有整数值

在数学上,给定向量f, 和UB.,矩阵一个Aeq,相应的向量b说真的,以及一组索引Intcon.,找到矢量x来解决

x f T x x Intcon. 是整数 一个 x ≤. b 一个 e x b e l b ≤. x ≤. u b

intlinprog算法

算法概述

intlinprog.使用此基本策略来解决混合整数线性程序。intlinprog.可以解决任何阶段的问题。如果它解决了舞台中的问题,intlinprog.不执行稍后的阶段。

  1. 减少问题大小使用线性程序预处理

  2. 解决一个初始松弛(非整数)问题使用线性规划

  3. 履行混合整数程序预处理加强了混合整数问题的LP松弛。

  4. 尝试削减生成进一步收紧混合整数问题的LP松弛。

  5. 尝试使用Integer可行的解决方案使用万博 尤文图斯启发式

  6. 用一个分支和绑定系统地寻找最优解的算法。该算法解决了限制整数变量可能值范围的LP松弛问题。它试图在最优目标函数值上生成一个更新的界序列。

线性程序预处理

根据这一点混合整数线性编程定义,有矩阵一个Aeq和相应的向量b说真的编码一组线性不等式和线性等式

一个 · x ≤. b 一个 e · x b e

这些线性约束限制了解决方案x

通常,减少问题中变量的数量(分量的数量)是可能的x),减少线性约束的数量。虽然执行这些缩减可能会花费解决程序的时间,但它们通常会减少解决问题的总时间,并可以解决更大的问题。该算法可以使解在数值上更加稳定。此外,这些算法有时可以检测出不可行的问题。

预处理步骤旨在消除冗余变量和约束,提高约束矩阵的模型和稀疏性的缩放,加强变量的边界,并检测模型的原始和双重不可行性。

详情请参见安徒生和安徒生[2]Mészáros和Suhl[8]

线性规划

最初的放松问题是具有相同目标和约束条件的线性规划问题混合整数线性编程定义,但没有整数约束。称呼xLP.对轻松问题的解决方案,和x用整数约束解决原始问题的解决方案。清楚地,

fTxLP.≤.fTx

因为xLP.最小化相同的功能,但限制较少。

使用线性编程解决方案技术解决了该初始释放的LP(根节点LP)和在分支和绑定算法期间的所有生成的LP松弛。

混合整数程序预处理

在混合整数程序预处理期间,intlinprog.分析线性不等式a *x≤b随着完整性限制,以确定是否:

  • 这个问题是不可行的。

  • 可以收紧一些界限。

  • 有些不平等是多余的,所以可以忽略或消除。

  • 一些不平等现象可能会加剧。

  • 一些整数变量是可以固定的。

IntegerPreprocess选项允许您选择是否intlinprog.采取几个步骤,拿走所有这些,或者几乎没有一个人。如果你包括一个X0.参数,intlinprog.在预处理中使用该值。

混合整数程序预处理的主要目的是简化随后的分支定界计算。预处理包括快速地预先检查和消除一些无用的子问题候选项,而这些子问题本来是分支和定界会分析的。

关于整数预处理的详细信息,请参见Savelsbergh[10]

削减生成

切割是额外的线性不等式约束intlinprog.增加了问题。这些不等式试图限制LP放松的可行区域,以便其解决方案更接近整数。万博 尤文图斯您控制剪切类型intlinprog.用途切割选项。

'基本的'削减包括:

  • 混合整数舍入剪裁

  • 戈梅里削减

  • Clique Cuts.

  • 包括削减

  • 流动盖切口

此外,如果问题纯粹是整数(所有变量都是整数值),那么intlinprog.还使用以下剪切:

  • 强Chvatal-Gomory削减

  • 零半切割

'中间的'削减包括所有'基本的'削减,加上:

  • 简单的升力和项目切割

  • 简单的枢轴和减少剪裁

  • Reduce-and-split削减

'先进的'削减包括所有'中间的'除了减少和分割削减外,削减,加上:

  • 强Chvatal-Gomory削减

  • 零半切割

对于纯整数问题,'中间的'使用最剪切类型,因为它使用缩小和分裂剪切,而'先进的'才不是。

另外一个选项,削减,指定次数的上限intlinprog.迭代以生成削减。

关于切割生成算法(也称为切割平面方法)的详细信息,请参见Cornuéjols[5]如果要剪小团体,请选Atamtürk、Nemhauser和Savelsbergh[3]

寻找可行解决方案的启发式方法万博 尤文图斯

为了得到目标函数的上界,分支定界程序必须找到可行点。分支定界过程中LP松弛的解可以是整数可行的,这为原MILP提供了一个改进的上界。某些技术可以更快地在分支限界之前或期间找到可行点。intlinprog.在根节点和某些分支和结合的迭代期间使用这些技术。这些技术是启发式的,这意味着它们是可以成功的算法,但也可能失败。

启发式可以是开始启发式,帮助求解器找到初始或新的整数可行解决方案。或启发式可以改进启发式,从整数可行的点开始并尝试找到更好的整数可行点,意思是具有较低目标函数值的一个。的intlinprog.改善启发式是“rin”'RSS',1-opt,2-opt和引导潜水。

设定intlinprog.启发式使用“启发式”选项。选项是:

选项 描述
'基本的'(默认)

求解器使用不同参数运行舍入启发式两次,使用不同参数运行潜水启发式两次,然后运行'RSS'.当早期启发式导致一个足够好的整数可行解时,求解器不运行后期启发式。

'中间的'

求解器使用不同参数运行两次舍入启发式,然后使用不同参数运行两次潜水启发式。如果有一个整数可行解,求解器然后运行“rin”其次是'RSS'.如果'RSS'找到一个新的解决方案,求解器运行“rin”再次。当早期启发式导致一个足够好的整数可行解时,求解器不运行后期启发式。

'先进的'

求解器使用不同参数运行两次舍入启发式,然后使用不同参数运行两次潜水启发式。如果有一个整数可行解,求解器然后运行“rin”其次是'RSS'.如果'RSS'找到一个新的解决方案,求解器运行“rin”再次。当早期启发式导致一个足够好的整数可行解时,求解器不运行后期启发式。

“rin”或同等'浸泡'

intlinprog.搜索当前最佳整数可行的解决方案点(如果可用)附近,以查找新的和更好的解决方案。看唐娜,罗斯伯格和le pape[6].当你选择“rin”,求解器以不同的参数运行两次舍入启发式,用不同的参数运行两次潜水启发式,然后运行“rin”

'RSS'或同等'RSS-DIVING'

intlinprog.应用一个混合程序组合的想法“rin”和本地分支以搜索整数可行的解决方案。万博 尤文图斯当你选择'RSS',求解器以不同的参数运行两次舍入启发式,用不同的参数运行两次潜水启发式,然后运行'RSS'.当早期启发式导致一个足够好的整数可行解时,求解器不运行后期启发式。这些设置执行相同的启发式'基本的'

“圆”

intlinprog.将LP解决方案置于节点上的轻松问题,并以试图维持可行性的方式舍入整数组件。当你选择“圆”,求解器,在根节点上,用不同的参数运行两次舍入启发式,然后用不同的参数运行两次潜水启发式。此后,求解器在某些分支和绑定节点处仅运行舍入启发式。

'圆潜水'

求解器的工作方式类似于“圆”,还在一些分支绑定节点(而不仅仅是根节点)上运行潜水启发式(除了舍入启发式)。

'潜水'

intlinprog.使用类似于分支和绑定步骤的启发式,但在不创建其他分支的情况下,只关注树的一个分支。这个单个分支导致树片段快速“潜水”,因此名称“潜水”。现在,intlinprog.按此顺序使用六次潜水启发式方法:

  • 矢量长度潜水

  • 系数潜水

  • 分数潜水

  • 伪成本潜水

  • 线路搜索潜水

  • 引导潜水(适用于求解器已经发现至少一个整数可行点)

潜水启发式通常选择一个应该是整数值的变量,当前的解决方案是小数。然后启发式引入一个界限,迫使变量为整数值,并再次解决相关的松弛LP。选择变量的方法是潜水启发式的主要区别。贝特看到[4],第3.1节。

'没有任何'

intlinprog.不搜索可行的点。求解器只是在其分支和绑定的搜索中遇到任何可行的点。

主要区别'中间的''先进的'就是它'先进的'在分支绑定迭代中更频繁地运行启发式。

除了上一表外,以下启发式速度运行启发式选项是'基本的''中间的', 或者'先进的'

  • zi round - 这种启发式运行只要算法解决了轻松的LP。启发式遍历每个分数整数变量,以尝试将其移动到相邻整数,而不会影响关于其他约束的可行性。有关详细信息,请参阅Hendel[7]

  • 1-opt - 每当算法找到新的整数可行解决方案时,这种启发式运行就会运行。启发式遍历每个整数变量,以尝试将其移动到相邻整数,而不会影响关于其他约束的可行性,同时降低目标函数值。

  • 2-opt - 只要算法查找新的整数可行解决方法,就会运行这种启发式运行。2-opt找到影响相同约束的所有整数变量对,这意味着它们在同一行中有非零条目一个或者Aeq约束矩阵。对于每一对,2-opt取一个整数可行解,并使用所有四种可能的移动(up-up, up-down, down-up,和down-down)将变量对的值向上或向下移动,寻找具有更好目标函数值的可行邻解。该算法通过计算满足约束条件的整数变量对中每个变量的最大移位量(相同大小)来测试每个整数变量对,并提高目标函数值。

在启发式阶段的开始,intlinprog.跑了不重要的启发式,除非启发式'没有任何'或者您提供了初始整数可行的点X0.论点。这个简单的启发式检查了以下几点的可行性:

  • 所有的零

  • 上限

  • 下限(如果非零)

  • “锁定”点

“锁定”点仅定义为所有变量的上界和下界有限的问题。每个变量的“锁定”点是它的上界或下界,如下选择。为每一个变量j,计算线性约束矩阵中的相应正条目的数量A(:,j)并减去相应的负条目的数字。如果结果为正,则使用该变量的下限,磅(j).否则,使用该变量的上界,乌兰巴托(j).“锁定”点试图为每个变量满足最大数量的线性不等式约束,但不一定可行。

每次启发式解决方案完成后,intlinprog.调用输出函数和绘图函数。看intlinprog输出函数和绘图函数语法

如果你包括一个X0.参数,intlinprog.使用该值“rin”并引导潜水启发式,直到找到一个更好的整数可行点。所以当你提供X0.,您可以通过设置良好的结果来设置“启发式”选项'浸泡'或者使用的另一个设置“rin”

分支和绑定

分枝定界方法构造了一系列子问题,这些子问题试图收敛到MILP的一个解。这些子问题给出了解的上界和下界序列fTx.第一上限是任何可行的解决方案,第一个下限是对松弛问题的解决方案。有关上限的讨论,请参阅寻找可行解决方案的启发式方法万博 尤文图斯

如上所述线性规划,线性编程放宽问题的任何解决方案都比对MILP的解决方案较低的目标函数值。此外,任何可行的点x欺骗满足

fTx欺骗fTx

因为fTx是所有可行点中的最小值。

在这种情况下,a节点是一个具有与原始问题相同的目标函数,边界和线性约束的LP,但没有整数约束,并且对线性约束或界限有特定的更改。的根节点是没有整数约束的原始问题,没有改变线性约束或界限,这意味着根节点是初始放松的LP。

从起始界限,分支和绑定方法通过从根节点分支来构造新的子问题。根据几种规则之一,分支步骤是启发式的。每个规则基于通过将一个变量限制为小于或等于整数J,或大于或等于J + 1来基于分离问题的想法。这两个子问题在进入时出现xLP.,对应于INTCON中指定的整数,不是整数。这里,xLP.是一个轻松问题的解决方案。取J为变量的底(四舍五入),取J+1为变量的顶(四舍五入)。由此产生的两个问题的解大于或等于万博 尤文图斯fTxLP.,因为他们有更多的限制。因此,该过程可能提高下限。

分支和绑定方法的性能取决于选择要拆分的变量(分支规则)的规则。该算法使用这些规则,您可以在其中设置BranchRule选择:

  • 'maxpscost'- 选择具有最大值的分数变量伪心

    伪心

  • 'strondpscost'- 如同'maxpscost',但代替伪初始化的pseudocost1对于每个变量,求解器仅在伪逻辑上有更可靠的估计后尝试在变量上分支。要获得更可靠的估计,请执行以下操作(参见Achterberg,Koch和Martin[1]).

    • 通过其当前基于Pseudocost的分数命令所有潜在的分支变量(目前分数但应该是整数的那些)。

    • 根据当前分支变量运行两个轻松的线性程序,从变量开始,得分最高(如果变量尚未用于分支计算)。求解器使用这两个解决方案来更新当前分支变量的伪函数。万博 尤文图斯求解器可以尽早停止此过程,以节省选择分支的时间。

    • 继续在列表中选择变量,直到当前基于最高的基于Pseudocost的分数不会改变k连续变量,k是一个内部选择的值,通常在5到10之间。

    • 在基于伪成本的分数最高的变量上进行分支。在早期的伪成本估计过程中,求解器可能已经根据这个变量计算了松弛线性规划。

    由于额外的线性程序解决方案,每次迭代万博 尤文图斯'strondpscost'分支需要长于默认值'maxpscost'.但是,分支和结合的迭代的数量通常会降低,所以'strondpscost'方法可以节省整体时间。

  • '可靠性'- 如同'strondpscost',而不是只对未初始化伪代价分支运行松弛线性程序,'可靠性'运行程序K2每个变量的时间,在哪里K2是一个小整数,如4或8。因此,'可靠性'有更慢的分支,但可能更少的分支绑定迭代,与'strondpscost'

  • '大多数人'- 选择最接近的分数部分的变量1/2

  • 'maxfun'- 选择目标向量中具有最大相应绝对值的变量f

在算法分支之后,有两个新的节点需要探索。该算法使用以下规则之一在所有可用节点中选择要探索的节点:

  • 'minobj'—选择目标函数值最小的节点。

  • 'mininfeas'- 选择具有最小整数的节点的节点。这对于每个整数不可行的组件都是手段x)在节点中,添加更小的p- - - - - -p+, 在哪里

    p- - - - - -x) - ⌊x)⌋
    p+= 1 -p- - - - - -

  • 'simplebestproj'- 选择节点最佳预测

    最佳投影

intlinprog.通过考虑原问题的信息,如目标函数的最大公约数(GCD),跳过了一些子问题的分析。

分支和绑定的过程继续,系统地生成子问题,以分析和丢弃不会改善目标上或下限的那些,直到满足其中一个停止标准:

  • 算法超过MaxTime选项。

  • 目标函数下限和上限之间的差异小于AbsoluteGapTolerance或者RelativeGapTolerance公差。

  • 探索节点的数量超过了maxNodes.选项。

  • 整数可行点的数量超过了MaxFeasiblePoints.选项。

有关分支和绑定程序的详细信息,请参阅NemhaUser和Wolsey[9]和Wolsey.[11]

参考文献

阿赫特伯格,T. T.科赫和A.马丁。分支规则重新审视。运营研究信件33,2005,第42-54页。可用AT.https://www-m9.ma.tum.de/downloads/felix-klein/20b/achterbergkochmartin-branchingrulesrevisited.pdf.

[2]安德森,E. D.和Andersen,K。D.预定线性规划。数学编程71,PP。221-245,1995。

[3]Atamtürk,A.,G.L.L.Nemhauser,M.W.P.Velsbergh。解决整数规划问题的冲突图。欧洲运营研究杂志121,2000,pp。40-55。

[4] Berthold,T.混合整数程序的原始启发法。TechnischenUniversität柏林,2006年9月。提供https://www.zib.de/groetschel/students/diplom-berthold.pdf.

[5]Cornuéjols,G.混合整数线性规划的有效不等式。数学规划B, Vol. 112, pp. 3-44, 2008。

[6]唐娜,E.,Rothberg,E.,Le Pape,C.探索放松诱导的社区,以改善MIP解决方案。万博 尤文图斯数学编程,卷。102,第1页,第71-90,2005。

[7] Hendel,G。混合整数规划的新舍入和传播启发式。学士学位在TechnischeUniversitätBerlin,2011年。PDF可用https://opus4.kobv.de/opus4-zib/files/1332/bachelor_thesis_main.pdf.

[8] Mészáros C.和苏尔,U. H.。用于线性和二次编程的先进预处理技术。或光谱,25(4),PP。575-595,2003。

[9] Nemhauser,G. L.和Wolsey,L. A.整数和组合优化。Wiley-Interscience,纽约,1999。

[10]萨维尔伯格,M. W.P。混合整数规划问题的预处理和探测技术。orsa J. Computing,Vol。6,4,PP。445-454,1994。

[11] Wolsey,L. A.整数规划。Wiley-Interscience,纽约,1998年。