> For the complete documentation index, see [llms.txt](https://tutorial-ds.anylogicbrasil.com.br/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tutorial-ds.anylogicbrasil.com.br/misturando-as-coisas-dinamica-de-sistemas-e-eventos-discretos-e-agentes.md).

# 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.&#x20;

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

![](https://lh5.googleusercontent.com/N4WwUGoGq7TcMtfNag8n1NbNo4PsockftcF-U24PXXFA0eEKntK8TbCfg8bE80dIuXShOilXM2p5m0TgOJLPQKe-iK22DZ5umOMfZz9upIztwbxBjK-cO2uqRE0IrevCbx0mQ6VI)

O modelo proposto é beeem simplório:

![](https://lh5.googleusercontent.com/Nbrm1mk80ZkDKudeUC21559paw9Tdu-mqvRCgrnX8vxp11Afjkfa1zMxR2k0IIK_l5MWrkvBZsbaedhdC8GL3vMiLFkf8zp8z7tFT-gGt56IiwyPXQQ03N5noVeJyLq0InCy_fsV)

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](https://tutorial.anylogicbrasil.com.br/).&#x20;

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**:

![](https://lh3.googleusercontent.com/Z6_EyO3Z0jO2O_a153teC-55UKGshLAqfYjhTgTog_-Z6KQOXU5mHdVhV1n3GqscqHTmw0VHwlSqvLZz7EyPP1NHCzvPVM1bilF1pxeaSyraFXIE69m0knX0IxBQqhbNF9sbHE4S)

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:

![](https://lh3.googleusercontent.com/mGVmj2prh8Cdofp2MusT7x0V38FEo06ZPJ-cpk_ex13DXLicrdgo-A6GYLyAvB07eap8X7vfdeFLB2HQNigQoGRe9A8TcsWvFgv7U2NboAVO1k10T3C40DUH9s2wl_L35Y4JaM3D)

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

![](https://lh3.googleusercontent.com/bntZRnwh55cMZ6voP74XyX2lin4W6x4YACjF8oeLWMmcVZ9xWoEr314DjAxm9KmkH26w9MRbCs3RVpQFxtRipcldYey6BV-JfYVa5cFeCt8zkZ-fqECWlFAdK6JAZsZWgjB-pswb)

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.&#x20;

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:

![](https://lh5.googleusercontent.com/bj7xMxbIKjkYndQtYGdfPfTyV7VZlww9ATzsMN3348drfwipzDzSKEtGbUeFBXvUOBDMBhy6TMyYnCiQsKPaaisGibe-uSn-HGambkRVtHMvQj3yQVMQ2ih0FCyhtXEQdNbf6EFJ)

Modifique sua propriedade **Trigger type** para **condition**:

![](https://lh6.googleusercontent.com/HbepWSWlG3Qbq70QhAjoH3mHlAuG4AiyGAbit9umsrVz0Ss3Yq-qkNn-DTNqH2M1295kFZKemWkRwTvA6VOSWdQKgY_wrZgojYFQUEbIwQfqWzhAe5RFVO4Xt7m3Yf00soKODkk_)

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**:

![](https://lh5.googleusercontent.com/s81Sdq0pEKDe8c5eIVHeOYV0aOMPs2mvYghnVBamERHZieIovUhzVIoj1PzkeEO3j4kafMDVOXMhTX8gdlMoM1PcZCojLXqllpZgzQnUc_43CQDylLLbRc4lebFXfgXrdBL5APGw)

Pronto… Simule!

![](https://images.unsplash.com/photo-1614728263952-84ea256f9679?crop=entropy\&cs=srgb\&fm=jpg\&ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHwxMHx8cm9ja2V0fGVufDB8fHx8MTYzNDY0MjgwNw\&ixlib=rb-1.2.1\&q=85)

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).&#x20;

![](https://lh4.googleusercontent.com/bapIAWz728S8waUTnJVLhWh68oeX3hPVDAChRW5xBwuMIpIyRwAzd0OXF1hotFLPwpqphwB9FOp-BV7MuQwCD3fYvIzOonJm3cqIH2WUoRnPAlF_DRhsAkHMaSPja-_hKMhuh09V)
