如何创建具有 objective 优先级的多 objective 模型
How to create a multi-objective model with objective priority
我正在尝试解决一个多 objective 问题,其中我必须最小化两个不同的 objective,但其中一个优先于另一个。
为了解决这个问题,从而解决这个问题,我尝试使用两个 objective 函数的加权和。这里的问题是该方法找到了我不想要的两个问题之间的最小值。我想解决一个 objective 然后,在保持该特定值的情况下,我想解决另一个问题。
CPLEX 12.9 版能够做到这一点:求解一个 objective,修复其值,然后移动到下一个 objective。这是一个示例 LP:
Maximize multi-objectives
first: abstol=2
x1
second: priority=-1
x2
Subject to
x1 + x2 = 10
General
x1 x2
End
此功能在 the release notes, as well as in these slides 中有描述。
您可以使用 staticLex。
int nbKids=200;
float costBus40=500;
float costBus30=400;
float costBus50=625;
dvar int+ nbBus40;
dvar int+ nbBus30;
dvar int+ nbBus50;
dvar float cost;
dvar float co2emission;
minimize
staticLex(cost,co2emission);
subject to
{
cost==costBus40*nbBus40 +nbBus30*costBus30+nbBus50*costBus50;
co2emission==nbBus50+nbBus40*1.1+nbBus30*1.2;
40*nbBus40+nbBus30*30+nbBus50*50>=nbKids;
}
execute DISPLAY_After_SOLVE
{
writeln("The minimum cost is ",cost);
writeln("CO2 emission is ",co2emission);
writeln("We will use ",nbBus40," 40 seats buses ",nbBus30,
" 30 seats buses and ", nbBus50," buses 50 seats");
}
这给出了
The minimum cost is 2500
CO2 emission is 4
We will use 0 40 seats buses 0 30 seats buses and 4 buses 50 seats
我在 5 天前发布了这个答案,但被版主删除了。
中的小示例
我正在尝试解决一个多 objective 问题,其中我必须最小化两个不同的 objective,但其中一个优先于另一个。
为了解决这个问题,从而解决这个问题,我尝试使用两个 objective 函数的加权和。这里的问题是该方法找到了我不想要的两个问题之间的最小值。我想解决一个 objective 然后,在保持该特定值的情况下,我想解决另一个问题。
CPLEX 12.9 版能够做到这一点:求解一个 objective,修复其值,然后移动到下一个 objective。这是一个示例 LP:
Maximize multi-objectives
first: abstol=2
x1
second: priority=-1
x2
Subject to
x1 + x2 = 10
General
x1 x2
End
此功能在 the release notes, as well as in these slides 中有描述。
您可以使用 staticLex。
int nbKids=200;
float costBus40=500;
float costBus30=400;
float costBus50=625;
dvar int+ nbBus40;
dvar int+ nbBus30;
dvar int+ nbBus50;
dvar float cost;
dvar float co2emission;
minimize
staticLex(cost,co2emission);
subject to
{
cost==costBus40*nbBus40 +nbBus30*costBus30+nbBus50*costBus50;
co2emission==nbBus50+nbBus40*1.1+nbBus30*1.2;
40*nbBus40+nbBus30*30+nbBus50*50>=nbKids;
}
execute DISPLAY_After_SOLVE
{
writeln("The minimum cost is ",cost);
writeln("CO2 emission is ",co2emission);
writeln("We will use ",nbBus40," 40 seats buses ",nbBus30,
" 30 seats buses and ", nbBus50," buses 50 seats");
}
这给出了
The minimum cost is 2500
CO2 emission is 4
We will use 0 40 seats buses 0 30 seats buses and 4 buses 50 seats
我在 5 天前发布了这个答案,但被版主删除了。
中的小示例