model "UFL-Disagg" uses "mmxprs"; !gain access to the Xpress-Optimizer solver parameters INFILE= "ufl.txt" end-parameters !sample declarations section declarations SITES: set of integer CLIENTS: set of integer ServiceCost: array(SITES,CLIENTS) of real OperatingCost: array(SITES) of real RunNum: integer end-declarations initialisations from INFILE ServiceCost OperatingCost end-initialisations finalize(SITES) finalize(CLIENTS) declarations y: array(SITES,CLIENTS) of mpvar !fraction of service to client j from site i x: array(SITES) of mpvar !1 if facility is constructed at site i; 0 otherwise end-declarations forward function AddConstraints: integer forall(j in CLIENTS) do sum(i in SITES) y(i,j) = 1 end-do forall(i in SITES) do x(i) is_binary end-do Obj:= sum(i in SITES, j in CLIENTS) ServiceCost(i,j) * y(i,j) + sum(i in SITES) OperatingCost(i) * x(i) RunNum:= 0 writeln("Starting run ", RunNum, "...") minimise(Obj) while (AddConstraints > 0) do RunNum+=1 writeln("Starting run ", RunNum, "...") minimise(Obj) end-do !***************************PROCEDURES AND FUNCTIONS********************************** function AddConstraints: integer declarations NumConstraintsAdded: integer end-declarations NumConstraintsAdded:= 0 forall(i in SITES, j in CLIENTS | getsol(y(i,j)) > getsol(x(i))) do y(i,j) <= x(i) NumConstraintsAdded+=1 end-do writeln("# constraints added: ", NumConstraintsAdded) returned:= NumConstraintsAdded end-function end-model