繁体   English   中英

java(eclipse)实现中的Cplex目标function

[英]Cplex objetive function in java(eclipse) implementation

这是我在 cplex 中的目标 function:

最小化 sum(j in horas, k in trabajos) ((1/prioridad[j][k]) * (sum(i in personas) x[i][j][k] - min_demanda[j][k]) );

这就是我尝试在 java 中执行此操作的方式,但效果不佳(目标值为零,并且所有 var x[][][] 也是如此,因此在这种情况下它必须为负,因为有术语- min_demanda[j](非空)):

                double valorFuncionObjetivo = 0;
                IloCplex cplex = new IloCplex();

                IloNumVar[][][] x = new IloNumVar[Map.NumPersM][Map.NumHrsM][Map.NumTrab];

                for (int i = 0; i < Map.NumPersM; i++) {
                    for (int j = 0; j < Map.NumHrsM; j++) {
                        for (int k = 0; k < Map.NumTrab; k++) {

                        x[i][j][k] = cplex.boolVar();
                        }
                    }
                }
                //cplex.setParam(IloCplex.Param.Preprocessing.Presolve, false);

                // Model            
                IloLinearNumExpr funcion_objetivo = cplex.linearNumExpr();

                for (int j = 0; j < Map.NumHrsM; j++) {
                     for (int k = 0; k < Map.NumTrab; k++) {
                          for (int i = 0; i < Map.NumPersM; i++) {

                                funcion_objetivo.addTerm(x[i][j][k],Map.Demandas[j][k].Prioridad);
                          }
                       funcion_objetivo.setConstant(-(Map.Demandas[j][k].Prioridad)*Map.Demandas[j][k].Min_personas);  
                     }
                } 

                cplex.addMinimize( funcion_objetivo);

您在目标中设置常数项的方式存在问题。 你的代码是

for (int j = 0; j < Map.NumHrsM; j++) {
  for (int k = 0; k < Map.NumTrab; k++) {
    for (int i = 0; i < Map.NumPersM; i++) {
      funcion_objetivo.addTerm(x[i][j][k],Map.Demandas[j][k].Prioridad);
    }
    funcion_objetivo.setConstant(-(Map.Demandas[j][k].Prioridad)*Map.Demandas[j][k].Min_personas);  
  }
}

因此,在 j/k 循环的每次迭代中,您都会覆盖常数项。 如果最后一项恰好为 0,则目标中的常数项将为 0。您可能希望像这样对常数求和(我添加了funcion_objectivo.getConstant() ):

for (int j = 0; j < Map.NumHrsM; j++) {
  for (int k = 0; k < Map.NumTrab; k++) {
    for (int i = 0; i < Map.NumPersM; i++) {
      funcion_objetivo.addTerm(x[i][j][k],Map.Demandas[j][k].Prioridad);
    }
    funcion_objetivo.setConstant(funcion_objectivo.getConstant() - (Map.Demandas[j][k].Prioridad)*Map.Demandas[j][k].Min_personas);  
  }
}

此外,您可以System.out.println(funcion_objective.getConstant())仔细检查常数项确实不为零。

我不确定所有变量都是 0 的事实是否出乎意料。 如果这是出乎意料的,那么您可能缺少一些要求变量为非零的约束。 调试此问题的一个好方法是为变量和约束分配名称(使用setName()函数),使用cplex.exportModel("model.lp")将 model 导出为 LP 文件格式,然后检查创建的model.lp在文本编辑器中创建文件,以确保所有约束看起来都符合预期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM