在Cplex Java中,如何避免多目标模型中的过度补偿?

在Cplex Java中,如何避免多目标模型中的过度补偿?,java,cplex,Java,Cplex,我正在Java应用程序中使用Cplex建立一个多目标优化模型。但是,当它求解模型时,它会过度补偿一个变量,而其余变量为0。我可以使用什么来获得更分布式的解决方案 int[]x={49,43,43,44,48,49,51,54,51,52,57,59}; 双[]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}; 假期总数=73; 试一试{ IloCp

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

int[]x={49,43,43,44,48,49,51,54,51,52,57,59};
双[]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};
假期总数=73;
试一试{
IloCplex模型=新的IloCplex();
int size=12;
IloNumVarType=IloNumVarType.Int;
双[]磅=新双[尺寸];
double[]ub=新的双精度[尺寸];
IloNumVarType[]varTypes=新的IloNumVarType[size];
对于(int i=0;i
这些值是 0 0 0 0 0 0 0 0 0 0 0 73.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]);

然后添加第二个词典目标以最大化公平性,然后您将获得

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

正如亚历克斯在回答中所说,没有动机选择任何其他变量。您必须更改目标系数(变量的“权重”),以使其他变量更受欢迎。请注意,从12.9版开始,CPLEX直接支持多目标优化。请参见CPLEX附带的
Diet.java
示例。
varUsed = [7 6 6 6 6 6 6 6 6 6 6 6];