(!****************************************************** Mosel Example Problems ====================== file pricebrinc3.mos ```````````````````` Incremental pricebreaks formulated with piecewise linear expressions (c) 2021 Fair Isaac Corporation author: S. Heipcke, July 2021 *******************************************************!) model "Incremental pricebreaks (pwlin)" uses "mmxnlp" declarations NB = 3 ! Number of price bands BREAKS = 0..NB COST: array(1..NB) of real ! Cost per unit within price bands x: mpvar ! Total quantity bought B,CBP: array(BREAKS) of real ! Break points, cost break points end-declarations DEM:= 150 ! Demand B:: [0, 50, 120, 200] COST:: [0.8, 0.5, 0,3] CBP(0):= 0 forall(i in 1..NB) CBP(i):= CBP(i-1) + COST(i) * (B(i)-B(i-1)) ! Objective: total price (uncomment one of the three following options) ! 1- Specification as a list of slopes with associated intervals: ! (only points of slope changes are specified, the start value is 0): !TotalCost:= pwlin(x, union(i in 1..2) [B(i)], union(i in 1..3) [COST(i)]) ! 2- Specification as a list of piecewise linear segments (pws) with associated intervals: TotalCost:= pwlin(union(i in 1..3) [pws(B(i-1), CBP(i-1)+COST(i)*(x-B(i-1)))]) ! 3- Specification as a list of points: !TotalCost:= pwlin(x, union(i in 0..3) [B(i), CBP(i)]) ! Meet the demand x = DEM ! Solve the problem minimize(TotalCost) ! Solution printing writeln("Objective: ", getobjval, " (avg price per unit: ", getobjval/DEM, ")") forall(i in 1..NB) writeln("Interval ", i, ": ", minlist(B(i)-B(i-1),x.sol-B(i-1)), " (price per unit: ", COST(i), ")") end-model