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 com as três técnicas de simulação. Por exemplo, você pode modelar a previsão de vendas com dinâmica de sistemas e a distribuição de produtos como um modelo de agentes. Outra opção bem interessante é encapsular modelos de dinâmica de sistemas dentro de agentes (procure o exemplo Population).

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

Um exemplo bem simples:

  • Considere, por exemplo, que você foi infectado por um vírus que se propaga no seu corpo na taxa de 240 unid. ao dia (ou 10,0 unid/h);

  • Quando você atingir uma carga viral de, ao menos 800 unid., você vai para um hospital e ocupa um leito;

  • O hospital tem 10 leitos (e só existe você no mundo).

Crie um modelo chamado Infectado como a unidade em horas.

O modelo de sistemas dinâmicos é bem 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. Eu vou fazer bem simples, com apenas 3 blocos da paleta de Process Modelling: Source, Queue, Delay e Sink:

No bloco Source, você deve trocar a opção de chegadas de agentes, que atualmente está definida como uma taxa de chegadas, para a função inject() do AnyLogic, que injeta um agente por comando do usuário:

No bloco Delay, você precisa definir o tempo de internação em 15 dias e o número de leitos para 10:

Para concluir, basta conectar os dois modelos criando um evento que dispara uma chegada no bloco Source sempre que a carga viral ultrapassa 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 nosso 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. Isto é fácil com a função inject contida no source:

Pronto… Simule!

O problema agora poderia ser evoluído para considerar não apenas uma pessoa infectada, mas diversos agentes. Procure o exemplo Epidemic and Clinic with Accumulating Concern. Ele considera agentes, eventos discretos e dinâmica de sistemas e, apenas para destaque, veja o agente Patient:

  • Ele tem três estados possíveis (suscetível, infectado ou recuperado);

  • Quando ele 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 estoque Concern ultrapassa a 300, o evento DecisionToGoToClinic dispara um novo agente no bloco RequestTreatment (que está no Main do modelo e leva o agente para o hospital).