(!****************************************************** Mosel Example Problems ====================== file transpl2.mos ````````````````` Transportation problem with piecewise linear cost functions represented via 'pwlin' constraints. -- Based on an example presented in Chapter 20 of the book R.Fourer, D.M. Gay, B.W. Kerninghan: AMPL: A modeling language for mathematical programming -- (c) 2020 Fair Isaac Corporation author: Y.Colombani, Jun. 2020 *******************************************************!) model Transpl2 uses 'mmxnlp','mmxprs' options keepassert declarations ORIG: set of string ! Set of origins DEST: set of string ! Set of destinations SUPPLY: array(ORIG) of real ! Amounts available at origins DEMAND: array(DEST) of real ! Amounts required at destinations RATE: array(ORIG,DEST) of list of real ! List of unit cost rates LIMIT: array(ORIG,DEST) of list of real ! Price change points for rates trans: array(ORIG,DEST) of mpvar ! Transported quantities end-declarations initialisations from 'Data/transpl2.dat' SUPPLY DEMAND RATE LIMIT end-initialisations ! Validation of input data assert(sum(i in ORIG) SUPPLY(i) = sum (j in DEST) DEMAND(j)) ! Objective function: minimize total cost, formulated via piecewise linear ! expressions using slopes (=cost rates) Total_Cost:= sum(i in ORIG, j in DEST) pwlin(trans(i,j),LIMIT(i,j),RATE(i,j)) ! Use all supplies forall(i in ORIG) Supply(i):= sum(j in DEST) trans(i,j) = SUPPLY(i) ! Satisfy all demands forall(j in DEST) Demand(j):= sum(i in ORIG) trans(i,j) = DEMAND(j) ! Solve the problem and report on solution minimise(Total_Cost) writeln("Total cost: ", Total_Cost.sol) forall(i in ORIG,j in DEST | trans(i,j).sol>0) writeln(i, "->", j, ":", trans(i,j).sol, " cost:", getsol(pwlin(trans(i,j),LIMIT(i,j),RATE(i,j)))) end-model