Misturando as coisas: dinâmica de sistemas e eventos discretos e agentes

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).

Atualizado