Lindo Systems

! Multi-period, multi-server queue model in LINGO. (QueueMP.lng)
  ! Key words: queue, M/M/C queue, waiting line, staffing, Call center;
SETS:
  PERIOD: ARATE, NSRVRS;
ENDSETS
DATA:
  !The 15 minute time intervals;
 PERIOD = T0800 T0815 T0830 T0845 T0900 T0915 T0930 T0945;
 ! Arrival rate in customers/minute;
  ARATE =  2.2   2.3   2.6   2.9   3.4   3.3   3.2   3.1;
 ! Number of servers staffed for the period;
  NSRVRS =  8     8     9    10     11    11    11    10;
  ST = 2.75;  ! Mean service time/customer in minutes, same
                  for all intervals;
  DW = .5;  ! Desired max wait in minutes;
ENDDATA
CALC:
! Compute statistics for a multi-server queueing system (QMMC)
  with Poisson arrivals, exponential service time distribution;  
! Run the patient customers case;
 @SET("TERSEO",2);  ! Turn off default output;
 ! Generate a little report;
 @WRITE('Case: Patient customers - wait until served.',@NEWLINE(1),'   Mean service time =',@FORMAT(ST,"6.3F"),
          ' minutes. Target wait=',@FORMAT(DW,"6.3F"),' minutes.',@NEWLINE(1));
 @WRITE('         Arrival                                      Uncond. Condnl.',@NEWLINE(1));
 @WRITE(' Period  Rate    Servers   PR{Wait>0} PR{Wait>Target}  Wait   Wait(>0)   ', @NEWLINE(1));
  @FOR( PERIOD(t):
! Average no. of busy servers;
   LOAD = ARATE(t) * ST;
! Patient customers case;
! Fraction of calls that wait, the Erlang C calculation.
   Assumes Poisson arrivals, exponential service time distribution. ;
   PWAIT = @PEB( LOAD, NSRVRS(t));
! Conditional expected wait, i.e., for customers who must wait,
   what is their average wait;
   WAITCND = ST/( NSRVRS(t) - LOAD);
! Unconditional expected wait, including those who wait 0;
   WAITUNC = PWAIT * WAITCND;
! Fraction calls with wait > DW};
   FWD = PWAIT*@EXP(-DW*(NSRVRS(t)/ST - ARATE(t)));
 @WRITE(' ', PERIOD,'   ',@FORMAT(ARATE(t),"5.3F"),'   ',@FORMAT(NSRVRS(t),"4.0F"),      
           '       ',  @FORMAT(PWAIT,"4.3F"),'       ',@FORMAT(FWD,"4.3F"),'         ',
          @FORMAT( WAITUNC,"4.3F"),'   ',@FORMAT( WAITCND,"4.3F"),'  ',
            '  ' ,@NEWLINE(1));
      ); ! End @FOR( PERIOD...;


! Impatient customers case;! The fraction of customers lost;
 @WRITE(@NEWLINE(2));
 @WRITE('Case: Impatient customers - Depart if no server immediately available.',
 @NEWLINE(1),'   Mean service time =',@FORMAT(ST,"6.3F"),@NEWLINE(1));
 @WRITE('         Arrival',@NEWLINE(1));
 @WRITE(' Period  rate/min   Servers   Fraction customers lost', @NEWLINE(1));
  @FOR( PERIOD(t):
! Average no. of busy servers;
   LOAD = ARATE(t) * ST;

! Fraction of calls lost, the Erlang-B calculation.
   Assumes Poisson arrivals, arbitrary service time distribution. ;
   FLOST = @PEL( ARATE(t) *ST , NSRVRS(t));
 @WRITE(' ', PERIOD,'    ', @FORMAT(ARATE(t),"5.3F"),'    ',@FORMAT(NSRVRS(t),"4.0F"),'      ', 
           '         ',  @FORMAT(FLOSt,"4.3F"),@NEWLINE(1));
      ); ! End @FOR( PERIOD...;
ENDCALC