java - java(eclipse)中的Cplex目标函数实现

标签 java eclipse cplex

这是我在 cplex 中的目标函数:

最小化 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") 将模型导出为 LP 文件格式。然后检查创建的model.lp在文本编辑器中创建文件,以确保所有约束看起来符合预期。

关于java - java(eclipse)中的Cplex目标函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61339103/

相关文章:

java - Spring 批 : dynamic chunk size

java - 从终端获取输入时出现不需要的回车

java - 如何在windows下更改Maven的M2_REPO

cplex - 将 Excel 文件连接到 CPLEX

mathematical-optimization - 最佳开源混合整数优化求解器

Java Cplex 两个决策变量的乘积

java - Spring MVC : Is it necessary to test if a @ModelAttribute is null?

java默认Locale是en_US,它使用 ","作为十进制数

linux - 需要使用 Subclipse 提交消息

eclipse - 在使用 m2e 的 Eclipse 中,如何获取 "Quick Javadoc"(F2) 以显示 Maven 依赖项?