! Single product Capacitated lot sizing with backlogging in LINGO.
  Decide how much to produce each period of a single 
 product so as to
  Minimise setup, holding, and backlogging costs,
 subject to:
  each period:
    satisfying demand,
    not exceeding production capacity,
    not exceeding inventory capacity
    not exceeding backlogging limit;
! Keywords: Lot sizing, Capacitated lot sizing, Production planning, Backlogging,
            Backorder;
SETS:
  TIME:
   DEM,  ! Demand each time period;
   MAKE, ! Amount to produce each period;
   INV,  ! Amount in inventory at end of period;
   BKL,  ! Amount backlogged at end of period;
   Y;    ! = 1 if anything is produced in period, else 0;
 ENDSETS
DATA: TIME = 1..15; PCAP = 200; ! Production Capacity per period; ICAP = 100; ! Inventory upper limit each period; BCAP = 75; ! Upper limit on backlogging each period; SC = 280 ; ! Setup cost to produce > 0 in a period; HC = 2 ; ! Holding cost per unit per period; BC = 3; ! Backlogging cost per unit per period; I0 = 9; ! Initial inventory; DEM = 15 60 130 0 100 200 111 210 5 121 10 10 90 5 5; ! Demands; ! Assume initial inventory is 0; ENDDATA !------------------------------------; ! The straightforward formulation; ! The objective; MIN = SCOST + ICOST + BCOST; SCOST = @SUM( TIME(t): SC*Y(t)); ICOST = @SUM( TIME(t): HC*INV(t)); BCOST = @SUM( TIME(t): BC*BKL(t)); ! Inventory balance constraints; I0 + MAKE(1) = DEM(1) + INV(1) - BKL(1); ! Period 1 starts with I0 inventory; @FOR( TIME(t) | t #GT# 1: ! Subsequent periods; INV(t-1) - BKL(t-1) + MAKE(t) = DEM(t) + INV(t) - BKL(t); ); ! Assume all demand must be satisfied at the end; BKL(@SIZE(TIME)) = 0; @FOR( TIME(t): ! Inventory capacity; INV(t) <= ICAP; ! Backlogging limit; BKL(t) <= BCAP; ! Production capacity and setup forcing; MAKE(t) <= @SMIN( PCAP, @SUM( TIME(s): DEM(s)))*Y(t); ! Make the Y's binary (0 or 1); @BIN( Y(t)); );