主要内容

混合整数线性规划算法

混合整数线性编程定义

混合整数线性规划(MILP)是一个具有

  • 线性目标函数,FT.X, 在哪里F是常数的柱矢量,还有X列向量是未知数吗

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

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

用数学术语来说,给定的向量F, 和乌兰巴托,矩阵一种AEQ.,相应的向量B.贝卡,以及一组索引intcon,找到一个向量X解决

X F T. X 受到约束 { X intcon 是整数 一种 X B. 一种 E. 问: X = B. E. 问: L. B. X 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用整数约束解决原始问题的解决方案。清楚地,

FT.XLP.FT.X

因为XLP.最小化相同的函数,但限制较少。

该初始松弛LP(根节点LP)和分支定界算法期间生成的所有LP松弛都使用线性规划求解技术进行求解。

混合整数程序预处理

在混合整数程序预处理过程中,intlinprog.分析线性不平等a *x≤b以及完整性限制,以确定是否:

  • 问题是不可行的。

  • 有些界限可以收紧。

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

  • 可以加强一些不平等。

  • 可以修复某些整数变量。

IntegerPreprocess选项允许您选择是否intlinprog.采取几个步骤,全部采取,或者几乎不采取任何步骤。如果包括X0.参数,intlinprog.在预处理中使用该值。

混合整数程序预处理的主要目标是简化随后的分支和绑定计算。预处理涉及快速激活并消除分支和绑定否则分析的一些徒劳的候选人。

整数预处理请参见Savelsbergh[10]

削减生成

削减是额外的线性不等式约束intlinprog.增加了问题。这些不等式试图限制LP放松的可行区域,以便其解决方案更接近整数。金宝搏官方网站您控制剪切类型intlinprog.用途割代选择。

'基本的'削减包括:

  • 混合整数舍入剪裁

  • 戈梅里削减

  • Clique Cuts.

  • 盖削减

  • 流动盖切口

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

  • 强大的雪橇 - 戈梅里削减

  • 零半切割

“中级”削减包括所有'基本的'削减,加上:

  • 简单提升和项目切割

  • 简单的支点和减少削减

  • 减少和分裂削减

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

  • 强大的雪橇 - 戈梅里削减

  • 零半切割

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

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

有关剪切生成算法的详细信息(也称为切割平面方法),请参阅Cornuéjols[5]至于拉帮结派,请登录Atamtürk、Nemhauser和Savelsbergh[3]

寻找可行解决方案的启发式方法金宝搏官方网站

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

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

设定intlinprog.启发式使用“启发式”选项这些选择包括:

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

求解器以不同的参数运行两次舍入式启发式,运行潜水启发式两次用不同的参数运行,然后运行'RSS'。当早期启发式机会导致足够良好的整数可行解决方案时,求解器不会运行。

“中级”

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

'先进的'

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

'rins'或者等价物“漂流潜水”

intlinprog.搜索当前最佳整数可行解点(如果可用)的邻域,以找到新的更好的解。见Danna、Rothberg和Le Pape[6]。当你选择'rins',解算器使用不同参数运行两次舍入启发式,使用不同参数运行两次潜水启发式,然后运行'rins'

'RSS'或者等价物'RSS-DIVING'

intlinprog.应用混合程序,结合来自'rins'和本地分支以搜索整数可行的解决方案。金宝搏官方网站当你选择'RSS',解算器使用不同参数运行两次舍入启发式,使用不同参数运行两次潜水启发式,然后运行'RSS'. 当较早的启发式导致足够好的整数可行解时,解算器不会运行较晚的启发式。这些设置执行的启发式与'基本的'

'圆形的'

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

'圆潜水'

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

'潜水'

intlinprog.使用类似于分支和绑定步骤的启发式,但只遵循树的一个分支,而不创建其他分支。这根树枝会快速“俯冲”到树上的碎片上,因此被称为“俯冲”,intlinprog.按以下顺序使用六种潜水启发法:

  • 矢量长度潜水

  • 系数潜水

  • 分段跳水

  • 伪成本跳水

  • 线路搜索潜水

  • 引导潜水(当解算器已找到至少一个整数可行点时适用)

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

'没有任何'

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

主要区别“中级”'先进的'是吗'先进的'在分支和绑定的迭代期间更频繁地运行启发式。

除了上一个表之外,当启发式选项是'基本的'“中级”'先进的'

  • ZI round-每当算法解一个松弛的LP时,该启发式算法就会运行。启发式算法遍历每个分数整数变量,试图将其移动到相邻整数,而不影响其他约束的可行性。有关详细信息,请参见亨德尔[7]

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

  • 2-opt - 只要算法查找新的整数可行解决方法,就会运行这种启发式运行。2-opt找到影响相同约束的所有整数变量对,这意味着它们在同一行中有非零条目一种AEQ.约束矩阵。对于每对,2-opt采用整数可行的解决方案,并使用所有四个可能的移动(上升,上下,下降和下降)向上或向下移动变量对的值具有更好的客观函数值的可行性邻接解决方案。该算法通过计算满足约束的对中的每个变量的每个变量的最大尺寸(相同幅度)来测试每个整数变量对。

在启发式阶段开始时,intlinprog.运行琐碎的启发式,除非启发式'没有任何'或者,在X0.论点。简单的启发式检查以下几点的可行性:

  • 所有零

  • 上限

  • 下限(如果非零)

  • “锁定”点

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

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

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

分支和绑定

分支和绑定方法构造一系列试图收敛到MILP的解决方案的子问题。子问题在解决方案上给出了一系列上限和下限FT.X. 第一个上界是任何可行解,第一个下界是松弛问题的解。有关上限的讨论,请参见寻找可行解决方案的启发式方法金宝搏官方网站

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

FT.X欺骗FT.X

因为FT.X是所有可行点中的最小值。

在这方面,一个节点是一个LP,其目标函数、边界和线性约束与原始问题相同,但没有整数约束,并且对线性约束或边界进行了特殊更改。这个根节点是没有整数约束的原始问题,没有改变线性约束或界限,这意味着根节点是初始放松的LP。

从起始界限,分支和绑定方法通过从根节点分支来构造新的子问题。根据几种规则之一,分支步骤是启发式的。每个规则基于通过将一个变量限制为小于或等于整数J,或大于或等于J + 1来基于分离问题的想法。这两个子问题在进入时出现XLP.,对应于INTCON中指定的整数,不是整数。这里,XLP.是一个放松问题的解决方案。将j作为变量的地板(圆形向下),J + 1作为天花板(圆形)。由此产生的两个问题具有大于或等于的解决方案金宝搏官方网站FT.XLP.,因为他们有更多的限制。因此,该过程可能提高下限。

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

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

    伪心

  • “strongpscost”-近似'maxpscost',而不是初始化为的伪成本1对于每个变量,求解器仅在伪逻辑上有更可靠的估计后尝试在变量上分支。要获得更可靠的估计,请执行以下操作(参见Achterberg,Koch和Martin[1])。

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

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

    • 继续在列表中选择变量,直到当前最高的基于伪成本的分数没有更改K.连续变量,K.是一个内部选择的值,通常在5到10之间。

    • 具有最高的基于Pseudocost的分数的变量。在较早的伪估计过程中,求解器可能已经基于该变量基于该变量计算了松弛线性程序。

    由于额外的线性程序解决方案,每次迭代金宝搏官方网站“strongpscost”分支花费的时间比默认值长'maxpscost'。但是,分支和结合的迭代的数量通常会降低,所以“strongpscost”方法总体上可以节省时间。

  • '可靠性'-近似“strongpscost”,但而不是仅为未初始化的伪分支运行轻松的线性程序,而不是运行轻松的线性程序,'可靠性'将程序运行到K2每个变量的时间,其中K2是一个小整数,如4或8。因此,'可靠性'有更慢的分支,但可能更少的分支绑定迭代,与“strongpscost”

  • “大部分部分”- 选择最接近的分数部分的变量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.科赫和A.马丁。分支规则重新审视。运筹学通讯332005,第42-54页。可在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。解决整数规划问题中的冲突图。《欧洲运筹学杂志》1212000,第40-55页。

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

[5] 科努约尔斯,G。混合整数线性程序的有效不等式。数学规划B,第112卷,第3-44页,2008。

[6]唐娜,E.,Rothberg,E.,Le Pape,C.探索放松诱导的社区,以改善MIP解决方案。金宝搏官方网站数学编程,卷。102,第1页,第71-90,2005。

[7] 亨德尔,G。混合整数规划的新舍入和传播启发式。柏林理工大学学士学位论文,2011年。PDF可在https://opus4.kobv.de/opus4-zib/files/1332/bachelor_thesis_main.pdf.

[8] Mészáros C。用于线性和二次编程的先进预处理技术。或光谱,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年。