Answers:
尽管混合整数线性规划(MILP)确实是NP完全的,但存在混合整数线性规划的可解决(非平凡)实例。
NP-complete表示混合整数线性规划为:
a)可在不确定的图灵机上求解多项式时间(NP部分)
b)可简化为3-SAT的多项式时间(完整的部分;对于其余的讨论,这部分实际上并不重要)
实际上,由于我们没有不确定的图灵机,也无法编写执行类似操作的算法,因此,“多项式时间,这意味着在渐近意义上,MILP为,其中是二进制变量的数量。该声明意味着随着问题实例变得非常大,它们将需要大量的计算能力来解决。n
该声明并不意味着“小”实例是棘手的。不幸的是,我无法准确说明MILP实例的小意义。我通常会解决具有3,000或更多二进制决策变量的问题。根据问题的表述,问题可能会花费少于0.01秒(对于相对受约束的问题而言)或超过一个小时(对于其中许多约束处于活动状态的问题而言)。具有良好的结构。我可以说,最先进的LP解算器可以解决具有数百万个连续决策变量的LP,而且如果没有特殊的结构,问题实例在1000到10左右的可能性很小,
如果您认为自己有一个可解决的MILP实例,则需要使用分支定界或分支定割算法。最好的实现是CPLEX和Gurobi。如果您四处挖掘,它们都是具有免费学术许可的商业产品。如果您确实需要一个开源求解器,则COIN-OR社区中的项目更为合适,尽管有时源包可能有些挑剔。最相关的项目是CBC分支切割求解器,SYMPHONY求解器,BCP分支切割价格求解器和ABACUS分支切割求解器。所有这些项目都需要来自COIN-OR的多个软件包,由于其模块化结构。
如果您想尝试多种求解器的选项,最好的办法是使用开放式求解器接口从COIN-OR。请注意,该界面的某些部分将只允许您设置基本求解器选项,而要为求解器设置高级选项,则应查阅COIN-OR的邮件列表以获取更多详细信息。商业的MILP解算器比开源解算器快很多(有时一个数量级或更多)。原型制作的另一个选择是使用代数建模语言,例如GAMS或AMPL。这两个软件包都是商业版本,但是具有可用于小问题实例的试用版。对于较大的问题实例,您可以将GAMS或AMPL文件提交到NEOS服务器有待解决;该服务器对公众开放。
如果您有足够大的MILP实例,那么这些求解器都无法正常工作。您可以将整数变量放宽为连续变量,解决问题,然后四舍五入到最接近的整数变量集合,这是问题实例的可行解决方案。MILP LP松弛的最佳解决方案将为您提供MILP最佳目标函数值的下限(当然,假设最小化),而MILP的可行解决方案将为您提供最佳目标的上限MILP的功能值。
如果您真的很幸运,并且约束矩阵完全是单模的,则可以使用LP解算器生成MILP的整数解,尽管它的大小很大,也可以有效地解决问题。其他类别的问题具有快速逼近算法,例如背包问题和切料问题。对于具有特殊结构的问题,也存在专门的MILP分解算法,尽管我不熟悉这些细节,因为这些主题有些专门,不在本文的讨论范围之内。
我不知道一个完全的多项式时间近似方案(FPTAS)专门为MILP,虽然问题类,包括MILP存在的FPTAS(见本文)。我的建议是将上述混合整数线性规划求解器之一与时间限制和最佳间隙的适当公差结合使用。这样做将为您提供在期限内对MILP的最佳可行方案,如果求解器在期限之前成功终止,则可行方案将在您设置的最佳间隙公差范围内达到最佳。此操作过程仍将为您提供解决方案质量的界限,因为您可行的解决方案将是一个上限,而求解程序可以为您提供一个适当的下限。边界不能保证在某个因素的最优解决方案之内,但是,随着逼近度的提高,任何FPTAS都会变得更加昂贵。
在确定MILP配方之前,您可以做的最重要的事情就是选择您能找到的最强配方。您可以在Bertsimas和Tsitsiklis的《线性优化简介》中找到有关如何选择强公式的建议。主要思想是选择一个约束条件所限定的多边形的配方,该多边形尽可能靠近该配方的凸包(另请参见这些课程说明)。选择一个好的配方可以大大缩短解决问题的时间。