model "Network Loss" uses "mmxprs" parameters INFILE= "init-networkloss.txt" end-parameters declarations NODES: set of integer SOURCENODES: set of integer !ARCS: array(NODES,NODES) of integer - when this is used, you only need to test the existence of ARCS(i,j) to create a variable ARCS: set of list of integer SEGMENTS: set of integer SEGMENTS_O: set of integer Demand: dynamic array(NODES) of integer LossRate: array(SEGMENTS) of real Breakpoints: dynamic array(SEGMENTS_O) of real end-declarations initialisations from INFILE NODES ARCS SOURCENODES Demand LossRate Breakpoints end-initialisations finalise(NODES) finalise(SOURCENODES) finalise(SEGMENTS) finalise(SEGMENTS_O) declarations flow: dynamic array(NODES,NODES) of mpvar loss: dynamic array(NODES,NODES) of mpvar supply: dynamic array(NODES) of mpvar flow_part: dynamic array(NODES,NODES,SEGMENTS) of mpvar end-declarations forward function IsInSet(MyList:list of integer,MySet:set of list of integer): boolean forall(i in NODES, j in NODES | IsInSet([i,j],ARCS) = true) do create(flow(i,j)) create(loss(i,j)) forall(k in SEGMENTS) do create(flow_part(i,j,k)) end-do end-do forall(i in NODES | i in SOURCENODES) do create(supply(i)) end-do forall(i in NODES) do supply(i) + sum(j in NODES) flow(j,i) - sum(j in NODES) loss(j,i) = sum(j in NODES) flow(i,j) + Demand(i) end-do forall(i in NODES, j in NODES | exists(loss(i,j))) do loss(i,j) = sum(k in SEGMENTS) LossRate(k) * flow_part(i,j,k) flow(i,j) = sum(k in SEGMENTS) flow_part(i,j,k) forall(k in SEGMENTS | exists(Breakpoints(k))) do flow_part(i,j,k) <= Breakpoints(k) - Breakpoints(k-1) end-do end-do Obj:= sum(i in NODES, j in NODES) loss(i,j) minimise(Obj) !functions and procedures function IsInSet(MyList:list of integer,MySet:set of list of integer): boolean declarations result: boolean end-declarations result:= false forall(i in MySet | MyList = i) do result:= true end-do returned:= result end-function end-model