| (!******************************************************
   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
 |