Misturando as coisas: dinâmica de sistemas e eventos discretos e agentes
Atualizado
Atualizado
O AnyLogic é um único software de simulação que permite a construção de modelos híbridos que misturam as três técnicas de simulação.
Com este recurso, é possível, dentre outros exemplos:
Modelar a previsão de vendas com dinâmica de sistemas e a distribuição de produtos como um modelo de agentes;
Encapsular modelos de dinâmica de sistemas dentro de agentes (procure o exemplo Population, disponível no AnyLogic);
Modelar o comportamento do fluido escoando de um tanque para outro;
Representar estoques de produtos (lembre-se que o diferentes SKUs podem ser tratados como um Array);
Etc.
A melhor maneira de conectar os métodos é por meio do bloco Event da paleta de comandos Agent. Vamos praticar isso de duas maneiras, uma beeem simples e outra apenas simples.
Um exemplo beeem simples:
Considere, por exemplo, que você foi infectado por um vírus que se propaga no seu corpo à taxa de 240 unid. ao dia (ou 10,0 unid/h);
Quando atingir uma carga viral de, ao menos 800 unid., você é levado para um hospital e ocupa um dos seus leitos;
O hospital tem apenas 10 leitos (e só existe você no mundo).
Crie um modelo chamado Infectado como a unidade de tempo em horas.
O modelo proposto é beeem simplório:
Agora vem a parte do hospital. Para quem não conhece a modelagem de processos (aka “eventos discretos”) do AnyLogic, sugiro a leitura do Volume I deste tutorial.
O hospital será representado por um fluxo de entrada de pacientes, espera em fila por leito, ocupação do leito, permanência (recuperação do paciente) e liberação do paciente em alta.
No AnyLogic a representação envolve apenas 3 blocos da paleta de Process Modelling: Source, Queue, Delay e Sink:
No bloco Source, troque a opção de chegadas de agentes, que atualmente está definida como uma taxa de chegadas (Rate), para a função inject() do AnyLogic, que injeta um novo agente cada vez que ela é executada:
No bloco Delay, você precisa definir o tempo de internação em 15 dias e o número de leitos para 10:
Para concluir, conecte os dois modelos criando um evento que dispara uma nova chegada no bloco Source sempre que a carga viral ultrapassa o valor de 800. Para isto temos o bloco Event que dispara eventos baseado em critérios de tempo, taxas ou condições.
Precisamos disparar um evento sempre que a condição for verdadeira:
cargaViral > = 800
Arraste um bloco Event da paleta Agent para o dentro do modelo:
Modifique sua propriedade Trigger type para condition:
Quando a condição anterior for verdadeira, queremos que o Event execute uma nova ação: injetar um doente na fila do hospital. Utilize a função inject() contida no bloco Source:
Pronto… Simule!
O problema poderia ser evoluído para considerar não apenas uma pessoa infectada, mas diversas pessoas ou uma população. Procure o exemplo Epidemic and Clinic with Accumulating Concern, disponível na lista de exemplos do AnyLogic, apresenta um modelo que considera agentes, eventos discretos e dinâmica de sistemas para estudo da ocupação de uma clínica durante uma pandemia.
Como exercício, estude o agente Patient disponível no modelo:
Ele tem três estados possíveis (suscetível, infectado ou recuperado, respectivamente, as caixas amarela, vermelha e azul);
Quando o paciente está no estado infectado, o fluxo (flow) começa a infectar o agente ao nível de 100 por unidade de tempo (dias, no caso);
Quando o paciente ultrapassa o nível de 300, ele deve ir ao hospital. Note que o evento DecisionToGoToClinic é disparado (Trigger type) quando a condição (Condition) indica que o valo atual do Stock Concern ultrapassou a 300. Nest caso, o evento dispara um novo agente no bloco RequestTreatment pelo comando take (que está no Main do modelo e leva o agente para o hospital).