Description
Euclidian multi-facility location problem using second order cone constraints. Given a set of m existing facilities, we compute the coordinates of n new facilities on a rectangular grid subject to minimizing the weighted sum of the euclidian distances between facilities. We use quadratic cone constraints to model the euclidian distances. Vanderbei, R, online at http://www.princeton.edu/~rvdb/ampl/nlmodels/facloc/emfl_socp.mod Optional inputs: --old number of existing facilities --new number of new facilities --N1 number of facilities in X direction on grid --N2 number of facilities in Y direction on grid Note that we must have new = N1*N2 Keywords: quadratic constraint programming, conic optimization, facility location problem Note that the number of new facilities must be new = N1*N2
Large Model of Type : QCP
Category : GAMS Model library
Main file : emfl.gms
$title Existing Multi Facility Location Problem - Cone Format (EMFL,SEQ=273)
$onText
Euclidian multi-facility location problem using second order
cone constraints. Given a set of m existing facilities,
we compute the coordinates of n new facilities on a rectangular
grid subject to minimizing the weighted sum of the euclidian
distances between facilities.
We use quadratic cone constraints to model the euclidian distances.
Vanderbei, R, online at
http://www.princeton.edu/~rvdb/ampl/nlmodels/facloc/emfl_socp.mod
Optional inputs:
--old number of existing facilities
--new number of new facilities
--N1 number of facilities in X direction on grid
--N2 number of facilities in Y direction on grid
Note that we must have new = N1*N2
Keywords: quadratic constraint programming, conic optimization, facility location problem
$offText
* Note that the number of new facilities must be new = N1*N2
$if not set old $set old 200
$if not set N1 $set N1 5
$if not set N2 $set N2 5
$if not set N $eval new %N1%*%N2%
Set
m 'old facilities' / m1*m%old% /
nX 'number facilities in x direction' / nX1*nX%N1% /
nY 'number facilities in y direction' / nY1*nY%N2% /
n 'total number of new facilities' / n1*n%new% /
d 'dimension' / 'x-axis', 'y-axis' /;
Alias (nn,n);
Parameter
coords(m,d) 'coordinates of existing facilities'
w(m,n) 'weights associated with new-old facility pairs'
v(n,n) 'weights associated with new-new facility pairs';
Positive Variable
x(n,d) 'coordinates of new facilities'
s(m,n) 'euclidian distance between new-old facilities'
t(n,n) 'euclidian distance between new-new facilities';
Variable
diff_o(m,n,d)
diff_n(n,nn,d)
obj;
Equation
objective
diff_o_eq(m,n,d) 'compute distance between new-old'
diff_n_eq(n,nn,d) 'compute distance between new-new'
old_dist(m,n) 'distance between new-old facilities'
new_dist(n,n) 'distance between new-new facilities';
objective.. obj =e= sum((m,n), w(m,n)*s(m,n)) + sum((n,nn), v(n,nn)*t(n,nn));
diff_o_eq(m,n,d).. diff_o(m,n,d) =e= x(n,d) - coords(m,d);
diff_n_eq(n,nn,d).. diff_n(n,nn,d) =e= x(n,d) - x(nn,d);
* Explicit cone syntax for MOSEK
* old_dist(m,n).. s(m,n) =c= sum(d, diff_o(m,n,d));
* new_dist(n,nn).. t(n,nn) =c= sum(d, diff_n(n,nn,d));
old_dist(m,n).. sqr(s(m,n)) =g= sum(d, sqr(diff_o(m,n,d)));
new_dist(n,nn).. sqr(t(n,nn)) =g= sum(d, sqr(diff_n(n,nn,d)));
Model facility / all /;
* Specify existing coordinates via uniform distribution
coords(m,d) = uniform(0,1);
* Compute weights: 0.2 for new-new facility pairs
v(n,nn)$((ord(n) < ord(nn))) = 0.2;
* Initial guess of new facility coordinates distributed evenly on x-y rectangle
loop((nX,nY),
loop(n$(ord(n) = (ord(nX) + card(nX)*(ord(nY) - 1))),
x.l(n,'x-axis') = (ord(nX) - 0.5)/card(nX);
x.l(n,'y-axis') = (ord(nY) - 0.5)/card(nY);
);
);
* Compute weights based on distance of coord and initial guess of
* new facility coordinates
loop((m,n),
if(abs(coords(m,'x-axis') - x.l(n,'x-axis')) <= 1/(2*card(nX)) and
abs(coords(m,'y-axis') - x.l(n,'y-axis')) <= 1/(2*card(nY)),
w(m,n) = 0.95;
elseIf(abs(coords(m,'x-axis') - x.l(n,'x-axis')) <= 2/(2*card(nX)) and
abs(coords(m,'y-axis') - x.l(n,'y-axis')) <= 2/(2*card(nY))),
w(m,n) = 0.05;
else
w(m,n) = 0;
);
);
solve facility using qcp minimizing obj;
display x.l;