GLPK#整数编程

时间:2013-02-22 04:11:48

标签: c# optimization mathematical-optimization

我需要写一个整数程序。它非常简单,但问题是没有关于如何使用可调用库为GLPK编写整数程序的好信息,更不用说GLPK#。

我的整数程序非常像这样:

Maximise: X[0] + X[1] + ... + X[n];

s.t.      X[1] + X[5] <= 1;
          X[1] + X[7] <= 1;
          X[2] + X[4] <= 1;
          X[3] + X[9] <= 1;
          ...
          X[i] = {0,1}

我有一堆二进制X,我想最大化总和。某些X排除某些其他X.

我到目前为止所做的一切都是

LPProblem lp = new LPProblem()
{
  ModelClass = MODELCLASS.MIP,
  ObjectiveDirection = OptimisationDirection.MAXIMISE,
  ObjectiveName = "Z"
};

// Stuff goes here, I'm not sure how to represent the model

SOLVERSTATUS status = lp.SolveInteger();

3 个答案:

答案 0 :(得分:3)

也许你可以使用GLPK#以外的东西。如果您是学者,您可以免费获得CPLEX或Gurobi。否则,Google OR Tools在过去一年中获得了C#支持。根据{{​​3}},它包括GLPK和CBC的包装器。只是因为您可以在两个解算器之间切换,我建议使用Google OR Tools。对于特定情况,您可能会找到一个比另一个更好的解算器。

答案 1 :(得分:1)

还有一些其他评论可以填补这一点。首先,GLPK没问题,但对于大型模型来说速度相当慢 - 如果你面临一个大问题(即使将来会出现这种情况),你可能会更好地关注其他已经提到过的解决方案。此外,GLPK#开发似乎非常安静 - 近两年来我没有看到任何更新。这可能是一件好事(它是稳定的并且有效,所以为什么要改变它)或者它可能会停滞不前。

如前所述,Gurobi和CPLEX都是强大的强大快速解算器,并且在C#中提供了良好的建模API。如果你可以访问这些,他们真的很值得。 SCIP求解器很好 - 可能是最好的非商业求解器,但我不确定C#接口。

Google OR工具的另一个潜在优势是强调约束编程 - 如果你有一组复杂的二元变量和约束,那么CP方法可能会有一些优势。

答案 2 :(得分:1)

您描述的问题称为“最大集团问题”。创建一个无向图,其顶点标记为1到n。如果你有x [i] + x [j]&lt; = 1形式的约束,那么在i和j之间绘制一条边。设H是互补图 - 即当你和在G和i之间有一条边时,i和j之间有一条边。一个clique是顶点的子集每个都通过边缘连接到S的所有其他成员。你的问题是找到一个最大尺寸的集团。这是一个众所周知的NP完全问题。然而,有许多非常好的启发式算法(甚至可能是软件可用)来解决这个问题。请查看以下调查http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.5821

您提供的IP配方并不是非常紧密,因此,除非n相当小,即使使用CPLEX和GUROBI等顶级求解器,您也可能无法在合理的时间内使用该配方解决问题。 / p>