我可以获得IloNumVarArray的价值吗?关于目标函数的定义

时间:2013-04-22 13:07:55

标签: c++ linear-programming cplex

我正在使用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”的值吗?

1 个答案:

答案 0 :(得分:1)

根据定义,决定变量的值是不知道的,直到你解决之后,所以(pp [i]> 0)返回一个IloRange对象而不是布尔值,因此你得到一个编译时错误。 / p>

要最小化变量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。