【问题标题】:Error in defining constraints using IloRange in CPLEX (c++)在 CPLEX (c++) 中使用 IloRange 定义约束时出错
【发布时间】:2016-06-13 07:08:29
【问题描述】:

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

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

我需要找到一组约束的对偶,这就是我切换到 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);

非常感谢您的帮助。

谢谢

【问题讨论】:

    标签: c++ constraints cplex


    【解决方案1】:

    尝试像以前一样拨打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&amp;)’ 错误消息。我建议使用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);
    

    它适用于我的示例。

    【讨论】:

    • 我尝试了您建议的方法,约束已添加到 IloRange 数组中,但代码无法将它们添加到 model_ad。代码在model_ad.add(cons) 停止工作
    • 非常感谢您的帮助......我尝试了IloConstraintArray cons(env) 方法......它工作正常......但问题是我想获得这些约束集的对偶。 getDual 需要一个 IloRangeArray 并且不使用 IloConstraintArray ...。代码停在for(IloInt j=0; j&lt;data.n; j++) cout&lt;&lt;cplex_ad.getDual(cons[j])&lt;&lt;endl;
    • 好吧,在这种情况下,首先填充您的cons 数组,然后在一个循环中一个接一个地添加约束for(IloInt j=0; j&lt;data.n; j++) { model.add(cons[i]); }
    • 我试过这样做,但是在运行代码时,它在向模型添加约束时停止.....
    【解决方案2】:

    在面对这个问题并进行了相当多的调试后,我发现了问题(至少对我来说是这样)。

    问题是,IloRangeArray cons(env, data.n); 似乎用data.n“空”IloRange 对象填充cons。 (“空”是指根据调试器该对象存在,但其_impl 字段设置为空)。

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

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


    解决方案

    什么对我有用:声明IloRangeArray 设置大小参数,即使用:

    IloRangeArray cons(env); 
    

    代替

    IloRangeArray cons(env, data.n); 
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2019-07-19
      相关资源
      最近更新 更多