Rob - here is the code. %let p=2; proc optmodel; set DIMS=1..2; set CUSTOMERS; set FACILITIES = 1..&p; num a {CUSTOMERS,DIMS}; num demand {CUSTOMERS}; read data STDOPT.COGModelingData into CUSTOMERS= [_N_] {d in DIMS} <a[_N_,d]=col('a'||d)> demand; print demand; print a; num Xlb {d in DIMS} = min {i in CUSTOMERS} a[i,d]; num Xub {d in DIMS} = max {i in CUSTOMERS} a[i,d]; **print Xlb; **print Xub; var X {FACILITIES, d in DIMS} >= Xlb[d] <= Xub[d]; var W {CUSTOMERS, FACILITIES} >= 0; impvar Distance {i in CUSTOMERS, j in FACILITIES} = sum{d in DIMS} GEODIST(a[i,1],a[i,2],X[j,1],X[j,2]); min Z = sum {i in CUSTOMERS, j in FACILITIES} W[i,j]*Distance[i,j]; con DemandCon {i in CUSTOMERS}: sum {j in FACILITIES} W[i,j] = demand[i]; solve with nlp / ms FEASTOL=1e-1; print X; put _OBJ_=; /* post-processing: assign each customer to closest facility */ set CUSTOMERS_j {FACILITIES} init {}; num minDistance, argminDistance; for {i in CUSTOMERS} do; minDistance = constant('BIG'); argminDistance = .; for {j in FACILITIES} do; if minDistance > Distance[i,j] then do; minDistance = Distance[i,j]; argminDistance = j; end; end; for {j in FACILITIES} W[i,j] = 0; W[i,argminDistance] = demand[i]; CUSTOMERS_j[argminDistance] = CUSTOMERS_j[argminDistance] union {i}; end; put _OBJ_=; /* post-processing: solve each facility separately */ min SingleFacilityObjective {j in FACILITIES} = sum {i in CUSTOMERS_j[j]} demand[i]*Distance[i,j]; problem SingleFacilityProblem {j in FACILITIES} include {d in DIMS} X[j,d] SingleFacilityObjective[j]; for {j in FACILITIES} do; put j=; use problem SingleFacilityProblem[j]; solve; end; put (sum {j in FACILITIES} SingleFacilityObjective[j])=; print X;
... View more