使用内点法找到线性编程的精确角点解


11

单纯形算法贪婪地走在多面体的角上,以找到线性规划问题的最佳解决方案。结果,答案永远是多面体的一角。内部点方法在多面体内部移动。结果,当多面体的整个平面最佳时(如果目标函数与该平面完全平行),我们可以在该平面的中间得到一个解。

假设我们要查找多面体的一个角。例如,如果我们想通过将其简化为线性编程来进行最大匹配,则我们不希望得到包含“该匹配包含0.34%的边缘XY和0.89%的边缘AB和...”的答案。我们想得到一个0和1的答案(由于所有角都由0和1组成,因此单纯形会给我们一个答案)。有没有办法使用内点方法来确保在多项式时间内找到精确的角点解?(例如,也许我们可以修改目标函数以偏向角落)


1
@JD:你为什么不回答呢?
拉斐尔

Answers:


6

您可能需要阅读以下文章:

Sanjay Mehrotra,“使用内点方法找到顶点解”,《线性代数及其应用》,第152卷,1991年7月1日,第233-253页,ISSN 0024-3795,10.1016 / 0024-3795(91)90277-4。sciencedirect文章链接


4

虽然一般来说这个问题是有道理的,但您以最大匹配为例很奇怪,因为有很多算法(用于最大基数二分匹配的最大流量,用于非二分匹配的Edmonds算法和用于最大权重二分匹配的匈牙利算法)都将为该问题提供整数顶点解。


这更多是理论上的兴趣,而不是实际的。不过,很多时候内点方法要比单纯形方法快,因此在实际问题上可能会有问题;)
Jules 2012年

3

由于缺乏细节,这只是一个较长的评论:

Karmarkar的多项式时间算法仅在边缘附近移动。最后,它找到合适的基本解决方案(例如角落),该解决方案使用纯化方案 ¹ 是最佳的。您可以使用此技术或类似技术从平面移至某个角。


¹我无法在Karmarkar的原始论文中加以说明。我的参考文献是Hamacher和Klamroth撰写的“ Lineare Optimierung und Netzwerkoptimierung”(英语:线性和网络优化),其中德语和英语文本并列。


1

是的,有一个简单的方法,我已经在C ++中实现了它,以将内点方法的速度与单纯形方法的精度结合在一起(使用基矩阵逆的迭代细化,我可以在10 ^ 15中获得1的精度最好在具有超过1000个变量和约束的密集约束矩阵上使用)。

关键在于您使用的单纯形方法。假定单纯形方法具有重构基准的机制(例如,在累积舍入误差使之成为必需之后),并且该重构方法仅针对包含所有所需基本变量列表的基准重新创建了基准逆矩阵。此外,假设即使无法完全重新创建所需的基础,单纯形算法也能够从包含目标基础95%的基础继续进行,那么答案非常简单。

您所需要做的就是从内部点方法中获取解决方案,消除因互补松弛而其主要解决方案值隐含为零的变量,并在b的单纯形问题中给定基大小,在内部取b变量最大值的点解(如果小于b,则包含非零值),然后重构单纯形基础以包含这些b变量。然后继续进行单纯形法求解。由于您是从接近完成开始处理单纯形问题,因此通常速度很快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.