【问题标题】:Can i get the value of IloNumVarArray? about definition of objective function我可以获得 IloNumVarArray 的值吗?关于目标函数的定义
【发布时间】:2013-04-22 13:07:54
【问题描述】:

我正在使用 CPLEX 来解决 mip。我的目标是最小化正的决策值的总和。所以我在定义目标函数的时候需要判断决策值的符号。 例如:

    IloNumVarArray pp(env);
    for (int i=0;i<N;i++)
    {
      pp.add(IloNumVar(env, -50.0, 50.0));
    }
    IloExpr obj(env);
    for (int in=0;in<N;in++)
    {     
       if (pp[in]>0)   ///error:this expression is wrong, how to judge the value? ///
       obj+=pp[in];
    }
    model.add(IloMinimize(env, obj));
    obj.end();

如何正确表达?定义目标函数时能得到“pp”的值吗?

【问题讨论】:

    标签: c++ linear-programming cplex


    【解决方案1】:

    根据定义,决策变量的值在您执行求解之前是未知的,因此 (pp[i] > 0) 返回一个 IloRange 对象而不是布尔值,因此您会收到编译时错误。

    要最小化变量 pp[i] 的正数部分,您需要定义第二个非零但大于 pp[i] 的变量。

    IloNumVarArray pp(env, N, -50, 50, ILOFLOAT);
    IloNumVarArray pp_positive(env, N, 0, IloInfinity, ILOFLOAT);
    for (int i=0; i<N; ++i)
    {
      model.add(pp[i] - pp_positive[i] <= 0);
    }
    model.add(IloMinimize(env, IloSum(pp_postiive));
    

    因为 pp_positive 只出现在目标函数中,所以如果 pp[i] 为正则取 pp[i] 的值,如果 pp[i] 为负则取 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 2013-04-16
      • 2017-06-11
      • 2021-06-16
      • 2012-09-18
      • 1970-01-01
      相关资源
      最近更新 更多