Sistema simple de simulaci贸n Go



Introduccion


La simulaci贸n es un m茅todo para realizar experimentos, el sistema real estudiado es reemplazado por un modelo. En dicho modelo, puede perder situaciones individuales y muchas de ellas. Las estad铆sticas recopiladas pueden ayudar a sacar conclusiones acerca de los procesos en el sistema, as铆 como tambi茅n esbozar las rutas de optimizaci贸n.

El modelado de simulaci贸n a menudo se considera como un tipo de pruebas experimentales, pero al mismo tiempo es menos costoso, le permite cambiar r谩pidamente los par谩metros y observar el sistema simulado en din谩mica.

Ya alrededor de medio siglo en el modelado de simulaci贸n, se han utilizado modelos de computadora. Se han creado muchos programas y marcos diferentes para su desarrollo, entre los cuales, en mi opini贸n, los m谩s desarrollados son las herramientas para modelar sistemas de colas (QS). Uno de los programas m谩s conocidos y simples para la simulaci贸n de QS - GPSS World (Sistema de simulaci贸n de prop贸sito general - un sistema de modelado de prop贸sito general) se puede encontrar con m谩s detalle en los enlaces [1] , [2] .

El concepto de este programa fue la base del marco de simulaci贸n en Go.

Simulaci贸n en GPSS


Un modelo en GPSS es una secuencia de bloques (comandos) que describe los objetos simulados entre los que se mueven las transacciones. Cuando una transacci贸n ingresa al bloque, se generan eventos que conducen a un cambio en el estado del objeto modelado o a un cambio en el estado / par谩metros de la transacci贸n.

Los bloques principales del orden de diez: GENERAR, TERMINAR, ASIGNAR, ASEGURAR, LIBERAR, COLA, AVANZAR, SALIR, INICIAR. Hay alrededor de tres docenas de bloques en total. Los bloques tienen par谩metros, que pueden ser n煤meros, nombres de funciones, etiquetas en el programa de simulaci贸n, nombres de variables. Se pueden encontrar m谩s detalles sobre los bloques, por ejemplo, aqu铆 .

Los objetos en GPSS tienen un conjunto de atributos num茅ricos est谩ndar (NAV) y atributos l贸gicos est谩ndar (ALS). Por ejemplo, para una cola, uno de los NAV es la longitud actual, y un ejemplo de ALS para algunos equipos ser谩 VERDADERO u ocupado (FALSO).
En algunas versiones de GPSS hay una visualizaci贸n del proceso de modelado, pero a menudo est谩 ausente. En funci贸n de los resultados de la simulaci贸n, se genera un informe en GPSS, que indica el NAV y ALS para todos los objetos.

Ir a la implementaci贸n


Implementaci贸n en Go es el desarrollo de un conjunto de objetos similares en funci贸n a los bloques GPSS. El primero fue Pipeline creado: el objeto dentro del cual se realiza la simulaci贸n.

Basado en un map contiene una lista de componentes para describir el sistema simulado. Dado que, durante la simulaci贸n, las transacciones deben pasar por una secuencia de bloques en un orden estricto, en el m茅todo de agregar componentes de Append , se implement贸 el procedimiento de agregar con indicaci贸n simult谩nea de los destinos de las transacciones. El nombre del componente se utiliza como clave de map , por lo que cada componente debe tener un nombre 煤nico.

Despu茅s de agregar todos los componentes, puede iniciar la simulaci贸n utilizando el m茅todo de Start . En su interior, se implementa un bypass c铆clico de todos los componentes durante un tiempo de simulaci贸n determinado. Al final de la simulaci贸n, puede imprimir un informe que contenga NAV y ALS.

El segundo elemento importante son los componentes reales para describir la simulaci贸n. Se implementaron los siguientes: Generador - genera transacciones, Avanzado - crea demoras en la ruta de la transacci贸n, Cola - colas de transacciones, Instalaci贸n - un dispositivo que es capturado exclusivamente por la transacci贸n por un tiempo, Agujero - un "agujero" en el que las transacciones fallan al final de la ruta. Por supuesto, este conjunto no es suficiente para crear modelos de simulaci贸n complejos, sino suficiente para resolver la soluci贸n y compararla con los resultados del GPSS. Todos los componentes implementan la interfaz IBaseObj, que cubre la funcionalidad m铆nima requerida.

Cada componente tiene una cola de transacciones. Directamente como una cola, se usa solo en la cola, para otros componentes es solo un repositorio. La cola se implementa en funci贸n del map . En el proceso de modelado, los componentes pasan a su vez y verifican la preparaci贸n (cumplimiento de una determinada condici贸n) de la transacci贸n para su transmisi贸n al siguiente componente. La transferencia se realiza a trav茅s del m茅todo AppendTransact del siguiente componente. Si la transferencia es exitosa, la transacci贸n se elimina de la cola, respectivamente, el siguiente componente la toma a su vez. Dado que se definen varios destinatarios para cada componente, si no fue posible enviar una transacci贸n a un destinatario, intentamos enviarla a otro.

Para generar variables aleatorias al determinar el tiempo de aparici贸n de la transacci贸n y crear retrasos, se utilizan las funciones PRNG en Go.

Dado que al modelar, al mismo tiempo, puede haber muchas transacciones que se mueven entre diferentes componentes, surgi贸 la idea de usar gorutinas dentro de los componentes. La canalizaci贸n, que pasa a trav茅s de los componentes, inicia el controlador HandleTransacts para cada uno de ellos, dentro del cual se crea la rutina. Una vez que se han completado todas las rutinas, el contador de tiempo del modelo se incrementa y se llama HandleTransacts .

El 煤ltimo objeto clave es la transacci贸n en s铆. Tiene un identificador, hora de nacimiento y muerte, el propietario (en qu茅 componente se encuentra ahora), una serie de par谩metros para calcular el NAV y el NAV.

En la fig. 1 es un diagrama estructural de la interacci贸n de los principales objetos del marco durante el modelado.


Fig. 1. Diagrama estructural generalizado de la interacci贸n de los objetos principales en la simulaci贸n.

Ejemplo de simulaci贸n


Suponga que necesita simular el trabajo de un peluquero. Este es un famoso ejemplo de GPSS. Los visitantes van al azar, con una frecuencia de 18 卤 6 minutos, su n煤mero no se conoce de antemano. Tenemos un peluquero, 茅l pasa 16 卤 4 minutos en un corte de pelo. Entonces, 驴a cu谩ntas personas cortar谩 por un d铆a de trabajo? 驴Cu谩ntas personas estar谩n en la fila? 驴Cu谩l es el tiempo promedio que toma un corte de pelo y cu谩nto tiempo esperan las personas en la fila? Muchas preguntas y una simulaci贸n simple. El diagrama de bloques en la Fig. 2)


Fig. 2. El esquema estructural de modelar una peluquer铆a

El c贸digo para construir el modelo ser谩 el siguiente.

 barbershop := NewPipeline("Barbershop", true) //   clients := NewGenerator("Clients", 18, 6, 0, 0, nil) //   chairs := NewQueue("Chairs") //  master := NewFacility("Master", 16, 4) //  hole := NewHole("Out") //  barbershop.Append(clients, chairs) //       barbershop.Append(chairs, master) //      barbershop.Append(master, hole) //     barbershop.Append(hole) //        barbershop.Start(480) //    <-barbershop.Done //   barbershop.PrintReport() 

Los resultados de la simulaci贸n se pueden encontrar aqu铆.
Nombre de la tuber铆a "Barbershop"
Tiempo de simulaci贸n 480
Nombre del objeto "Sillas"
Contenido m谩ximo 1
Total entradas 26
Cero entradas 11
Porcentaje cero entradas 42.31%
En la cola 0
Tiempo promedio / trans 2.58
Tiempo medio / trans sin cero entradas 4.47

Nombre del objeto "Clientes"
26 generados

Nombre del objeto "Maestro"
Avance promedio 16.46
Utilizaci贸n promedio 89.17
N煤mero de entradas 26.00
Transacci贸n 26 en las instalaciones

Nombre del objeto "Fuera"
Mata a 25
Avance promedio 16.56
Vida media 19.44

Sirvi贸 a 25 clientes, el 26 al momento de la finalizaci贸n de la simulaci贸n todav铆a estaba en la silla del maestro. La cola no era m谩s de 1 persona, 11 personas no esperaron (pase cero) e inmediatamente se cortaron el pelo. En promedio, las personas pasaron 2.58 minutos en la cola, y de los que estaban esperando (no un pase cero), 4.47 minutos. El 89.17% de su tiempo, un peluquero, intensamente cortado.

Por supuesto, si realiza otra simulaci贸n, los resultados cambiar谩n. Pero durante una serie de simulaciones, el nivel general de la carga del asistente y el n煤mero de clientes atendidos ser谩n visibles. Una simulaci贸n similar en GPSS produce resultados similares.

Otro ejemplo. Hay una oficina, tiene 10 empleados y un ba帽o. La gente quiere ir al ba帽o cada 90 卤 60 minutos, ir al ba帽o durante 5 卤 3 minutos, ir al ba帽o durante 15 卤 10 minutos, volver a la oficina durante 5 卤 3 minutos. Realizaremos la simulaci贸n durante 9 horas (8 horas de trabajo + 1 hora de almuerzo), en la fig. 3 es un diagrama estructural.


Fig. 3. Diagrama estructural del modelo de empleo del inodoro: a la izquierda con un inodoro, a la derecha con dos

A la izquierda hay un modelo con un inodoro, a la derecha con dos. El siguiente es el c贸digo del modelo.

 waterclosetsim := NewPipeline("Water Closet Simulation", false) office := NewGenerator("Office", 0, 0, 0, 10, nil) wantToToilet:= NewAdvance("Wanted to use the toilet", 90, 60) pathToWC := NewAdvance("Path to WC", 5, 3) queue := NewQueue("Queue to the WC") pathFromWC := NewAdvance("Path from WC", 5, 3) wc := NewFacility("WC", 15, 10) pathToOffice:= NewAdvance("Path from WC", 5, 3) waterclosetsim.Append(office, wantToToilet) waterclosetsim.Append(wantToToilet, pathToWC) waterclosetsim.Append(pathToWC, queue) waterclosetsim.Append(queue, wc) waterclosetsim.Append(wc, pathFromWC) waterclosetsim.Append(pathFromWC, wantToToilet) waterclosetsim.Start(540) <-waterclosetsim.Done waterclosetsim.PrintReport() 

Los resultados de la simulaci贸n son los siguientes.
Nombre de la tuber铆a "Simulaci贸n de inodoro"
Tiempo de simulaci贸n 540
Nombre del objeto "Oficina"
Generado 10

Nombre del objeto "Ruta desde WC"
Avance promedio 5.77

Nombre del objeto "Path to WC"
Avance promedio 5.22

Nombre del objeto "Queue to the WC"
Contenido m谩ximo 4
Entradas totales 36
Cero entradas 8
Porcentaje cero entradas 22.22%
Contenido actual 4
Contenido promedio 1.78
Tiempo promedio / trans 24.11
Tiempo promedio / trans sin cero entradas 31.00

Nombre del objeto "WC"
Avance promedio 14.69
Utilizaci贸n media 87.04
N煤mero de entradas 32.00
Transacci贸n 2 en las instalaciones

Nombre del objeto "Quer铆a usar el ba帽o"
Avance promedio 95.85

Hab铆a hasta 4 personas en la fila, 8 veces una persona se meti贸 inmediatamente en el inodoro, durante el d铆a laboral el inodoro se us贸 al 87.04%. Lo m谩s significativo, en mi opini贸n, es que las personas esperan aproximadamente media hora (31 minutos) en la fila para ir al ba帽o. Quiz谩s esto se deba al hecho de que solo hay un inodoro, y quiz谩s al hecho de que, en promedio, las personas se sientan en 茅l durante 14,69 minutos.

Despu茅s de agregar otro ba帽o, vi que la cola se redujo a 3 personas, 29 veces las personas entraron inmediatamente al ba帽o. Pero lo m谩s importante, la expectativa disminuy贸 casi tres veces.

Conclusi贸n


El marco creado en la rodilla es bastante simple y a煤n limitado. Planea aumentar su funcionalidad al nivel de GPSS. El valor pr谩ctico del marco es la capacidad de ensamblar r谩pida y f谩cilmente un modelo de simulaci贸n en Go y obtener resultados.

El c贸digo est谩 publicado en GitHub .

Source: https://habr.com/ru/post/448076/


All Articles