gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:41:48 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com