【问题标题】:Problems with using variable bounds and objective function in C++ CPLEX在 C++ CPLEX 中使用变量边界和目标函数的问题
【发布时间】:2013-02-22 23:20:26
【问题描述】:

我正在用 C++ 编写一个线性编程模型,从 cplex 中提取 Concert 技术。

我这样声明模型的变量和目标函数:

IloModel genInst (env);

IloNumVarArray Sizes(env,N,0.25+EPS,1.0-EPS);

IloObjective Weight = IloAdd(genInst, IloMaximize(env,IloSum(Sizes));  

EPS 是一个小常数,因为我希望变量严格大于 0.25 且严格小于 1.0。

目标函数应该最大化所有变量的总和,但是每当我尝试这个时,解决方案中的变量的值都会超出我的限制(例如小于 0.25 或太大),我看不出有任何可能将变量值保持在其范围内。

有人可以帮我吗?我可能犯了一些错误,因为它不应该那么复杂。谢谢你!

【问题讨论】:

  • 对 CPLEX 进行故障排除的一个好方法是使用 exportModel。检查 .LP 文件中的边界,看看它们是否符合您的期望。尝试使用不同的求解器(如 Gurobi)来解决问题,看看你得到了什么值。另外,当您在解决后说这些值超出了您的限制时,您会得到什么值? EPS的具体价值是多少?
  • 谢谢,exportModel 帮我找到了原因,我的约束总是包含一个负变量,它应该是正的。

标签: c++ cplex


【解决方案1】:

这是一个边界函数:

template<class T>
T bound_number(T n, T min, T max) {
    return std::max(std::min(n, max), min);
}

【讨论】:

  • 更好的是,使用 std::minstd::max 并且不要使用一次性宏来混淆标识符空间。
  • 谢谢,但我不确定这是否可行,因为它似乎是一个特定于 cplex 的问题。边界得到满足,但每当我设置 objectiv 函数时,变量就开始位于边界之外。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多