Lindo Systems

MODEL:
 ! Assembly line balancing model;
   ! Assign tasks to stations in an assembly line so
     precedence constraints are satisfied, and 
     each station is assigned approximately the
     same amount of work.;
 SETS:
   ! There is a set of tasks, each with a duration T;
   TASK: T;

   ! Predecessor,successor pairings must be
     observed(e.g. A must be done before B, B 
     before C, etc.);
   PRED( TASK, TASK);

   ! There are a specified number of workstations;
   STATION;

   TXS( TASK, STATION): X;
   !  X(I,K) = 1
     if task I is assigned to station K;
 ENDSETS
 DATA:
   ! Data taken from Chase and Aquilano, POM;
   ! There is an estimated time required for each 
     task..;
  TASK= A  B  C  D  E  F  G  H  I  J  K;
   T = 45 11  9 50 15 12 12 12 12  8  9;
  PRED= A,B  B,C  C,F  C,G  F,J  G,J
        J,K  D,E  E,H  E,I  H,J  I,J ;
   ! There are 4 stations;
  STATION= 1..4;
 ENDDATA

  ! The model;  
  ! *Warning* may be slow for more than 15 tasks;

  ! For each task, there must be one assigned 
    station;
  @FOR( TASK( I): @SUM( STATION( K): X( I, K)) = 1);

  ! Precedence constraints;
  ! For each precedence pair, the predecessor task
    I cannot be assigned to a later station than its
    successor task J;
  @FOR( PRED( I, J):
   @SUM( STATION( K): 
    K * X( J, K) - K * X( I, K)) >= 0);

  ! For each station, the total time for the 
    assigned tasks must be less than the maximum
    cycle time, CYCTIME;
  @FOR( STATION( K):
   @SUM( TXS( I, K): T( I) * X( I, K)) <= CYCTIME);

  ! Minimize the maximum cycle time;
  MIN = CYCTIME;

  ! The X(I,J) assignment variables are 
    binary integers;
  @FOR( TXS: @BIN( X));
END