在最优解决方案附近列举一些极端点

时间:2016-05-03 20:51:51

标签: c++ optimization linear-programming cplex

我正在寻找一种简单的方法,可以在使用CPLEX的LP问题(而不是MIP)中获得许多“好”解决方案,而不仅仅是(其中一个)最佳基本解决方案。通过“好”解决方案,我的意思是相应的目标值与真实的最佳值相差不远。这样的解决方案可以帮助决策者......

更准确地说,给定某个多面体Ax< = b且x> = 0且目标函数z = cx我希望最大化,在运行LP之后,我可以得到最优值z *。然后我想枚举由约束集

给出的多面体的所有极值点
Ax <= b
cx >= z* - epsilon
x  >= 0

当epsilon是给定的容差时。

我知道CPLEX提供了生成解决方案池的方法(参见here),但它不起作用,因为此方法适用于MIP:它枚举IP的所有解决方案(或每个给定集合的一个解决方案)如果问题是MIP,则为固定的整数变量。

一种有趣的有效方法是访问最优基本解的相邻解,即所有相邻极点:如果我认为多面体不是退化的,对于每对基本变量x_B和非基本变量x_N,I计算当x_B离开基础并且x_N在基础中输入时获得的基本解。然后我用cx&lt; z * -epsilon,对于其他人,我重复这个程序。 [我知道我可以改进这个算法,但这是一般的想法]。

可调用库的routine CPPXpivot可以帮助执行此旋转操作,但我没有在C ++ API(音乐会技术)中找到等效项。有人知道这样的等价物是否存在,或者可以提出另一种方法来回答我原来的问题吗?

非常感谢:)!

RémiL。

1 个答案:

答案 0 :(得分:1)

有一种有趣的方法可以使其适用于Cplex解决方案池。使用二进制变量对当前基础进行编码,例如: basis[k] = 0表示非基本的,basis[k] = 1表示变量(或行)k是基本的。当然我们有sum(k, basis[k]) = m(行数)。最后我们有x[k] <= basis[k] * upperbound[k](即如果非基本则为零 - 假设为正变量)。当我们将其添加到LP模型时,我们最终得到MIP并且可以使用Cplex解决方案池枚举(全部或部分,最佳或接近最佳)基础。请参阅herehere