在 CPLEX 中使用 IloRange 定义约束时出错 (c++)

Error in defining constraints using IloRange in CPLEX (c++)

本文关键字:出错 c++ 约束 定义 CPLEX IloRange      更新时间:2023-10-16

我在使用 IloRange 编写约束时遇到问题。没有编译错误,但代码未运行。

在代码中,ad_sales.u_j[j] 是一个变量,而 demand[j] 和 lambda[j] 是参数。我用于ILoRange的语法是ilorange(env,下限,变量,上限)。

我需要找到一组约束的对偶,这就是我切换到 IloRange 的原因。如果我使用以下命令而不是 Ilorange 代码运行良好。

for(IloInt j=0; j<data.n; j++)
model_ad.add(ad_sales.u_j[j] <= demand[j]*lambda[j]);

但是以下内容不起作用:

IloRangeArray cons(env, data.n); 
for(IloInt j=0; j<data.n; j++)
{
    cons.add(IloRange(env, 0, ad_sales.u_j[j],demand[j]*lambda[j]));
    //model_ad.add(cons[j]);
}
model_ad.add(cons);

非常感谢您的帮助。

谢谢

尝试像以前一样调用IloExpr,即

IloRangeArray cons(env, data.n); 
for(IloInt j=0; j<data.n; j++) {
    cons.add(d_sales.u_j[j] <= demand[j]*lambda[j]);
}
model_ad.add(cons);

你的方式的问题在于IloRange期望IloNumExprArg,而不仅仅是IloNumVar

编辑:

add() IloModel期望IloExtractableArray的方法。我尝试将约束对象添加到IloRangeArray并收到no matching function for call to ‘IloRangeArray::add(IloConstraint&)’错误消息。我建议使用IloConstraintArray,例如

IloConstraintArray cons(env); 
for(IloInt j=0; j<data.n; j++) {
    cons.add(d_sales.u_j[j] <= demand[j]*lambda[j]);
}
model_ad.add(cons);

它适用于我的例子。

在遇到这个问题和相当多的调试之后,我发现了这个问题(至少就我的情况而言)。

问题是,IloRangeArray cons(env, data.n);似乎用data.n"空"IloRange对象填充cons。(通过"空",我的意思是根据调试器,对象在那里,但其_impl字段设置为 null)。

因此,当调用 cons.add(...) 时,它会附加到这些现有的空约束中。这意味着你最终会得到一堆空的 IloRange 对象,然后是你添加的实际约束。

这会弄乱对model_ad.add(cons);的调用并导致分段错误(至少在我的情况下)。

<小时 />

溶液

什么对我有用:在不设置 size 参数的情况下声明IloRangeArray,即使用:

IloRangeArray cons(env); 

而不是

IloRangeArray cons(env, data.n); 

希望这对任何未来的读者有所帮助。