Variables in summation bounds

Problems with syntax of GAMS
Post Reply
Patrosinho
User
User
Posts: 4
Joined: 3 years ago

Variables in summation bounds

Post by Patrosinho »

Hi guys,

in my model I consider a rectangle with known area but variable side lengths. Furthermore, I would like to discretize the rectangle into a grid with small unit Elements,

Attached you can find some restrictions, but that problem occurs at several positions:
image.png
image.png (7.79 KiB) Viewed 2016 times
image.png
image.png (6.42 KiB) Viewed 2016 times
image.png
Below you can find a part of my Gams Code, again it is a big model, so dont get disturbed by the other equations :)

lowerboundx(k)..
EX(k) =G= LowX(k)
;

upperboundx(k)..
EX(k) =L= UpX(k)
;

lowerboundy(k)..
EY(k) =G= LowY(k)
;

upperboundy(k)..
EY(k) =L= UpY(k)
;

area(k)..
EX(k) * sl_ue_rough * EY(k) * sl_ue_rough =G= Abrutto(k)
;

facilityelements(k,g,kx,ky)$(ord(g)<=F_max(k))..
E(k,kx,ky,g) =E= 1- (
(max((sum(f$(ord(f)<ord(g)),
E(k,kx,ky,f)
) + sum(a$(ord(a)<= EX.L(k)),
sum(b$(ord(b)<= EY.L(k)),
E(k,a,b,g)
)
)
)
,0))
)
/ (
max(1,
(sum(f$(ord(f)<ord(g)),
E(k,kx,ky,f)
) + sum(a$(ord(a)<= EX.L(k)),
sum(b$(ord(b)<= EY.L(k)),
E(k,a,b,g)
)
)
)
)
)

;

I tried to Bypass the issue by using the .L Attribute

Do you have any ideas how i can solve this Problem or what other options i have?
I found some similar Questions here but None got answered…

Best regards and thanks in Advance
Patrick!
Patrosinho
User
User
Posts: 4
Joined: 3 years ago

Re: Variables in summation bounds

Post by Patrosinho »

If it helps, here´s my complete code including the input excel file.
I am first looking at a very slimmed down version, therefore most parts are not relevant for my question.
Datainput.xlsx
(472.87 KiB) Downloaded 170 times

sets
k facility
x horizontal position unit element rough
y vertical position unit element rough
ck condition for placing a facility
v vehicle
kx horizontal position local facility unit element rough
ky vertical position local facility unit element rough
i node
w transportation path segment
m machine
Assign(m,k) Assignment of machine m to facility k
f facility element cell
;

alias(k,l);
alias(f,g);
alias(kx,a);
alias(ky,b);
alias(x,aa);
alias(x,xx);
alias(y,bb);
alias(y,yy);
alias(i,j);
alias(i,ii);
alias(m,n);

parameters
tc(v) transportation cost
fl(k,l,v) material flow
MoveCost_Fac(k) cost for moving the positioned facility
MoveCost_Mach(m) cost for moving the positioned machine
Rest(x,y) indicating resticted elements as binary
LowX(k) lower bound for horizontal facility side length
UpX(k) upper bound for vertical facility side length
LowY(k) lower bound for vertical facility side length
UpY(k) upper bound for vertical facility side length
Anetto(k) net area requirement of facility k
kpath empirical relative factor for path area
sl_ue_rough unit element side length in rough layout
Cond_Fac(x,y,ck) binary parameter whether condition ck is saitisfied at unit element x y
EC_Fac(ck,k) binary parameter indicating whether condition ck is required for placing facility k
Start_Fac_Pos(x,y,k) initital position of bottom left edge of facilty k
Start_Fac_Hor(k) intital horizontal expansion of facility k
Start_Fac_Vert(k) initital vertical expansion of facility k
Start_Mach_Pos(x,y,m) initial position of smallest rectangle enclosing machine m
Start_Mach_Hor(m) initial horizontal length of smallest rectangle enclosing machine m
Start_Mach_Vert(m) initital vertical length of smallest rectangle enclosing machine m
Fixed_Fac(k) facility k is already placed and movement prohibited
Fixed_Mach(m) machine m is already placed and movement prohibited
Perm_Road(x,y) unit element at position x y is part of the permanent fixed transport network
Path_Cost cost for creating and maintain a temporary path element
Aisle_Width(v) required working aisle width for transport vehicle v
Abrutto(k) gross area requirement of facility k
F_max(k) maximum amount of facility elements belonging to facility k
Flow(k,l) 1 if flow between facility k and l is existing
Vehicle(k,l,v) 1 if flow between facility k and l is conducted by vehicle v
;

free variable
Z target value as total cost
Z_trivial_1 target value as total cost for first trivial problem
;

integer variable
EX(k) horizontal expansion of facility k
EY(k) vertical expansion of facility k
d(i,j) length of the arc linking node i and j
Aisle_Width_Node_max(i) maximal working aisle width of all aisles linking to node i
Aisle_Width_Arc_max(i,j) maximal working aisle width of the aisle linking node i and j
dist(k,l) shortest distance connecting facility k and l regarding transportation concerns
dist_trivial(k,l) shortest distance connecting facility k and l regarding transportation concerns for the trivial problem as Euclidic distance
;


binary variable
Moved_Fac(k) facility k is moved or form is modified
Moved_Mach(m) machine m is moved or rotated
Pos(x,y,k) bottom left unit element of facility k is assigned to coordinates x y
E(k,kx,ky,f) facility element f is assigned to local coordinates kx ky
Loc(k,x,y,f) facility element f is assigned to global coordinates x y
Occ_Fac(k,x,y) unit element x y is occupied by an element related to facility k
Edge(x,y,k) unit element x y is part of the outer edge of facility k
In_Fac(x,y,k) input of facility k is located at unit element x y
Out_Fac(x,y,k) output of facility k is located at unit element x y
Node_Fac_Input(x,y,k,i) input node i related to facility k is located at unit element x y
Node_Fac_Output(x,y,k,i) output node i related to facility k is located at unit element x y
Node_Corner(x,y,i) node i at unit element x y is shown to be a corner node
Node_Cross(x,y,i) node i at unit element x y is shown to be a cross node
NDE(i,x,y) node i is located at unit element x y
Road_Ref_Arc(x,y,i,j) unit element x y is referred to as reference path element between the nodes i and j
Road_Ref(x,y) unit element x y is referred to as superior reference path element
Road(x,y) unit element x y is occupied by a path element
Temp_Road(x,y) unit element x y is occupied by a temporary path element
Path(k,l,i,j,w) directed arc linking node i and j is part of the the transportation path and specifically forming the segment w
Neigh_right(i,j) node j is constituted as nearest neighbor to the right side of node i
Neigh_left(i,j) node j is forming the nearest neighbor to the left side of node i
Neigh_above(i,j) node j is forming the nearest neighbot on top of node i
Neigh_below(i,j) node j is constituted as the nearest neighbor below the node i
Neigh(i,j) node j is part of the nearest neighbors around node i
;

*-------------Daten der Testinstanz aus Excel auslesen-----------
$onecho > Datainput.txt

set = k rng=IndizesGrob!A2 Rdim=1
set = x rng=IndizesGrob!C2 Rdim=1
set = y rng=IndizesGrob!E2 Rdim=1
set = ck rng=IndizesGrob!G2 Rdim=1
set = v rng=IndizesGrob!I2 Rdim=1
set = kx rng=IndizesGrob!K2 Rdim=1
set = ky rng=IndizesGrob!M2 Rdim=1
set = i rng=IndizesGrob!O2 Rdim=1
set = w rng=IndizesGrob!Q2 Rdim=1
set = m rng=IndizesGrob!S2 Rdim=1
set = Assign rng=IndizesGrob!U1:Z19 Rdim=1 Cdim=1
set = f rng=IndizesGrob!AB2 Rdim=1


par = LowX rng=ParameterGrob!A2 Rdim=1
par = UpX rng=ParameterGrob!D2 Rdim=1
par = LowY rng=ParameterGrob!G2 Rdim=1
par = UpY rng=ParameterGrob!J2 Rdim=1
par = sl_ue_rough rng=ParameterGrob!M2 Rdim=0
par = kpath rng=ParameterGrob!O2 Rdim=0
par = Anetto rng=ParameterGrob!Q2 Rdim=1
par = Aisle_Width rng=ParameterGrob!A13 Rdim=1
par = Path_Cost rng=ParameterGrob!D13 Rdim=0
par = MoveCost_Fac rng=ParameterGrob!F13 Rdim=1
par = Fixed_Fac rng=ParameterGrob!I13 Rdim=1
par = MoveCost_Mach rng=ParameterGrob!A21 Rdim=1
par = Start_Fac_Hor rng=ParameterGrob!E21 Rdim=1
par = Start_Fac_Vert rng=ParameterGrob!H21 Rdim=1
par = Start_Mach_Hor rng=ParameterGrob!K21 Rdim=1
par = Start_Mach_Vert rng=ParameterGrob!N21 Rdim=1
par = Fixed_Mach rng=ParameterGrob!Q21 Rdim=1
par = tc rng=ParameterGrob!T21 Rdim=1
par = Rest rng=ParameterGrob!A41:P66 Rdim=1 Cdim = 1
par = EC_Fac rng=ParameterGrob!S41:X44 Rdim=1 Cdim = 1
par = Perm_Road rng=ParameterGrob!A73:P98 Rdim=1 Cdim = 1
par = fl rng=ParameterGrob!A106:U112 Rdim=1 Cdim = 2
par = Cond_Fac rng=ParameterGrob!A115:AT141 Rdim=1 Cdim = 2
par = Start_Fac_Pos rng=ParameterGrob!A144:BX170 Rdim=1 Cdim = 2
par = Start_Mach_Pos rng=ParameterGrob!A173:JK199 Rdim=1 Cdim = 2
$offecho

$call GDXXRW i=Datainput.xlsx o=inputs.gdx @Datainput.txt
$GDXIN inputs.gdx
$LOAD k, x, y, ck, v, kx, ky, i, w, m, Assign, f, LowX, UpX, LowY, UpY, sl_ue_rough, kpath, Anetto, Aisle_Width, Path_Cost, MoveCost_Fac, Fixed_Fac, MoveCost_Mach, Start_Fac_Hor, Start_Fac_Vert, Start_Mach_Hor, Start_Mach_Vert, Fixed_Mach, tc, Rest, EC_Fac, Perm_Road, fl, Cond_Fac, Start_Fac_Pos, Start_Mach_Pos
$GDXIN

*-----------Determining further parameters depending on known factors--------

Abrutto(k) = Anetto(k)*kpath;
display Abrutto;

*Anpassung des Parameters F_max um *3/2 (willkuerlich nach Uberlegung der Moglichkeiten als ausreichend gross befunden),
* um der verbindlichen Form eines Rechtecks zu entsprechen und Variationsmoglichkeiten zu ermoglichen
F_max(k) = ceil(Abrutto(k)/(sqr(sl_ue_rough))) * 3/2;
display F_max;

Flow(k,l) = (max(sum(v,fl(k,l,v)),0)) / (max(1,sum(v,fl(k,l,v))));
display Flow;

Vehicle(k,l,v) = max(fl(k,l,v),0)/ max(1,fl(k,l,v));
display Vehicle;

*----------------Model description rough layout planning--------------
*-------------------Equations einfuehren--------------------
equations
cost_trivial_1
cost
lowerboundx(k)
upperboundx(k)
lowerboundy(k)
upperboundy(k)
area(k)
facilityelements(k,g,kx,ky)
facilityposition(k)
facilitylocation(k,f,x,y)
facilitylocation2(k,f)
occupied(k,x,y)
singleoccupied(k,l)
singlecells(x,y)
singlecells_trivial(x,y)
conditions(x,y,k,ck)
facilityedge(k,x,y)
inputedge(k)
outputedge(k)
inputlocation(k,x,y,f)
outputlocation(k,x,y,f)
movedfacility(k)
fixedfacility(k)
movedmachine(k,m)
fixedmachine(k,m)
outputnode(k)
inputnode(k)
outputnodepos(k,x,y)
inputnodepos(k,x,y)
nodenumber(i)
allnodes(i,x,y)
nodepos(x,y)
nodepos2(i)
neighborleft(i,j)
neighborright(i,j)
neighborup(i,j)
neighbordown(i,j)
neighbor(i,j)
neighborpath(i,j)
flowing(k,l)
singlepath(k,l,w)
pathstart(k,l,i)
pathintermediate(k,l,i,w)
pathend(k,l,i)
nodebalance(i)
nodewidth(k,l,i)
arcwidth(k,l,i,j)
noderoad(x,y,i)
outputroad(x,y,k,i)
inputroad(x,y,k,i)
crossnode(x,y,i)
cornernode(x,y,i)
noderefroad(x,y)
pathrefroad(x,y,i,j)
reftransition(x,y)
permroad(x,y)
pathrefroad2(i,j)
temproad(x,y)
arclength(i,j)
distance(k,l)
distance_trivial_1(k,l)
distance_trivial_2(k,l)
;

*---------------Zielfunktion trivial---------------------
cost_trivial_1..
Z_trivial_1 =E= sum(k,
sum(l$(ord(l)<>ord(k)),
sum(v,
tc(v) * fl(k,l,v) * dist_trivial(k,l)
)
)
+ MoveCost_Fac(k) * Moved_Fac(k)
)
+ sum(k,
sum(m$(Assign(m,k)),
MoveCost_Mach(m)*Moved_Mach(m)
)
)
;

*---------------Zielfunktion umfangreich---------------------
cost..
Z =E= sum(k,
sum(l$(ord(l)<>ord(k)),
sum(v,
tc(v) * fl(k,l,v) * dist(k,l)
)
)
+ MoveCost_Fac(k) * Moved_Fac(k)
)
+ sum(x,
sum(y,
Path_Cost * Temp_Road(x,y)
)
)
+ sum(k,
sum(m$(Assign(m,k)),
MoveCost_Mach(m)*Moved_Mach(m)
)
)
;

*----------Grenzen fuer Seitenlaengen der rechteckigen Facilities-------

lowerboundx(k)..
EX(k) =G= LowX(k)
;

upperboundx(k)..
EX(k) =L= UpX(k)
;

lowerboundy(k)..
EY(k) =G= LowY(k)
;

upperboundy(k)..
EY(k) =L= UpY(k)
;

area(k)..
EX(k) * sl_ue_rough * EY(k) * sl_ue_rough =G= Abrutto(k)
;

facilityelements(k,g,kx,ky)$(ord(g)<=F_max(k))..
E(k,kx,ky,g) =E= 1- (
(max((sum(f$(ord(f)<ord(g)),
E(k,kx,ky,f)
) + sum(a$(ord(a)<= EX.l(k)),
sum(b$(ord(b)<= EY.l(k)),
E(k,a,b,g)
)
)
)
,0))
)
/ (
max(1,
(sum(f$(ord(f)<ord(g)),
E(k,kx,ky,f)
) + sum(a$(ord(a)<= EX.l(k)),
sum(b$(ord(b)<= EY.l(k)),
E(k,a,b,g)
)
)
)
)
)

;

facilityposition(k)..
sum(x,
sum(y,
Pos(x,y,k)
)
) =E= 1
;

facilitylocation(k,f,x,y)$( ord(f)<=F_max(k) )..
Loc(k,x,y,f) =E= sum(aa,
sum(bb,
sum(kx$(ord(kx) = ord(x)+1-ord(aa)),
sum(ky$(ord(ky) = ord(y)+1-ord(bb)) ,
Pos(aa,bb,k)*E(k,kx,ky,f)
)
)
)
)
;

facilitylocation2(k,f)$(ord(f)<=F_max(k))..
sum(x,
sum(y,
Loc(k,x,y,f)
)
)
=E= 1
;

occupied(k,x,y)..
Occ_Fac(k,x,y) =E= sum(f$(ord(f)<=F_max(k)),
Loc(k,x,y,f)
)
;

singleoccupied(k,l)$(ord(k) <> ord(l))..
sum(x,
sum(y,
Occ_Fac(k,x,y)*Occ_Fac(l,x,y)
)
)
=E= 0
;


singlecells(x,y)..
sum(k,
Occ_Fac(k,x,y)
)
+ Rest(x,y) + Road(x,y) =L= 1
;

singlecells_trivial(x,y)..
sum(k,
Occ_Fac(k,x,y)
)
+ Rest(x,y) =L= 1
;

conditions(x,y,k,ck)..
EC_Fac(ck,k) * Occ_Fac(k,x,y) =E= EC_Fac(ck,k) * Occ_Fac(k,x,y) * Cond_Fac(x,y,ck);


facilityedge(k,x,y)..
Edge(x,y,k) =E= sum(f$(ord(f)<=F_max(k)),
sum(aa,
sum(bb,
sum(kx$(ord(kx) = ord(x)+1-ord(aa)),
sum(ky$(ord(ky) = ord(y)+1-ord(bb)) ,
Pos(aa,bb,k)*E(k,kx,ky,f) *
(
(max((
(1-(
(max(ord(x),ord(aa)) - ord(aa))
/ (max(1,(ord(x)-ord(aa))))
)) *
(1-(
(max(ord(aa),ord(x)) - ord(x))
/ (max(1,(ord(aa)-ord(x))))
))
+ (1-(
(max(ord(y),ord(bb)) - ord(bb))
/ (max(1,(ord(y)-ord(bb))))
)) *
(1-(
(max(ord(bb),ord(y)) - ord(y))
/ (max(1,(ord(bb)-ord(y))))
))
+ (1-(
(max(ord(x),(ord(aa) + EX.l(k))) - (ord(aa) + EX.l(k)))
/ (max(1,(ord(x)-(ord(aa) + EX.l(k)))))
)) *
(1-(
(max((ord(aa) + EX.l(k)),ord(x)) - ord(x))
/ (max(1,((ord(aa) + EX.l(k))-ord(x))))
))
+ (1-(
(max(ord(y),(ord(bb) + EY.l(k))) - (ord(bb) + EY.l(k)))
/ (max(1,(ord(y)-(ord(bb) + EY.l(k)))))
)) *
(1-(
(max((ord(bb) + EY.l(k)),ord(y)) - ord(y))
/ (max(1,((ord(bb) + EY.l(k))-ord(y))))
))


)
,0))
)
/ (
max(1,
(
(1-(
(max(ord(x),ord(aa)) - ord(aa))
/ (max(1,(ord(x)-ord(aa))))
)) *
(1-(
(max(ord(aa),ord(x)) - ord(x))
/ (max(1,(ord(aa)-ord(x))))
))
+ (1-(
(max(ord(y),ord(bb)) - ord(bb))
/ (max(1,(ord(y)-ord(bb))))
)) *
(1-(
(max(ord(bb),ord(y)) - ord(y))
/ (max(1,(ord(bb)-ord(y))))
))
+ (1-(
(max(ord(x),(ord(aa) + EX.l(k))) - (ord(aa) + EX.l(k)))
/ (max(1,(ord(x)-(ord(aa) + EX.l(k)))))
)) *
(1-(
(max((ord(aa) + EX.l(k)),ord(x)) - ord(x))
/ (max(1,((ord(aa) + EX.l(k))-ord(x))))
))
+ (1-(
(max(ord(y),(ord(bb) + EY.l(k))) - (ord(bb) + EY.l(k)))
/ (max(1,(ord(y)-(ord(bb) + EY.l(k)))))
)) *
(1-(
(max((ord(bb) + EY.l(k)),ord(y)) - ord(y))
/ (max(1,((ord(bb) + EY.l(k))-ord(y))))
))


))
)
)
)
)
)
)
;

inputedge(k)..
sum(x,
sum(y,
In_Fac(x,y,k)*Edge(x,y,k)
)
)
=E= 1
;

outputedge(k)..
sum(x,
sum(y,
Out_Fac(x,y,k)*Edge(x,y,k)
)
)
=E= 1
;

inputlocation(k,x,y,f)$(ord(f)=1)..
Loc(k,x,y,f) =E= In_Fac(x,y,k)
;

outputlocation(k,x,y,f)$(ord(f)=2)..
Loc(k,x,y,f) =E= Out_Fac(x,y,k)
;


movedfacility(k)..
Moved_Fac(k)=E=
(
(max((sum(x,
sum(y,
Start_Fac_Pos(x,y,k) * (1 - Occ_Fac(k,x,y) )
)
) + 1 -

(1-(
(max(Start_Fac_Hor(k),EX.l(k)) - EX.l(k))
/ (max(1,(Start_Fac_Hor(k)-EX.l(k))))
)) *
(1-(
(max(EX.l(k),Start_Fac_Hor(k)) - Start_Fac_Hor(k))
/ (max(1,(EX.l(k)-Start_Fac_Hor(k))))
))
+ 1 -
(1-(
(max(Start_Fac_Vert(k),EY.l(k)) - EY.l(k))
/ (max(1,(Start_Fac_Vert(k)-EY.l(k))))
)) *
(1-(
(max(EY.l(k),Start_Fac_Vert(k)) - Start_Fac_Vert(k))
/ (max(1,(EY.l(k)-Start_Fac_Vert(k))))
))
),0))
)
/ (
max(1,((sum(x,
sum(y,
Start_Fac_Pos(x,y,k) * (1 - Occ_Fac(k,x,y) )
)
) + 1 -

(1-(
(max(Start_Fac_Hor(k),EX.l(k)) - EX.l(k))
/ (max(1,(Start_Fac_Hor(k)-EX.l(k))))
)) *
(1-(
(max(EX.l(k),Start_Fac_Hor(k)) - Start_Fac_Hor(k))
/ (max(1,(EX.l(k)-Start_Fac_Hor(k))))
))
+ 1 -
(1-(
(max(Start_Fac_Vert(k),EY.l(k)) - EY.l(k))
/ (max(1,(Start_Fac_Vert(k)-EY.l(k))))
)) *
(1-(
(max(EY.l(k),Start_Fac_Vert(k)) - Start_Fac_Vert(k))
/ (max(1,(EY.l(k)-Start_Fac_Vert(k))))
))
)))
)
;

fixedfacility(k)..
Fixed_Fac(k) * Moved_Fac(k) =E= 0
;

movedmachine(k,m)$(Assign(m,k))..
Moved_Mach(m)=E=
(
max((Start_Mach_Hor(m) * Start_Mach_Vert(m)
- sum(x,
sum(y,
Start_Mach_Pos(x,y,m)*
sum(aa$( (ord(aa)>= ord(x)) and (ord(aa)<= ord(x) + Start_Mach_Hor(m) - 1) ),
sum(bb$( (ord(bb)>= ord(y)) and (ord(bb)<= ord(y) + Start_Mach_Vert(m) - 1) ),
Occ_Fac(k,aa,bb)
)
)
)
)
+ sum(x,
sum(y,
Start_Mach_Pos(x,y,m)*
sum(aa$( (ord(aa)>= ord(x)) and (ord(aa)<= ord(x) + Start_Mach_Hor(m) - 1) ),
sum(bb$( (ord(bb)>= ord(y)) and (ord(bb)<= ord(y) + Start_Mach_Vert(m) - 1) ),
In_Fac(aa,bb,k)
)
)
)
)
+ sum(x,
sum(y,
Start_Mach_Pos(x,y,m)*
sum(aa$( (ord(aa)>= ord(x)) and (ord(aa)<= ord(x) + Start_Mach_Hor(m) - 1) ),
sum(bb$( (ord(bb)>= ord(y)) and (ord(bb)<= ord(y) + Start_Mach_Vert(m) - 1) ),
Out_Fac(aa,bb,k)
)
)
)
)
)
,0)
)
/ (
max(1,(Start_Mach_Hor(m) * Start_Mach_Vert(m)
- sum(x,
sum(y,
Start_Mach_Pos(x,y,m)*
sum(aa$( (ord(aa)>= ord(x)) and (ord(aa)<= ord(x) + Start_Mach_Hor(m) - 1) ),
sum(bb$( (ord(bb)>= ord(y)) and (ord(bb)<= ord(y) + Start_Mach_Vert(m) - 1) ),
Occ_Fac(k,aa,bb)
)
)
)
)
+ sum(x,
sum(y,
Start_Mach_Pos(x,y,m)*
sum(aa$( (ord(aa)>= ord(x)) and (ord(aa)<= ord(x) + Start_Mach_Hor(m) - 1) ),
sum(bb$( (ord(bb)>= ord(y)) and (ord(bb)<= ord(y) + Start_Mach_Vert(m) - 1) ),
In_Fac(aa,bb,k)
)
)
)
)
+ sum(x,
sum(y,
Start_Mach_Pos(x,y,m)*
sum(aa$( (ord(aa)>= ord(x)) and (ord(aa)<= ord(x) + Start_Mach_Hor(m) - 1) ),
sum(bb$( (ord(bb)>= ord(y)) and (ord(bb)<= ord(y) + Start_Mach_Vert(m) - 1) ),
Out_Fac(aa,bb,k)
)
)
)
)
))
)
;

fixedmachine(k,m)$(Assign(m,k))..
Fixed_Mach(m)*Moved_Mach(m) =E= 0
;
outputnode(k)..
sum(i,
sum(x,
sum(y,
Node_Fac_Output(x,y,k,i)
)
)
)
=E= 1
;

inputnode(k)..
sum(i,
sum(x,
sum(y,
Node_Fac_Input(x,y,k,i)
)
)
)
=E= 1
;

outputnodepos(k,x,y)..
sum(i,
Node_Fac_Output(x,y,k,i)
)
=E= Out_Fac(x,y,k)
;

inputnodepos(k,x,y)..
sum(i,
Node_Fac_Input(x,y,k,i)
)
=E= In_Fac(x,y,k)
;

nodenumber(i)$(ord(i)>1)..
sum(x,
sum(y,
NDE(i,x,y)
)
)
=L= sum(x,
sum(y,
NDE(i-1,x,y)
)
)
;

allnodes(i,x,y)..
NDE(i,x,y) =E=
(
max((sum(k,
Node_Fac_Input(x,y,k,i) + Node_Fac_Output(x,y,k,i)
) + Node_Corner(x,y,i) + Node_Cross(x,y,i)
)
,0)
)
/ (
max(1,(sum(k,
Node_Fac_Input(x,y,k,i) + Node_Fac_Output(x,y,k,i)
) + Node_Corner(x,y,i) + Node_Cross(x,y,i)
))
)
;

nodepos(x,y)..
sum(i,
NDE(i,x,y)
)
=L= 1
;

nodepos2(i)..
sum(x,
sum(y,
NDE(i,x,y)
)
)
=L= 1
;

neighborleft(i,j)$(ord(i)<>ord(j))..
Neigh_left(i,j) =E= 1;

neighborright(i,j)$(ord(i)<>ord(j))..
Neigh_right(i,j) =E= 1;


neighborup(i,j)$(ord(i)<>ord(j))..
Neigh_above(i,j) =E= 1;

neighbordown(i,j)$(ord(i)<>ord(j))..
Neigh_below(i,j) =E= 1;

neighbor(i,j)$(ord(i)<>ord(j))..
Neigh(i,j) =E= Neigh_right(i,j) + Neigh_left(i,j) + Neigh_above(i,j) + Neigh_below(i,j);

neighborpath(i,j)$(ord(i)<ord(j))..
sum(k,
sum(l$(ord(l)<>ord(k)),
sum(w, Path(k,l,i,j,w) + Path(k,l,j,i,w)
)
)
)
=L= Neigh(i,j);

flowing(k,l)$(ord(k)<>ord(l))..
sum(i,
sum(j$(ord(j)<>ord(i)),
sum(w,
Path(k,l,i,j,w)
)
)
)
=L= Flow(k,l);

singlepath(k,l,w)$(ord(k)<>ord(l))..
sum(i,
sum(j$(ord(j)<>ord(i)),
Path(k,l,i,j,w)
)
)
=L= 1
;

pathstart(k,l,i)$(ord(k)<>ord(l))..
sum(j,
Path(k,l,i,j,'1')
)
=E= sum(x,
sum(y,
Node_Fac_Output(x,y,k,i)
)
);

pathintermediate(k,l,i,w)$((ord(k)<>ord(l)) and (ord(w)>1))..
sum(j,
Path(k,l,i,j,w-1)
) * (1- sum(x,
sum(y,
Node_Fac_Input(x,y,l,i)
)
)
) =E= sum(j,
Path(k,l,i,j,w)
)
;

pathend(k,l,i)$(ord(k)<>ord(l))..
sum(j,
sum(w,
Path(k,l,j,i,w)
)
) =E=
sum(x,
sum(y,
Node_Fac_Input(x,y,l,i)
)
);

nodebalance(i)..
sum(j$(ord(j)<>ord(i)),
sum(w,
sum(k,
sum(l$(ord(l)<>ord(k)),
Path(k,l,j,i,w) - Path(k,l,i,j,w)
)
)
)
) =E= sum(k,
sum(x,
sum(y,
Node_Fac_Input(x,y,k,i)* sum(l$(ord(l)<>ord(k)),
Flow(l,k)
)
- Node_Fac_Output(x,y,k,i) * sum(l$(ord(l)<>ord(k)),
Flow(k,l)
)
)
)
)
;

nodewidth(k,l,i)$(ord(k)<>ord(l))..
Aisle_Width_Node_max(i) =G=
sum(v,
((max(
(sum(j$(ord(j)<>ord(i)),
sum(w,
Path(k,l,j,i,w) + Path(k,l,i,j,w)
)
))
,0
)
)/
(max(
1,
(sum(j$(ord(j)<>ord(i)),
sum(w,
Path(k,l,j,i,w) + Path(k,l,i,j,w)
)
))
)
))
* Vehicle(k,l,v) * Aisle_Width(v)
)
;


arcwidth(k,l,i,j)$(ord(k)<>ord(l) and ord(i)<>ord(j))..
Aisle_Width_Arc_max(i,j) =G=
sum(v,

(max(
(sum(w,
Path(k,l,j,i,w) + Path(k,l,i,j,w)
))
,0
)
)/
(max(
1,
(sum(w,
Path(k,l,j,i,w) + Path(k,l,i,j,w)
))
)
)
* Vehicle(k,l,v) * Aisle_Width(v)
)
;

noderoad(x,y,i)..
sum(aa$(ord(aa)<= Aisle_Width_Node_max.l(i)),
sum(bb$(ord(bb)<= Aisle_Width_Node_max.l(i)),
Node_Corner(x,y,i) + Node_Cross(x,y,i)
)
)
=L=
sum(aa$( (ord(aa) >= ord(x)) and (ord(aa)<= ord(x) + Aisle_Width_Node_max.l(i) - 1) ),
sum(bb$( (ord(bb) >= ord(y)) and (ord(bb)<= ord(y) + Aisle_Width_Node_max.l(i) - 1) ),
Road(aa,bb)
)
)
;

outputroad(x,y,k,i)..
sum(xx$( ord(xx)<= ceil( (Aisle_Width_Node_max.l(i))/2 ) ),
Node_Fac_Output(x,y,k,i)
)
=L= sum(aa,
sum(bb,
sum(xx$( ord(xx)<= ord(x) + ceil( (Aisle_Width_Node_max.l(i))/2 ) -1 ),
Pos(aa,bb,k)*Occ_Fac(k,xx,y)*
(
(1 -
(max(
ord(y)
,ord(bb)
) - ord(bb)
)/
(max(
1,
ord(y) - ord(bb)
)
)
) *
(1 -
(max(
ord(bb)
,ord(y)
) - ord(y)
)/
(max(
1,
ord(bb) - ord(y)
)
)
)


+
(1 -
(max(
ord(y)
,(ord(bb)+ EY.l(k))
) - (ord(bb)+ EY.l(k))
)/
(max(
1,
ord(y) - (ord(bb)+ EY.l(k))
)
)
) *
(1 -
(max(
(ord(bb)+ EY.l(k))
,ord(y)
) - ord(y)
)/
(max(
1,
(ord(bb)+ EY.l(k)) - ord(y)
)
)
)

)
)
+ sum(yy$( ord(yy)<= ord(y) + ceil( (Aisle_Width_Node_max.l(i))/2 ) -1 ),
Pos(aa,bb,k)*Occ_Fac(k,x,yy)*
(
(1 -
(max(
ord(x)
,ord(aa)
) - ord(aa)
)/
(max(
1,
ord(x) - ord(aa)
)
)
) *
(1 -
(max(
ord(aa)
,ord(x)
) - ord(x)
)/
(max(
1,
ord(aa) - ord(x)
)
)
)


+
(1 -
(max(
ord(x)
,(ord(aa)+ EX.l(k))
) - (ord(aa)+ EX.l(k))
)/
(max(
1,
ord(x) - (ord(aa)+ EX.l(k))
)
)
) *
(1 -
(max(
(ord(aa)+ EX.l(k))
,ord(x)
) - ord(x)
)/
(max(
1,
(ord(aa)+ EX.l(k)) - ord(x)
)
)
)

) * (1 -
(
(1 -
(max(
ord(y)
,ord(bb)
) - ord(bb)
)/
(max(
1,
ord(y) - ord(bb)
)
)
) *
(1 -
(max(
ord(bb)
,ord(y)
) - ord(y)
)/
(max(
1,
ord(bb) - ord(y)
)
)
)


+
(1 -
(max(
ord(y)
,(ord(bb)+ EY.l(k))
) - (ord(bb)+ EY.l(k))
)/
(max(
1,
ord(y) - (ord(bb)+ EY.l(k))
)
)
) *
(1 -
(max(
(ord(bb)+ EY.l(k))
,ord(y)
) - ord(y)
)/
(max(
1,
(ord(bb)+ EY.l(k)) - ord(y)
)
)
)

)
)
)
)
)
;

inputroad(x,y,k,i)..
sum(a$(ord(a)<=( ceil( Aisle_Width_Node_max.l(i))/2 ) ),
Node_Fac_Input(x,y,k,i)
)
=L= sum(aa,
sum(bb,
sum(xx$( ord(xx)<= ord(x) + ceil( (Aisle_Width_Node_max.l(i))/2 ) -1 ),
Pos(aa,bb,k)*Occ_Fac(k,xx,y)*
(
(1 -
(max(
ord(y)
,ord(bb)
) - ord(bb)
)/
(max(
1,
ord(y) - ord(bb)
)
)
) *
(1 -
(max(
ord(bb)
,ord(y)
) - ord(y)
)/
(max(
1,
ord(bb) - ord(y)
)
)
)


+
(1 -
(max(
ord(y)
,(ord(bb)+ EY.l(k))
) - (ord(bb)+ EY.l(k))
)/
(max(
1,
ord(y) - (ord(bb)+ EY.l(k))
)
)
) *
(1 -
(max(
(ord(bb)+ EY.l(k))
,ord(y)
) - ord(y)
)/
(max(
1,
(ord(bb)+ EY.l(k)) - ord(y)
)
)
)

)
)
+ sum(yy$( ord(yy)<= ord(y) + ceil( (Aisle_Width_Node_max.l(i))/2 ) -1 ),
+ Pos(aa,bb,k)*Occ_Fac(k,x,yy)*
(
(1 -
(max(
ord(x)
,ord(aa)
) - ord(aa)
)/
(max(
1,
ord(x) - ord(aa)
)
)
) *
(1 -
(max(
ord(aa)
,ord(x)
) - ord(x)
)/
(max(
1,
ord(aa) - ord(x)
)
)
)


+
(1 -
(max(
ord(x)
,(ord(aa)+ EX.l(k))
) - (ord(aa)+ EX.l(k))
)/
(max(
1,
ord(x) - (ord(aa)+ EX.l(k))
)
)
) *
(1 -
(max(
(ord(aa)+ EX.l(k))
,ord(x)
) - ord(x)
)/
(max(
1,
(ord(aa)+ EX.l(k)) - ord(x)
)
)
)

) * (1 -
(
(1 -
(max(
ord(y)
,ord(bb)
) - ord(bb)
)/
(max(
1,
ord(y) - ord(bb)
)
)
) *
(1 -
(max(
ord(bb)
,ord(y)
) - ord(y)
)/
(max(
1,
ord(bb) - ord(y)
)
)
)


+
(1 -
(max(
ord(y)
,(ord(bb)+ EY.l(k))
) - (ord(bb)+ EY.l(k))
)/
(max(
1,
ord(y) - (ord(bb)+ EY.l(k))
)
)
) *
(1 -
(max(
(ord(bb)+ EY.l(k))
,ord(y)
) - ord(y)
)/
(max(
1,
(ord(bb)+ EY.l(k)) - ord(y)
)
)
)

)
)
)
)
)
;

crossnode(x,y,i)..
Node_Cross(x,y,i) =G=
(max(
(Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))+
Road_Ref(x-1,y)+ Road_Ref(x,y-1)
)
,2
) - 2
)/
(max(
1,
(Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))+
Road_Ref(x-1,y)+ Road_Ref(x,y-1)
)
- 2
)
)
;

cornernode(x,y,i)..
2 + Node_Corner(x,y,i) =G=
(1 -
(max(
(Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i)) +
Road_Ref(x-1,y) + Road_Ref(x,y-1)
)
,2
) - 2
)/
(max(
1,
(Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i)) +
Road_Ref(x-1,y) + Road_Ref(x,y-1)
)
- 2
)
)
) *
(1 -
(max(
2
,(Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i)) +
Road_Ref(x-1,y) + Road_Ref(x,y-1)
)
) - (Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i)) +
Road_Ref(x-1,y) + Road_Ref(x,y-1)
)
)/
(max(
1,
2 - (Road_Ref(x+Aisle_Width_Node_max.l(i),y) + Road_Ref(x,y+Aisle_Width_Node_max.l(i)) +
Road_Ref(x-1,y) + Road_Ref(x,y-1)
)
)
)
)
+ (1 -
(max(
(Road_Ref(x,y-1) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))
)
,1
) - 1
)/
(max(
1,
(Road_Ref(x,y-1) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))
) - 1
)
)
) *
(1 -
(max(
1
,(Road_Ref(x,y-1) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))
)
) - (Road_Ref(x,y-1) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))
)
)/
(max(
1,
1 - (Road_Ref(x,y-1) + Road_Ref(x,y+Aisle_Width_Node_max.l(i))
)
)
)
)
+ (1 -
(max(
(Road_Ref(x-1,y) + Road_Ref(x+Aisle_Width_Node_max.l(i),y)
)
,1
) - 1
)/
(max(
1,
(Road_Ref(x-1,y) + Road_Ref(x+Aisle_Width_Node_max.l(i),y)
)
- 1
)
)
) *
(1 -
(max(
1
,(Road_Ref(x-1,y) + Road_Ref(x+Aisle_Width_Node_max.l(i),y)
)
) - (Road_Ref(x-1,y) + Road_Ref(x+Aisle_Width_Node_max.l(i),y)
)
)/
(max(
1,
1 - (Road_Ref(x-1,y) + Road_Ref(x+Aisle_Width_Node_max.l(i),y)
)
)
)
)
;

noderefroad(x,y)..
sum(i,
NDE(i,x,y)
)
=L= Road_Ref(x,y)
;

pathrefroad(x,y,i,j)$(ord(i)<>ord(j))..
Road_Ref_Arc(x,y,i,j) =G=
(max(
(sum(k,
sum(l$(ord(l)<>ord(k)),
sum(w,
Path(k,l,j,i,w) + Path(k,l,i,j,w)
)
)
))
,0
)
)/
(max(
1,
(sum(k,
sum(l$(ord(l)<>ord(k)),
sum(w,
Path(k,l,j,i,w) + Path(k,l,i,j,w)
)
)
))
)
)*
( Neigh_right(i,j) *
(max(
ord(x)
,(sum(aa$(ord(aa)<ord(x)),
NDE(i,aa,y) * ord(aa)
) + Aisle_Width_Node_max.l(i) - 1
)
) - (sum(aa$(ord(aa)<ord(x)),
NDE(i,aa,y) * ord(aa)
) + Aisle_Width_Node_max.l(i) - 1
)
)/
(max(
1,
ord(x) - (sum(aa$(ord(aa)<ord(x)),
NDE(i,aa,y) * ord(aa)
) + Aisle_Width_Node_max.l(i) - 1
)
)
)
* (max(
(sum(aa$(ord(aa)>ord(x)),
NDE(j,aa,y) * ord(aa)
))
,ord(x)
) - ord(x)
)/
(max(
1,
(sum(aa$(ord(aa)>ord(x)),
NDE(j,aa,y) * ord(aa)
)) - ord(x)
)
)
+ Neigh_left(i,j) *
(max(
ord(x)
,(sum(aa$(ord(aa)<ord(x)),
NDE(j,aa,y) * ord(aa)
) + Aisle_Width_Node_max.l(j) - 1
)
) - (sum(aa$(ord(aa)<ord(x)),
NDE(j,aa,y) * ord(aa)
) + Aisle_Width_Node_max.l(j) - 1
)
)/
(max(
1,
ord(x) - (sum(aa$(ord(aa)<ord(x)),
NDE(j,aa,y) * ord(aa)
) + Aisle_Width_Node_max.l(j) - 1
)
)
) * (max(
(sum(aa$(ord(aa)>ord(x)),
NDE(i,aa,y) * ord(aa)
))
,ord(x)
) - ord(x)
)/
(max(
1,
(sum(aa$(ord(aa)>ord(x)),
NDE(i,aa,y) * ord(aa)
)) - ord(x)
)
)
+ Neigh_above(i,j) *
(max(
ord(y)
,(sum(bb$(ord(bb)<ord(y)),
NDE(i,x,bb) * ord(bb)
) + Aisle_Width_Node_max.l(i) - 1
)
) - (sum(bb$(ord(bb)<ord(y)),
NDE(i,x,bb) * ord(bb)
) + Aisle_Width_Node_max.l(i) - 1
)
)/
(max(
1,
ord(y) - (sum(bb$(ord(bb)<ord(y)),
NDE(i,x,bb) * ord(bb)
) + Aisle_Width_Node_max.l(i) - 1
)
)
) * (max(
(sum(bb$(ord(bb)>ord(y)),
NDE(j,x,bb) * ord(bb)
))
,ord(y)
) - ord(y)
)/
(max(
1,
(sum(bb$(ord(bb)>ord(y)),
NDE(j,x,bb) * ord(bb)
)) - ord(y)
)
)
+ Neigh_below(i,j) *
(max(
ord(y)
,(sum(bb$(ord(bb)<ord(y)),
NDE(j,x,bb) * ord(bb)
) + Aisle_Width_Node_max.l(j) - 1
)
) - (sum(bb$(ord(bb)<ord(y)),
NDE(j,x,bb) * ord(bb)
) + Aisle_Width_Node_max.l(j) - 1
)
)/
(max(
1,
ord(y) - (sum(bb$(ord(bb)<ord(y)),
NDE(j,x,bb) * ord(bb)
) + Aisle_Width_Node_max.l(j) - 1
)
)
)
* (max(
(sum(bb$(ord(bb)>ord(y)),
NDE(i,x,bb) * ord(bb)
))
,ord(y)
) - ord(y)
)/
(max(
1,
(sum(bb$(ord(bb)>ord(y)),
NDE(i,x,bb) * ord(bb)
)) - ord(y)
)
)
)
;

reftransition(x,y)..
Road_Ref(x,y) =G=
sum(i,
sum(j$(ord(j)<>ord(i)),
Road_Ref_Arc(x,y,i,j)
)
)
;

permroad(x,y)..
Perm_Road(x,y) =L= Road(x,y)
;

pathrefroad2(i,j)$(ord(i)<>ord(j))..
Aisle_Width_Arc_max(i,j) =L=
sum(aa,
sum(bb,
Road_Ref_Arc(aa,bb,i,j) *
(
(Neigh_right(i,j) + Neigh_left(i,j))
* sum(yy$( (ord(yy) >= ord(bb)) and (ord(yy) <= ord(bb) + Aisle_Width_Arc_max.l(i,j) -1) ),
Road(aa,yy)
)
+ (Neigh_above(i,j) + Neigh_below(i,j))
* sum(xx$( (ord(xx) >= ord(aa)) and (ord(xx) <= ord(aa) + Aisle_Width_Arc_max.l(i,j) -1) ),
Road(xx,bb)
)
)

)
)
;

temproad(x,y)..
Road(x,y) - Perm_Road(x,y) =E= Temp_Road(x,y)
;

arclength(i,j)$(ord(i)<>ord(j))..
d(i,j) =E=
sum(x,
sum(y,
Neigh_left(i,j) *
(NDE(i,x,y)*ord(x)-NDE(j,x,y)*ord(x))
+ Neigh_right(i,j) *
(NDE(j,x,y)*ord(x) -NDE(i,x,y)* ord(x))
+ Neigh_above(i,j) *
(NDE(j,x,y)*ord(y) -NDE(i,x,y)*ord(y))
+ Neigh_below(i,j)*
(NDE(i,x,y)*ord(y) - NDE(j,x,y)* ord(y))
)
)
;

distance(k,l)$(ord(k)<>ord(l))..
dist(k,l) =G=
sum(w,
sum(i,
sum(j$(ord(j)<>ord(i)),
d(i,j) * Path(k,l,i,j,w)
)
)
)
;

distance_trivial_1(k,l)$(ord(k)<>ord(l))..
dist_trivial(k,l) =G=
sum(x,
sum(y,
In_Fac(x,y,l) * ord(x) - Out_Fac{x,y,k} * ord(x)
+ In_Fac(x,y,l) * ord(y) - Out_Fac{x,y,k} * ord(y)
)
)
;

distance_trivial_2(k,l)$(ord(k)<>ord(l))..
dist_trivial(k,l) =G=
sum(x,
sum(y,
Out_Fac{x,y,k} * ord(x) - In_Fac(x,y,l) * ord(x)
+ Out_Fac{x,y,k} * ord(y) - In_Fac(x,y,l) * ord(y)
)
)
;
Model trivialrough /cost_trivial_1,
lowerboundx,
upperboundx,
lowerboundy,
upperboundy,
area,
facilityelements,
facilityposition,
facilitylocation,
facilitylocation2,
occupied,
singleoccupied,
singlecells_trivial,
conditions,
facilityedge,
inputedge,
outputedge,
inputlocation,
outputlocation,
movedfacility,
fixedfacility,
movedmachine,
fixedmachine,
distance_trivial_1,
distance_trivial_2
/;

trivialrough.optcr = 0.00;
trivialrough.reslim = 60;
trivialrough.iterlim = 1000000;

options
intVarUp = 0;

Solve trivialrough using MINLP minimizing Z_trivial_1;
Post Reply