В CPLEX я построил прилагаемую модель, которую я хочу использовать для размещения продуктов на местах. Ограничение, которое пытается упорядочить распределение продуктов по местоположениям в порядке возрастания Stackingorder [s], не дает мне желаемого результата.
Если продукт размещен в местоположении xi, он должен иметь меньший порядок суммирования + 1, тогда все продукты, расположенные после местоположения xi.
CPLEX, кажется, игнорирует ограничение, в то время как все другие ограничения выполняются.
Как мне изменить ограничение или модель, чтобы оно заработало?
forall(w in Locations: w+1 in Locations, s in Products)
ctStackingorder:
{(Slot[s][w+1] * Stackingorder[s]) <= Slot[s][w] * (Stackingorder[s]+1);}
int Fixed = ...;
int NbLocations = ...;
range Locations = 0..NbLocations-1;
int NbProducts = ...;
range Products = 0..NbProducts-1;
int Capacity[Locations] = ...;
int LocationCosts[Products][Locations] = ...;
int RequiredLoc[Products] = ...;
int Stackingorder[Products] = ...;
dvar boolean Use[Locations];
dvar boolean Slot[Products][Locations];
dvar int SError[Products][Locations];
minimize
sum( w in Locations )
Fixed * Use[w] +
sum( w in Locations , s in Products )
LocationCosts[s][w] * Slot[s][w] +
sum( w in Locations , s in Products )
SError[s][w] *1000 * RequiredLoc[s];
subject to{
forall(s in Products )
ctProductHasEnoughLocations:
sum( w in Locations)
Slot[s][w] * Capacity[w] == RequiredLoc[s];
forall(s in Products, w in Locations: w+1 in Locations)
ctFacings:
if(RequiredLoc[s] >1){ Slot[s][w+1]==Slot[s][w];}
forall( w in Locations, s in Products )
ctUseSlotProduct:
Slot[s][w] <= Use[w];
forall( w in Locations )
ctMaxUseOfLocation:
sum( s in Products )
Slot[s][w] <= Capacity[w];
forall(w in Locations: w+1 in Locations, s in Products)
ctStackingorder:
{(Slot[s][w+1] * Stackingorder[s]) <= Slot[s][w] * (Stackingorder[s]+1);}
}
{int} Productsof[w in Locations] = { s | s in Products : Slot[s][w] == 1 };
execute
{
writeln("Open=",Use);
writeln("Storesof=",Productsof);
}
.dat
Fixed = 30;
NbLocations = 6;
NbProducts = 5;
RequiredLoc = [1,1,1,1,1];
Capacity = [1,1,1,1,1,1];
LocationCosts = [
[ 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1, 1 ] ];
Stackingorder = [328,326,228,226,226];