C++ 列举一些接近最优解的极值点

C++ 列举一些接近最优解的极值点,c++,optimization,linear-programming,cplex,C++,Optimization,Linear Programming,Cplex,我正在寻找一种简单的方法,用CPLEX获得LP问题(不是MIP)的许多“好”解,而不仅仅是(其中一个)最优基本解。所谓“好的”解决方案,我的意思是,相应的目标值与真正的最优值相差不远。这样的解决方案库可以帮助决策者 更准确地说,给定一个特定的Polydron Ax=0和一个我想最大化的目标函数z=cx,在运行LP后,我可以获得最佳值z*。然后我想列举由约束集给出的多面体的所有极值点 Ax <= b cx >= z* - epsilon x >= 0 Ax=z*-epsilo

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

更准确地说,给定一个特定的Polydron Ax=0和一个我想最大化的目标函数z=cx,在运行LP后,我可以获得最佳值z*。然后我想列举由约束集给出的多面体的所有极值点

Ax <= b
cx >= z* - epsilon
x  >= 0
Ax=z*-epsilon
x>=0
当ε为给定公差时

我知道CPLEX提供了一种生成解决方案池的方法(请参阅),但它不会起作用,因为这种方法是针对MIP的:它枚举一个IP的所有解决方案(或者,如果问题是MIP,则针对每个给定的固定整数变量集枚举一个解决方案)

一个有趣的有效方法是访问最优基本解的相邻解,即所有相邻的极值点:如果我假设多面体不是退化的,对于每对基本变量x_B和非基本变量x_N,我计算x_B离开基,x_N进入基时得到的基本解。然后我抛出cx

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

非常感谢:)


Rémi L.

有一种有趣的方法使其适合用于Cplex解决方案池。使用二进制变量对当前基准进行编码,例如,
basis[k]=0
表示非基本,而
basis[k]=1
表示变量(或行)k为基本。当然,我们有
和(k,基[k])=m
(行数)。最后,我们有
x[k]也许你可以尝试使用约束的影子价格(我认为CPLEX的回报)来走向一个不同的解决方案,接近全局最优的解决方案?是的,影子价格和边际值可以用来做旋转操作。但我必须提取最终单纯形表的所有边际替代率,然后自己做透视。。。事实上,我希望Concert技术中存在一种最简单的方法,比如CPXXpivot,它通过交换两个基本变量和非基本变量来自动执行pivot…我不是这方面的专家,但IBM developerWorks论坛上的这一方法听起来很相似(如果不相同)。@Remi L。不幸的是,这是我能想到的唯一方法,希望其他人知道一个简单的解决方案:/CPXXPIVOT不是通过C++ API直接访问的(即,你必须使用C可调用库来访问该功能)。这似乎是填充所有基解的有效方法。我认为这里描述的算法可以改进:–在添加一个切割后使用对偶单纯形算法,并给CPLEX我们刚才切割的现有(不可行)解决方案,以加速分支和切割通过处理退化基本解的情况,通过添加其他切割或在计算后自动过滤解决方案。我相信在使用解决方案池时不需要这样做,因为解决方案池将提供比这种修补更好的性能。。