gpt4 book ai didi

java - 使用什么来避免 Cplex Java 多目标模型中的过度补偿?

转载 作者:行者123 更新时间:2023-11-30 01:48:39 25 4
gpt4 key购买 nike

我正在我的 Java 应用程序中使用 Cplex 设置多目标优化模型。然而,当它求解模型时,它过度补偿了一个变量,而其余变量均为 0。我可以使用什么来获得更加分布式的解决方案?

 int[] x = {49,43,43,44,48,49,51,54,51,52,57,59};
double[] y = {10, 12, 13.2, 22.7, 17.1, 16.5, 14.87, 12, 16.5, 14.8, 12, 11.5};
int[] z = {59, 59, 57, 57, 53, 53, 52, 51, 51, 50, 50, 50};
int totalVacations = 73;

try {
IloCplex model = new IloCplex();
int size = 12;
IloNumVarType varType = IloNumVarType.Int;
double[] lb = new double[size];
double[] ub = new double[size];
IloNumVarType[] varTypes = new IloNumVarType[size];
for (int i = 0; i < lb.length ; i++) {
lb[i] = 0.0;
ub[i] = Double.MAX_VALUE;
varTypes[i] = varType;
}
IloNumVar[] varUsed = model.numVarArray(size, lb, ub, varTypes);
for (int i = 0; i < varUsed.length; i++) {
model.add(varUsed[i]);
}
IloNumExpr[] objArray = new IloNumExpr[size];
for (int i = 0; i < objArray.length; i++) {
IloObjective next = model.maximize();
IloNumExpr exprVar = varUsed[i];
double setValue = z[i] - x[i] - y[i];
next.setExpr(model.diff(setValue, exprVar));
next.setSense(IloObjectiveSense.Maximize);
objArray[i] = next.getExpr();
}

model.add(model.maximize(model.staticLex(objArray)));
model.addEq(totalVacations, model.sum(varUsed), "c1");
if (model.solve()) {
double[] results = model.getValues(varUsed);
for (int i = 0; i < results.length; i++) {
System.out.println(results[i]);
}
}
System.out.println(model.toString());
model.end();
} catch (IloException e) {
System.err.println("Concert exception caught: " + e);
}

这些值为0.00.00.00.00.00.00.00.00.00.00.073.0

当我希望它更加分布时(尽管不是均匀的)。对于在这种情况下该怎么做有什么建议吗?

最佳答案

让我使用 OPL 来向您展示该怎么做:

您编写了相当于 Java 的内容

int totalVacation=73;
range r=1..12;

int x[r] = [49,43,43,44,48,49,51,54,51,52,57,59];
float y[r] = [10, 12, 13.2, 22.7, 17.1, 16.5, 14.87, 12, 16.5, 14.8, 12, 11.5];
float z[r] = [59, 59, 57, 57, 53, 53, 52, 51, 51, 50, 50, 50];

dvar int varUsed[r] in 0..totalVacation;

maximize sum(i in r) (z[i] - x[i] - y[i]-varUsed[i]);

subject to
{
c1:sum(i in r) varUsed[i]==totalVacation;
}

这给出了

varUsed = [73 0 0 0 0 0 0 0 0 0 0 0];

因为目标中没有任何关于公平的内容。

但是如果你改变目标

maximize sum(i in r) (z[i] - x[i] - y[i]-varUsed[i]);

maximize staticLex(sum(i in r) (z[i] - x[i] - y[i]-varUsed[i]),
-max(j in r) varUsed[j]+min(j in r) varUsed[j]);

然后你添加第二个词典目标以最大化公平性,然后你会得到

varUsed = [7 6 6 6 6 6 6 6 6 6 6 6];

关于java - 使用什么来避免 Cplex Java 多目标模型中的过度补偿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878572/

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