![](/img/trans.png)
[英]Problems with cplex implementation in java (eclipse), objetive value= 0 ; LP Presolve eliminated 96 rows and 0 columns
[英]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.