260 likes | 435 Views
Simulación Dr. Ignacio Ponzoni. Clase XIV: Una Implementación en Pascal del Método de las Tres Fases Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Año 2005. Implementación de Pidd.
E N D
SimulaciónDr. Ignacio Ponzoni Clase XIV: Una Implementación en Pascal del Método de las Tres Fases Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Año 2005
Implementación de Pidd • Michael Pidd presenta una librería de subrutinas para implementar simuladores siguiendo el método de las tres fases. • Para su implementación, Pidd utilizó la estructura básica para programas de simulación de eventos discretos propuesta por Fishman en 1973. • Esta estructura continua siendo la base de varios paquetes de software para simulación comercializados en la actualidad.
Estructura Básica de Fishman Herramientas: -Entrada:Salida -Muestreo Aleatorio -Debugging, etc. Unidad de Control: -Planificación -Secuenciamiento Unidad Lógica del Modelo: -Rutinas particulares de la aplicación. (Especificadas por el modelador)
Módulos • La Unidad de Control se encarga del avance dinámico de la simulación, planificando y secuenciando la ejecución de eventos y actividades. • La Unidad Lógica del Modelo implementa las rutinas propias de la aplicación que se está modelando. Estas rutinas son especificadas por el modelador. • La Unidad de Herramientas se encarga de proveer rutinas para la interface de entrada-salida del programa de simulación, generación números aleatorios, generación de reportes estadísticos para análisis de la salida, facilidades para debugging, herramientas de visualización y animación gráfica y otros.
Unidad de ControlArreglo de Control • El arreglo de control mantiene los datos referidos a las entidades. • Cada componente del arreglo es un registro correspondiente a una entidad. • El registro posee cinco campos: • Nombre: contiene una string con el nombre de la entidad. • Disponible: contiene un valor booleano que indica si la entidad está disponible. • Celda de Tiempo: contiene un valor entero que indica cuando ocurrirá la próxima actividad B planificada. • Próxima Actividad: indica cual es la próxima actividad, la representación depende fuertemente del lenguaje usado en la implementación. • Utilización: contiene un entero que almacena el tiempo en que la entidad estuvo ocupada durante la simulación.
Unidad de ControlArreglo de Control • Type BAct = Procedure; • EntDetails = Record • Name : String; • Avail : Boolean; • TimeCell : Integer; • NextAct : BAct; • Util : Integer; • End; • Var Details : Array[1..MaxEnt] of EntDetails;
Unidad de ControlDeclaración de las Variables de Control Var Details : Array[1..MaxEnt] of EntDetails; CArray : Array[1..MaxC] of Procedure; NumCurrEnts : Integer; Clock, PrevClock : Integer; RunDuration : Integer; NumEnts : Integer; NumCs : Integer; CurrEntArray : Array[1..MaxEnt] of Integer; CurrEnt : Integer; CStarted : Boolean;
Unidad de ControlDescripción • CurrEntArray representa la lista HacerAhora. • NumCurrEnt es un índice dentro del arreglo que indica la cantidad de entidades almacenadas en la lista. • CurrEnt es la entidad, dentro de la lista HacerAhora, que está siendo considerada en determinado momento durante la fase B. • Clock y PrevClock representan el valor actual y anterior del reloj durante el avance de la simulación y se representa con una variable entera. • RunDuration representa el tiempo preestablecido para la finalización de la simulación.
Unidad de ControlDescripción • De una manera similar a como los campos NextAct de los registros de tipo EntDetails contienen punteros a los procedimientos que representan las actividades B, el arreglo CArray guarda punteros a los procedimientos asociados con las actividades C. • El orden en que se almacenan los punteros establece un orden de prioridad entre las actividades C. • La variable NumCs contiene la cantidad de actividades C que tiene el programa de simulación. • CStarted es una variable booleana que toma valor true si la actividad C actualmente analizada superó su test de condición y false en caso contrario.
Name Avail TimeCell NextAct Util Entidad 1 Entidad 2 Entidad 3 Entidad 4 ... Unidad de ControlFase A Details array CurrEntArray
Procedure Aphase; Var Entity, Minm : Integer; Begin NumCurrEnts := 0; Minm := MaxInt; For Entity := 1 to NumEnts do With Details[Entity] do If Not Avail then Begin If Timecell <= Minm then Begin If TimeCell < Minm then NumCurrEnts := 1 Else NumCurrEnts := NumCurrEnts + 1; Minm := TimeCell; CurrEntArray[NumCurrEnts] := Entity; End; End; If Minm = MaxInt then Error('Error in A phase, Minm still = MaxInt'); If Minm < 0 then Error('Seems to be a mistake in A phase, Minm -ve'); PrevClock := Clock; Clock := Minm; End;
Unidad de ControlFase B CurrEntArray Ejecutar NextAct correspondiente Ejecutar NextAct correspondiente Ejecutar NextAct correspondiente
Procedure Bphase; Var Loop : Integer; Begin If TraceOn then Begin Writeln(TraceFile); Writeln(TraceFile, 'Time now .. ', Clock:5); End; ShowEntDetails; For Loop := 1 to NumCurrEnts do Begin CurrEnt := CurrEntArray[Loop]; With Details[CurrEnt] do Begin Avail := True; {Release CurrEnt} NextAct; {Do this B Activity} End; End; End;
Unidad de ControlFase C Procedure Cphase; {Try each C activity in turn} Var Loop : Integer; Begin Repeat CStarted := False; For Loop := 1 to NumCs do CArray[Loop]; Until Not CStarted; End;
Unidad Lógica del ModeloCaso de Estudio del Vendedor B1: Arrive (Arribo de Clientes en Persona). B2: EndOfService (Fin de Atención en Ventanilla). B3: Call (Arribo de una Llamada). B4: EndOfCall (Fin de la Atención de una Llamada). C1: BeginService (Inicio de Atención en Ventanilla). C2: BeginCall (Inicio de Atención de una Llamada).
Unidad Lógica del ModeloActividades B Procedure Arrive; {Arrival of personal enquirer} Var Time : Real; Begin Inc(PersIn); {Increment number of arrivals} Time := NegExp(PersArrTime, 1); Inc(PersQ); {Increment queue length} Display('Personal enquirer No. ' + Int2Str(PersIn,3) + ' arrives, queue = '+ Int2Str(PersQ,3) + ' next due after ' + Int2Str(Round(Time),3)); Schedule(PersEnq, Arrive, Time); {Schedule next personal arrival} End;
Unidad Lógica del ModeloActividades B Procedure Call; {Arrival of phone call} Var Time : Real; Begin Inc(PhoneIn); {Increment number of calls} Time := NegExp(PhoneArrTime, 2); Inc(PhoneQ); {Increment queue length} Display('Phone enquirer No. ' + Int2Str(PhoneIn,3) + ' arrives, queue = '+ Int2Str(PhoneQ,3) + ' next after ' + Int2Str(Round(Time),3)); Schedule(PhoneEnq, Call, Time); {Schedule next phone call} End;
Unidad de ControlPlanificador de Eventos Procedure Schedule(Entity : Integer; Activity : BAct; RTime : Real); {Commits specified entity to Activity after RTime} Begin With Details[Entity] do Begin Nextact := Activity; TimeCell := Clock + Round(RTime); Avail := False; Util := Util + Round(RTime); End; End;
Unidad Lógica del ModeloActividades B Procedure EndServe; {End of personal service. CurrEnt is clerk who is released} Begin Inc(PersOut); {Increment number of completed services} Display('End of personal service:' + Int2Str(PersOut,3) + ' freed Clerk:' + Int2Str(CurrEnt,2)); End;
Unidad Lógica del ModeloActividades B Procedure EndTalk; {End of phone conversation. CurrEnt is clerk who is released} Begin Inc(PhoneOut); {Increment number of completed conversations} Display('End of phone conversation:' + Int2Str(PhoneOut,3) + ' freed Clerk: ' + Int2Str(CurrEnt,2)); End;
Unidad Lógica del ModeloActividades B Procedure Observe; {Collect time series of queue lengths} Begin PersRec[Obs] := PersQ; PhoneRec[Obs] := PhoneQ; Inc(Obs); Schedule(Observer, Observe, ObsInterval); {Schedule next observation} Display('Recording, Personal queue = ' + Int2Str(PersQ,3) + ', phone queue = ' + Int2Str(PhoneQ,3)); End;
Unidad Lógica del ModeloActividades C Procedure BeginPersService; Var Time : Real; Clerk : Integer; Begin Clerk := FirstClerk-1; While (PersQ > 0) and (Clerk < LastClerk) do Begin Inc(Clerk); If Details[Clerk].Avail then Begin CStarted := True; Dec(PersQ); Time := NegExp(PersServeTime, 3); Schedule(Clerk, EndServe, Time); Display('Start of Personal service with Clerk:' + Int2Str(Clerk,2)); End; End; End;
Unidad Lógica del ModeloActividades C Procedure BeginPhoneConv; Var Time : Real; Clerk : Integer; Begin Clerk := FirstClerk - 1; While (PhoneQ > 0) and (Clerk < LastClerk) do Begin Inc(Clerk); If Details[Clerk].Avail then Begin CStarted := True; Dec(PhoneQ); Time := NegExp(PhoneServeTime, 4); Schedule(Clerk, EndTalk, Time); Display('Start of Phone Service with Clerk: ' + Int2Str(Clerk,2)); End; End; End;
Unidad de ControlPrograma Principal Begin {Main program} Initialisation; While Clock <= RunDuration do Begin Aphase; Bphase; Cphase; End; Finalisation; End.
Unidad Lógica del ModeloInicialización y Finalización • Los procedimientos Initialisation y Finalisation deben ser provistos por toda Unidad Lógica que uno desee conectar con la Unidad de Control. • Initialisation: este procedimiento se encarga de inicializar todas las variables del modelo antes de comenzar con la primera iteración del método de las tres fases. • Finalisation: este procedimiento se encarga de recopilar los resultados de la simulación y almacenarlos en un formato apropiado para su futuro análisis.
Recomendaciones • Lectura sugerida: • Capítulo 7 del libro Computer Simulation in Management Science de Michael Pidd. • Ejercitación recomendada: • Trabajo Práctico 10: DEVS: Método de las Tres Fases.