Description
This model is designed to find the optimal size and location of ammonia and fertilizer plants. Three formulations are suggested. MIP, expanded LP and enumeration are used.
Large Model of Types : MIP rmip
Category : GAMS Model library
Main file : vietman.gms
$title Vietorisz/Manne Fertilizer Model 1961 (VIETMAN,SEQ=30)
$onText
This model is designed to find the optimal size and location
of ammonia and fertilizer plants. Three formulations are suggested.
MIP, expanded LP and enumeration are used.
Manne, A S, and Vietoriscz Thomas, Chemical Processes, Plant Location,
and Economies of Scale. In Manne, A S, and Markowitz, H M, Eds,
Studies in Process Analysis. John Wiley and Sons, New York and London,
1963, p. 136.
Keywords: mixed integer linear programming, relaxed mixed integer linear programming,
location problem, micro economics
$offText
Set
i 'sources of ammonia and fertilizer' / 0*5 /
id(i) 'domestic sources - plants' / 1*5 /
k 'demand centers' / 1*12 /;
Alias (i,j), (id,jd);
Table fc(i,*) 'fixed cost of plant erection'
ammonia fertilizer
1 1760 810
2 1656 951
3 1626 754
4 1784 856
5 1782 852;
Table c(i,j) 'production and shipping cost for ammonia'
1 2 3 4 5
0 56.0 47.4 47.6 54.4 51.0
1 20.4 33.6 34.5 26.9 29.5
2 33.4 20.2 26.7 31.3 28.1
3 35.3 27.7 21.2 35.0 32.2
4 41.8 46.4 49.1 35.3 42.1
5 43.0 41.8 44.9 40.7 33.9;
Table d(j,k) 'production and shipping cost for fertilizer'
1 2 3 4 5 6 7 8 9 10 11 12
0 86.1 76.4 76.8 87.0 83.6 90.3 75.4 76.4 81.2 96.4 82.4 86.4
1 32.2 44.0 45.8 31.5 34.1 42.0 43.0 40.3 37.8 42.9 36.6 30.8
2 36.6 24.4 29.2 37.6 34.2 41.0 26.1 24.2 29.9 48.9 31.9 37.6
3 37.0 27.9 23.1 41.3 38.4 40.9 24.7 26.8 29.6 52.8 32.6 41.3
4 38.5 41.9 48.0 23.2 32.2 48.5 44.6 44.1 43.1 34.5 42.4 28.9
5 44.0 35.3 41.1 33.2 29.8 54.1 37.7 37.1 42.8 44.6 44.4 32.6;
Parameter r(k) 'fertilizer demand' / 1 9.2, 7 168.6, 2 59.9, 8 50.0
3 95.8, 9 34.0, 4 185.3, 10 11.1
5 344.1, 11 109.5, 6 66.1, 12 47.0 /;
Scalar bigm;
bigm = sum(k, r(k));
display bigm;
$sTitle Model
Variable
x(i,jd) 'ammonia shipment'
y(j,k) 'fertilizer shipments'
u(i,j,k) 'tagged product shipments'
z(jd) 'fertilizer decision'
w(id) 'ammonia decision'
tc 'total cost';
Positive Variable x, y, u;
Binary Variable z, w;
Equation
fd(k) 'final demand balance'
fd1(k) 'final demand balance (tagged)'
ab(jd) 'ammonia balance'
ia(id) 'integer constraint ammonia'
ia1(id,k) 'integer constraint ammonia (tagged)'
ifu(jd) 'integer constraint fertilizer'
ift(jd,k) 'integer constraint fertilizer (tagged)'
ta 'total cost balance'
ta1 'total cost balance (tagged)';
ab(jd).. sum(i, x(i,jd)) =g= sum(k, y(jd,k));
fd(k).. sum(j, y(j,k)) =g= r(k);
ia(id).. bigm*w(id) =g= sum(jd, x(id,jd));
ifu(jd).. bigm*z(jd) =g= sum(k, y(jd,k));
ta.. tc =e= sum(id, fc(id,"ammonia")*w(id))
+ sum(jd, fc(jd,"fertilizer")*z(jd))
+ sum((i,jd), c(i,jd)*x(i,jd))
+ sum((j,k), d(j,k)*y(j,k));
fd1(k) .. sum((i,j), u(i,j,k)) =g= r(k);
ia1(id,k).. r(k)*w(id) =g= sum(jd, u(id,jd,k));
ift(jd,k).. r(k)*z(jd) =g= sum(i, u(i,jd,k));
ta1.. tc =e= sum(id, fc(id,"ammonia")*w(id))
+ sum(jd, fc(jd,"fertilizer")*z(jd))
+ sum((i,j,k), (c(i,j)+d(j,k))*u(i,j,k));
Model
vietmip 'mip version' / fd, ab, ia, ifu, ta /
viettag 'expanded version' / fd1, ia1, ift, ta1 /;
solve vietmip minimizing tc using mip;
solve viettag minimizing tc using rmip;
$sTitle Enumeration
Set
c32 'labels 1 to 32' / 1*32 /
type 'product types' / ammonia, fertilizer /;
Alias (c32,c32p);
Parameter
pow2(id) 'powers of 2'
com32(c32,i) 'combinations'
tfix(c32,type) 'total fixed cost at location'
minamm(c32,i) 'minimum ammonia cost'
minfer(c32,c32p) 'minimum fertilizer cost'
fccom(c32,c32p) 'fixed cost combinations'
tcost(c32,c32p) 'total costs'
best 'lowest cost'
best3p(c32,c32p) 'best combinations within 3 percent';
pow2(id) = power(2,card(id)-ord(id));
com32(c32,i) = 1;
com32(c32,id) = mod(floor((ord(c32)-1)/pow2(id)+.001),2);
tfix(c32,type) = sum(id, fc(id,type)*com32(c32,id));
minamm(c32,id) = smin(i$com32(c32,i), c(i,id));
minfer(c32,c32p) = sum(k, r(k)*smin(i$com32(c32p,i), d(i,k) + minamm(c32,i)));
fccom(c32,c32p) = tfix(c32,"ammonia") + tfix(c32p,"fertilizer");
tcost(c32,c32p) = fccom(c32,c32p) + minfer(c32,c32p);
best = smin((c32,c32p), tcost(c32,c32p));
best3p(c32,c32p) = tcost(c32,c32p)$(tcost(c32,c32p) <= 1.03*best);
display pow2, com32, tfix, minamm, minfer, fccom, tcost, best, best3p;