【问题标题】:GLPK# integer programmingGLPK#整数编程
【发布时间】:2013-06-10 00:28:40
【问题描述】:

我需要编写一个整数程序。这非常简单,但问题是几乎没有关于如何使用可调用库为 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();

【问题讨论】:

  • 你是对的,这个库似乎几乎没有任何文档。也许最好只查看源代码中可用的内容...最新版本位于yoyovicks.blog.free.fr

标签: c# optimization mathematical-optimization


【解决方案1】:

也许您可以使用 GLPK# 以外的其他东西。如果您是一名学者,您可以免费获得 CPLEX 或 Gurobi。否则,谷歌 OR 工具在过去一年中一直支持 C#。根据Google OR Tools page,它包括一个用于 GLPK 和 CBC 的包装器。仅仅因为您可以在两个求解器之间切换,我建议您使用 Google OR Tools。对于您的特定实例,您可能会发现一种求解器比另一种更好。

【讨论】:

  • 除此之外,还有一些带有 C# 接口的开源替代品,即LPSolveCoinMP。两个求解器都支持 MIP。它们主要是 C/C++ 代码,但都通过 P/Invoke 提供了良好的 C# 接口。
  • 谢谢。我并不完全了解礼仪。我应该编辑我的答案以包含您建议的求解器吗?
  • 我认为你不需要,你的答案是完全有效的。我只是想我应该提到一些开源替代品以提供更多选择。
【解决方案2】:

只需几个其他的 cmets 来填写更多内容。首先 GLPK 是可以的,但对于大型模型来说速度很慢 - 如果您面临一个大问题(即使这是未来的方式),您可能最好看看其他一些已经提到的求解器。此外,GLPK# 的开发似乎非常安静——我已经将近 2 年没有看到任何更新了。这可能是一件好事(它稳定且有效,所以为什么要更改它)或者它可能是停滞不前。

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

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

【讨论】:

    【解决方案3】:

    您描述的问题称为“最大派系问题”。创建一个无向图,其顶点标记为 1 到 n。如果您有 x[i] + x[j] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.5821

    您给出的 IP 公式不是很严格,因此,除非 n 相当小,否则即使使用 CPLEX 和 GUROBI 等顶级求解器,您也可能无法使用该公式在合理的时间内解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多