这是我在 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/