Существует проблема с тем, как вы устанавливаете постоянный термин в своей цели. Ваш код:
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 / kl oop вы перезаписываете постоянный член. Если последний член окажется равным 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()
), экспортируйте модель в формат файла LP, используя cplex.exportModel("model.lp")
, а затем проверьте созданный файл model.lp
в текстовом редакторе, чтобы сделать убедитесь, что все ограничения выглядят как ожидалось.