我使用 java clp 实现创建了一个小程序https://github.com/quantego/clp-java。 有时,解决方案会返回小数,这是我不想要的,因为我使用的变量实际上应该是下限为 0、上限为 1 的布尔值。我想知道这些变量是否可以限制为整数或者变量是否可以定义为布尔值。
目前我正在做这样的事情:
CLP model = new CLP();
var expr = model.createExpression();
var goal = model.createExpression();
var var = model.addVariable().lb(0).ub(1);
expr.add(1, var);
var var2 = model.addVariable().lb(0).ub(1);
expr.add(1, var2);
var var3 = model.addVariable().lb(0).ub(1);
expr.add(1, var3);
expr.eq(1);
goal.add(4, var);
goal.add(2, var2);
goal.add(1, var3);
goal.asObjective();
model.minimize();
model.solve();
这不是完全相同的代码,因为该代码在这里很难解释。 我可以做些什么来将变量限制为 0 和 1 吗? 所以我必须使用其他实现吗?
不,你不能。
Clp 是一个线性规划求解器,不支持强制完整性。
Cbc 是基于 Clp 支持的(混合)整数规划求解器(由同一作者完成)。
遗憾的是,您的第三方库仅与 Clp 接口,而不与 Cbc 接口。参见示例:
您需要使用其他一些工具来完成此操作!
(顺便说一句:在某些 LP 求解器之上构建 MILP 求解器非常复杂 -> 这里没有适合您的解决方法)
(java用户不多)
考虑使用 or-tools 的包装器(该项目本身是一个基于 C++ 的大型伞式优化项目,具有许多语言包装器)。
他们可能在最新版本(或即将推出的版本)中删除了 Clp/Cbc,但如果是这样,它已被更好的东西(SCIP 或 Highs)取代。就建模 API 而言,这并不重要(建模一次,选择求解器后端)。