如何为每个决策变量指定区间? CPLEX
How do I specify the interval for every decision variable? CPLEX
我有一组代表产品数量的决策变量。我希望它们中的每一个都可以是 0(如果未选择)或某个间隔([0.2;0.8])。 forall 不工作。
{string} Produkti = ...;
{string} Vielas = ...;
float Izmaksas[Produkti] = ...;
float vielVertibas[Produkti][Vielas]= ...;
float Normas[Vielas]= ...;
dvar float+ prodApjoms[Produkti];
minimize
sum(p in Produkti) Izmaksas[p] * prodApjoms[p];
subject to{
forall(v in Vielas) sum (p in Produkti) vielVertibas[p][v] * prodApjoms[p] >= Normas[v]*0.95;
forall(v in Vielas) sum (p in Produkti) vielVertibas[p][v] * prodApjoms[p] <= (Normas[v]*1.05);
sum (p in Produkti) prodApjoms[p] <= 15;
sum (p in Produkti) prodApjoms[p] >= 5;
}
forall(p in Produkti)
(prodApjoms[p]==0) || ((0.2<=prodApjoms[p]) && (prodApjoms[p]<=0.8));
会完成任务
以及 https://github.com/AlexFleischerParis/zooopl/blob/master/zoosemiinteger.mod
中的完整工作示例
int nbKids=300;
float costBus40=500;
float costBus30=400;
dvar int+ nbBus40;
dvar int+ nbBus30;
minimize
costBus40*nbBus40 +nbBus30*costBus30;
subject to
{
(nbBus40==0) || (4<=nbBus40<=20);
(nbBus30==0) || (4<=nbBus30<=20);
40*nbBus40+nbBus30*30>=nbKids;
}
/*
which gives
nbBus40 = 8;
nbBus30 = 0;
*/
我有一组代表产品数量的决策变量。我希望它们中的每一个都可以是 0(如果未选择)或某个间隔([0.2;0.8])。 forall 不工作。
{string} Produkti = ...;
{string} Vielas = ...;
float Izmaksas[Produkti] = ...;
float vielVertibas[Produkti][Vielas]= ...;
float Normas[Vielas]= ...;
dvar float+ prodApjoms[Produkti];
minimize
sum(p in Produkti) Izmaksas[p] * prodApjoms[p];
subject to{
forall(v in Vielas) sum (p in Produkti) vielVertibas[p][v] * prodApjoms[p] >= Normas[v]*0.95;
forall(v in Vielas) sum (p in Produkti) vielVertibas[p][v] * prodApjoms[p] <= (Normas[v]*1.05);
sum (p in Produkti) prodApjoms[p] <= 15;
sum (p in Produkti) prodApjoms[p] >= 5;
}
forall(p in Produkti)
(prodApjoms[p]==0) || ((0.2<=prodApjoms[p]) && (prodApjoms[p]<=0.8));
会完成任务
以及 https://github.com/AlexFleischerParis/zooopl/blob/master/zoosemiinteger.mod
中的完整工作示例int nbKids=300;
float costBus40=500;
float costBus30=400;
dvar int+ nbBus40;
dvar int+ nbBus30;
minimize
costBus40*nbBus40 +nbBus30*costBus30;
subject to
{
(nbBus40==0) || (4<=nbBus40<=20);
(nbBus30==0) || (4<=nbBus30<=20);
40*nbBus40+nbBus30*30>=nbKids;
}
/*
which gives
nbBus40 = 8;
nbBus30 = 0;
*/