Este artigo descreve os novos componentes da estrutura para simulação, apresentados anteriormente no artigo
"Um sistema simples de simulação em andamento" . À medida que a estrutura se expandia, tornou-se possível modelar sistemas mais complexos, por exemplo, para simular o trabalho de um restaurante.
Novos componentes
Existem vários componentes novos:
Bifacilidade ,
Dividir ,
Agregar ,
Contar ,
Atribuir ,
Verificar . Vamos considerá-los com mais detalhes.
Bifacilidade é essencialmente a mesma que
Facilidade , mas seu objetivo é fazer com que a transação ocupe não um único componente por um tempo, mas uma cadeia de componentes. Para isso, o construtor
Bifacility forma dois componentes - IN e OUT. Depois que uma transação
entra no componente IN, o
Bifacility é considerado ocupado e outra transação não pode mais aceitá-lo. Quando uma transação atinge o componente OUT, o
Bifacility é liberado e agora outra transação pode aceitá-lo. Somente a transação que a ocupou pode liberar o
Bifacility . A analogia mais simples da
Bifacility pode ser considerada uma instalação tecnológica que executa várias operações em uma parte. Até que a peça saia da instalação, é impossível enviar outra peça para ela.
Dividir - um componente projetado para dividir uma transação em partes - outras transações processadas em paralelo no futuro. Por exemplo, se considerarmos uma transação como um pedido, suas partes serão posições no pedido. Por padrão, na ausência de quaisquer parâmetros, o
Split divide a transação resultante por uma quantidade igual aos componentes após ela. É possível especificar quantas partes e com qual modificador (para gerar um valor aleatório) a partição será executada. Como, na prática, pode ser necessário que a divisão em partes seja realizada de acordo com alguma lei, em
Split há a oportunidade de conectar seu próprio manipulador para a divisão.
Emparelhado com
Split é Agregado , como o nome indica, ele agrega uma série de transações em uma. Sua funcionalidade é bastante simples, tendo recebido qualquer parte de uma transação quebrada anteriormente, aguarda todas as outras partes e, após recebê-las, envia a transação ainda mais.
Contagem - componente para contagem. O construtor
Count forma dois componentes - INC e DEC. Quando uma transação entra no INC, o contador de
contagem aumenta; quando entra em um DEC, diminui. No construtor de
Count, são definidos valores pelos quais o contador aumenta e diminui quando entra INC e DEC, respectivamente.
Atribuir - projetado para definir alguns parâmetros de transação. Uma transação tem uma lista de parâmetros, cada parâmetro tem um nome e um valor. O valor pode ser uma sequência, número, estrutura. Ao atribuir zero a um parâmetro, ele é removido da lista.
Cheque - um componente projetado para verificar o cumprimento de uma determinada condição e ignora uma transação somente quando é executada. Por padrão, a igualdade do parâmetro de transação com o valor especificado é verificada. No construtor
Cheque , você pode especificar o bloco para o qual a transação será enviada se o resultado da verificação for
falso . Para aumentar a flexibilidade, é possível conectar seu próprio manipulador para verificar a condição do salto da transação.
Vale ressaltar que, ao desenvolver a estrutura, o objetivo não era copiar completamente o GPSS; portanto, com o nome idêntico dos componentes, sua funcionalidade pode variar.
Modelo de restaurante
A decisão de tentar construir um modelo de restaurante surgiu não do zero. Em primeiro lugar, muitas pessoas os visitam; em segundo lugar, esse é um sistema de filas bastante complicado; em terceiro lugar, minha esposa trabalha no ramo de restaurantes há muitos anos e eu poderia consultá-la.
Então, começaremos a descrever o modelo do restaurante. O restaurante estará em 24 mesas. Os visitantes do restaurante são chamados de "convidados", os visitantes chegam aleatoriamente, essas transações serão geradas. Mas a transação não é uma pessoa, pode ser um grupo de pessoas que apenas tomou uma mesa. Para aumentar o realismo, se houver mais de 6 convidados na fila (são necessárias 6 mesas) aguardando uma mesa, os novos convidados sairão, não esperar.
As anfitriãs encontram os convidados na entrada; em grandes restaurantes, muitas vezes há duas ou mais; haverá duas no modelo. No caso de haver mesas gratuitas, as recepcionistas os levarão à mesa; se não houver mesas gratuitas, os convidados estarão esperando. Em restaurantes reais, há uma reserva e convidados VIP, por simplicidade, eles não estarão no modelo construído, mas esses planos devem ser levados em consideração.
Depois que os convidados estão sentados à mesa, eles são servidos por um garçom, geralmente um garçom para várias mesas; no modelo, haverá um para três mesas. Como em um restaurante comum, o garçom não pode servir várias mesas ao mesmo tempo, mas serve uma de cada vez. Durante o serviço, o garçom recebe um pedido dos convidados. Por encomenda entende-se vários pratos de vários tipos e bebidas. Quantos pratos e bebidas serão pedidos antecipadamente, mas contaremos pelo menos um e não mais que cinco, incluindo pedidos em um bar. O garçom, depois de receber o pedido, passa para os cozinheiros e garçons.
Tradicionalmente, entre os cozinheiros, há especializações: aperitivos e saladas, carnes, bolos e sobremesas, sushi. Também haverá no restaurante simulado - quatro chefs preparando pratos diferentes. Haverá dois barmen.
É uma prática comum que nem todos os pratos trazem imediatamente, mas assim que estiverem prontos. Consequentemente, os convidados não os comem todos de uma vez, mas gradualmente. E somente quando eles comeram todos os pratos você pode pagar pelo pedido. Depois disso, a tabela pode ser desocupada.
Parâmetros de tempo específicos podem ser visualizados no
código .
Modelagem
Na fig. 1 mostra o diagrama estrutural do modelo. Para modelagem, quase todo o conjunto de componentes da estrutura está envolvido. Portanto, para estimar o número de convidados na fila, o componente
Verificar é usado. Usando um manipulador especializado, ele verifica o número de convidados na fila e, se o número especificado for excedido, os envia para a saída.
Verifique também se as tabelas gratuitas apareceram.
Fig. 1. O diagrama estrutural do modelo de restauranteCom o
Bifacility , você pode ocupar e liberar a mesa. E
Atribuir emparelhado com
Cheque permite especificar se o garçom transfere o pedido da mesa para a cozinha ou já entrega a louça pronta.
Como pode ser visto na fig. 1 cada um dos cozinheiros tem uma fila de pedidos; na realidade, é claro, é possível cozinhar vários pratos em paralelo, mas no modelo apresentado isso é omitido. Para os barmen, a linha de pedidos é comum.
Resultados da simulação
Os resultados da simulação podem ser encontrados
aqui . O relatório mostra:
- duas tabelas não foram utilizadas (23 e 24) e, em geral, um quarto das tabelas praticamente não é utilizado;
- o restaurante atendeu 29 visitantes e nenhum deles saiu sem nunca entrar no restaurante;
- os visitantes não precisavam esperar na fila;
- ao final da simulação, 12 visitantes receberam parte do pedido e esperavam os demais pratos;
- os cozinheiros 1 e 4 têm uma carga muito grande (91,46%, 88,33%);
- Barman 2 não está carregado com trabalho (1,67%);
- metade dos garçons não está particularmente ocupada;
- a anfitriã 2 quase não está ocupada (9,38%).
Bottom line, o restaurante é grande e tem uma equipe extra. Ou o restaurante está aberto em um local com pouco tráfego (no modelo apresentado, os visitantes entram a cada 10 ± 5 minutos). Se você testar com maior tráfego (5 ± 3), a carga da equipe aumentará significativamente, mas alguns visitantes vão embora, sem ter que esperar por uma mesa.
Conclusão
O modelo apresentado, apesar de várias simplificações, permite razoavelmente simular o trabalho do restaurante e possivelmente possui um valor prático. Mas componentes, novos e antigos, certamente precisam ser mais desenvolvidos. Nem todas as exceções são tratadas ou tratadas incorretamente. É necessário cobrir o código da estrutura com testes e a documentação mais importante. Tudo isso é planejado e, na medida do possível, será realizado.