Originally posted by: Treee
Hello everyone!
I am new to CPLEX/OPL and I am trying to model a container terminal. So far my model gives out the minimum distance for my container ( heavy/light NormalContainer/CoolingContainer) in a three dimensional matrix. It works so far but now I have a problem that i cannot differentiate between the different types of containers in my matrix. There should be for example a 1 for a normal heavy container in my matrix, a 2 for a heavy cooling container, a 3 for a light normal container and a 4 for a light cooling container.
I tried a couple of things but nothing worked. How can i do it?
my .dat so far :
nbTypesOfContainers = 4;
AmountOfContainers = [3,4,5,2];
//HeavyCooling,LightCooling, HeavyNormal, LightNormal
Types = 4;
Rows = 4;
Columns = 5;
Tiers = 3;
Distance = [
[[ 1 7 13 19 25 ],
[ 3 9 15 21 27 ],
[ 5 11 17 23 29 ],
[ 7 13 19 25 31 ]],
[[2 8 14 20 26]
[4 10 16 22 28]
[6 12 18 24 30]
[8 14 20 26 32]],
[[3 9 15 21 27]
[5 11 17 23 29]
[7 13 19 25 31]
[9 15 21 27 33]]
and my .mod:
int nbTypesOfContainers = ...;
range ContainerTypes = 1..nbTypesOfContainers;
int AmountOfContainers[ContainerTypes] = ...;
int SumOfAmountOfContainers = AmountOfContainers[1]+AmountOfContainers[2]+AmountOfContainers[3]+AmountOfContainers[4];
int lock = ...;
int move = ...;
int Types = ...;
range Type = 1..Types;
int Rows = ...;
range Row = 1..Rows;
int Columns = ...;
range CoolingColumn = 4..Columns;
range NormalColumn = 1..Columns-2;
range Column = 1..Columns;
int Tiers = ...;
range Tier = 1..Tiers;
int Distance [Tier][Row][Column] = ...;
dvar boolean placed[Tier][Row][Column];
tuple ContainerData
{
int value;
int y;
int x;
int z;
}
sorted {ContainerData} valuesCooling={<Distance[Tier,Row,Column],Tier,Row,Column> | Row in 1..Rows, Column in 4..Columns, Tier in 1..Tiers : Distance[Tier,Row,Column]!=0 };
sorted {ContainerData} valuesNormal={<Distance[Tier,Row,Column],Tier,Row,Column> | Row in 1..Rows, Column in 1..Columns-2, Tier in 1..Tiers : Distance[Tier,Row,Column]!=0 };
sorted {ContainerData} minimumAmountOfCoolingContainers={ item(valuesCooling,i) | i in 0..(AmountOfContainers[1]+AmountOfContainers[2])-1};
float computeSumCooling=sum(i in minimumAmountOfCoolingContainers) i.value /AmountOfCranes+(2*lock*(AmountOfContainers[1]+AmountOfContainers[2]));
sorted {ContainerData} minimumAmountOfNormalContainers={ item(valuesNormal,i) | i in 0..(AmountOfContainers[3]+AmountOfContainers[4])-1};
float computeSumNormal=sum(i in minimumAmountOfNormalContainers) i.value /AmountOfCranes+(2*lock*(AmountOfContainers[3]+AmountOfContainers[4]));
minimize
sum( t in Tier,r in Row, c in Column)
Distance[t][r][c]*placed[t][r][c];
subject to {
ctNormalContainersJustInFirstThreeRows:
sum(t in Tier,r in Row, c in NormalColumn)
placed[t][r][c] ==(AmountOfContainers[3]+AmountOfContainers[4]);
ctCoolingContainersJustInLastTwoRows:
sum(t in Tier,r in Row, c in CoolingColumn)
placed[t][r][c] ==(AmountOfContainers[1]+AmountOfContainers[2]);
ctPositionIsFree:
forall(t in Tier,r in Row, c in Column)
placed[t][r][c] <=1;
ctPositionInTierOneIsNotFree:
forall(t in Tier,r in Row, c in Column)
placed[2][r][c] <= placed[1][r][c];
ctPositionInTierTwoIsNotFree:
forall(t in Tier,r in Row, c in Column)
placed[3][r][c] <= placed[2][r][c];
CtNoHeavyOnLightContainers:
forall(t in Tier, r in Row, c in Column)
}
execute DISPLAY_RESULTS {
writeln(placed);
}
many thanks and kind regards
#CPLEXOptimizers#DecisionOptimization