Lindo Systems

MODEL:
! Multiproduct Capacitated lot sizing;
 SETS:
  PROD/1..2/: ! Each product has a ...;
   ST,   ! Setup time;
   VT,   ! Production time per unit;
   SC,   ! Setup cost;
   VC,   ! Production cost per unit;
   HC;   ! Holding cost per unit per period;
  TIME/1..6/:;
  PXT( PROD, TIME):
! Each product in each period has...;
   DEM,  ! Demand;
   MAKE, ! Amount to produce;
   Y;    ! = 1 if anything is produced;
 ENDSETS
 DATA:
  CAP = 200;     ! Capacity per period;
  ST = 0  0;     ! Setup times;
  VT = 1  1;     ! Production time per unit;
  SC = 150  45;  ! Setup costs;
  VC =  7  4;    ! Cost per unit to produce;
  HC =  2  1;    ! Holding cost per unit;
  DEM =  40  60 130   0 100 200  ! Demands;
          0  45  50  35  20  35;
 ENDDATA

!------------------------------------;
!  The Eppen/Martin model;
 SETS:
  PXTXT( PROD, TIME, TIME)| &3 #GE# &2:
   PCOF,
   CCOF,
   X;
 ENDSETS
! Compute cost and production amounts for
  various production runs;
 @FOR( PROD( I):
  @FOR( TIME( S):
   PCOF( I, S, S) = DEM( I, S);
   CCOF( I, S, S) = VC( I) * DEM( I, S);
   @FOR( TIME( T)| T #GT# S:
    PCOF( I, S, T) = PCOF( I, S, T - 1) +
     DEM( I, T);
    CCOF( I, S, T) = CCOF( I, S, T - 1) +
    ( VC( I) + HC( I) * ( T - S)) * DEM( I, T);
   )
  )
 );

! The objective;
  MIN = TCOST;
  TCOST = @SUM( PXTXT: CCOF * X) +
   @SUM( PXT( I, S): SC( I) * Y( I, S));

  @FOR( PROD( I):
! In period 1, some production run must be started;
!  Note, watch out for periods without demand;
   @SUM( PXTXT( I, S, T) | S #EQ# 1:
    X( I, S, T)) = 1;
   @FOR( TIME( K)| K #GT# 1:
!  If we ended a run in period K - 1...;
    @SUM( PXTXT( I, S, T)| T #EQ# K - 1:
     X( I, S, K - 1))
!  then we must start a run in period k;
      = @SUM( PXTXT( I, K, T): X( I, K, T));
   );
! Setup forcing;
   @FOR( TIME( S):
    Y( I, S) =  @SUM( PXTXT( I, S, T)
     : ( PCOF( I, S, T) #GT# 0) * X( I, S, T));
! Calc amount made each period;
    MAKE( I, S) = @SUM( PXTXT( I, S, T):
     PCOF( I, S, T) * X( I, S, T)) 
   )
  );

! The capacity constraints;
  @FOR( TIME( S):
   @SUM( PROD( I): ST( I) * Y( I, S)) +
    @SUM( PXTXT( I, S, T):
     VT( I) * PCOF( I, S, T) * X( I, S, T)) <= CAP
  );

! Make the Y's integer;
  @FOR( PXT: @GIN( Y));

END