我正在寻找一种简单的方法,可以在使用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。