# Simulação com Replicações

Com exceção do experimento **Simulation**, todos os experimentos do AnyLogic podem ser simulados com replicações. O **Simulation**, que é o tipo selecionado por default do programa, deve ser utilizado quando você quiser executar seu modelo com a animação gráfica ativa.

Nesta seção, usaremos o experimento **Parameters Variation** com replicações, e analisaremos as saídas do modelo por amostragem. Se esta é sua primeira experiência com simulação, talvez não esteja claro o que são e para que servem as replicações, então aí vai uma explicação bem básica: como há aleatoriedade no sistema (por exemplo, o atendimento dos clientes não tem sempre a mesma duração - o AnyLogic sorteia um valor para cada uma das operações, de acordo com a distribuição que nós definimos), não seria adequado tirar conclusões sobre o desempenho da agência bancária após apenas uma execução do modelo. Deve-se, nestes casos, executar o modelo repetidas vezes e analisar o conjunto de resultados obtidos. As replicações são simplesmente as execuções do mesmo cenário, ou seja, do mesmo modelo com os mesmos parâmetros de entrada (e sementes diferentes para a geração de número aleatórios).

Por exemplo, considere que você queira estimar a ocupação média dos caixas de atendimento e que você tenha estimado que 10 replicações é uma quantidade adequada para extrair suas conclusões. Neste caso, você usará os 10 valores de ocupação média (cada replicação gera um resultado) para calcular a média deles, interpretando que este resultado é representativo da operação real. Em outras palavras, você fará uma análise por amostragem e sua amostra tem tamanho n=10.

Antes de pôr a mão na massa, um aviso de algo bacana: o AnyLogic executa experimentos com replicações com **processamento paralelo**, de modo que ele dispara uma replicação por **core** disponível na CPU de seu computador.&#x20;

Velocidade, amigos!

Vamos lá: a criação de novos experimentos é intuitiva, basta utilizar a sequência de comandos do menu suspenso **File > New > Experiment**:

![](https://lh6.googleusercontent.com/cYVlY-oVrMW-ln9gGD5A0yx__q5q26TwZfoPn39a9rmMofcoGfNBU9SAcEwdQNSrfmtCo9OgMfAibYkjsM_-jc7g9I62cD278DjARz8GxM1X1wCwvS07A9Oxszete3gDoVLKVbXp)

O primeiro passo é criar elementos de coleta de dados (**Dataset**, **Statistics**, **Histogram data** etc.), dos quais possam ser extraídas as distribuições dos parâmetros de saída. Embora já tenhamos criado diversas saídas para o modelo, todas elas foram criadas no experimento **Simulation**. No experimento **ParametersVariation: Main**, ainda não há uma mísera saída.&#x20;

Usaremos duas saídas nas análises: o tempo médio no sistema e a utilização média dos caixas. Usualmente, quando simulamos um modelo com replicações, temos um ou mais valor(es) de saída do modelo e queremos estimar as estatísticas descritivas deste(s) valor(es). O AnyLogic fornece várias opções para isto, mas, para este primeiro contato com a ferramenta, sugiro começar pelo bloco **Statistics** da paleta **Analysis**.&#x20;

Depois de alguma prática, conjunto de passos é simples:

* Determinar a estatística de interesse (no caso, a utilização dos caixas);
* Criar um bloco **Statistics** com a opção de atualização de valores **Data update** na opção **Do not update data automatically**;
* Ao final de cada replicação, adicionar ao bloco **Statistics** o valor da estatística de interesse e resultante da replicação, por meio do campo **After simulation run** na janela **Properties** do Experimento.

Vamos começar criando um bloco **Statistics** com o nome **utilizacaoCaixas**:

![](https://lh3.googleusercontent.com/rw5o9ObGjfQQOaIHz1pRFqfLtCu8SLt7FhUSKU197Hlvrv1TdVX1AwjQZ7zG76rCXxOobtzKeMLx03mVK2MeHT3bvMWT0ekzAq_r3xH0rdOSoBlnUTIMYFqbrozWA5vqP4h5lP7y)

Deixe a opção de atualização de dados na opção **Do not update data automatically**:

![](https://lh3.googleusercontent.com/frw2WY94gU_nQzZeX4ecIyhPimYISeA25LeNgmYNLFd9atCWzvgxbF08AwREB2NZBjlhLTCQhA899XIuCjvw8WDGzk1ezwuENCakJKpLqoqBpnlNyuibXNWHxcrJ0A85Iw4W7ecE)

Nosso objetivo é adicionar, ao final de cada replicação executada, o resultados da respectiva replicação no bloco **utilizacaoCaixas**. Volte à aba **Projects**, selecione o experimento **ParametesVariation: Main** e, na janela **Properties**, localize a linha **After simulation run**, no menu **Java actions**:&#x20;

![](https://lh6.googleusercontent.com/ccZQkjl-vZ_CUdlKump_GNEVH0_KTHGkiIJEgtwhq8ZCbvCwMo-z-xCuSnY_9fycya2LGcNBY1dNgbhhSunsBbAs1AN73ic8VNNg82ptpdsVgq-vVlUMaU1nnfYAIrYpiuQJ23pL)

Esta linha de comando (que no momento está vazia) é sempre executada quando o AnyLogic termina a simulação de uma replicação.&#x20;

O bloco **Statistics** possui a função **add()** exatamente para isso, de modo que a expressão para se adicionar um valor para o bloco **utilizacaoCaixas** seria algo como:

`utilizacaoCaixas.add(`*`...alguma estatística…`*`)`&#x20;

ou (acostume-se com o comando **Crtl+Espaço**):

![](https://lh3.googleusercontent.com/T58WjjMbx9RktdOY0eFrIEDvyOkP13F2QhTIWvOMTQr7dnlGOINr6_cvX6sA0BIcAVWDoyxeCpKQz9u8X_k6h_IhSbWeSH48gK2kkCEw3kz9fycWJuHok4KedRG24N3gQx9zvybL)

O nosso modelo já calcula a ocupação média dos caixas, dentro do bloco **Resource Pool** (aquele que está lá no nosso **Main** e apelidamos de **caixasDeAtendimento**), por uma função chamada `utilization().` Sendo assim, para acessá-la basta digitar: &#x20;

`caixasDeAtendimento.utilization()`

Mas tem mais um detalhezinho: se você pousar o mouse na lampadinha amarela na linha **After simulation run**, vai receber a dica da palavra **root**.

![](https://lh5.googleusercontent.com/Uq54EpNoBS0marNJpd60giXVSa_JrhxlSZs89rFxEiQuonRiRPDjxl8Vh3y_0Y3MA3ga09Yc1u2hWDon4-0NkFjL6EFA-YU1LxcSM0wDSH_gpNcx69kjxkIqPHnx_SbAfyULDQT6)

Com o comando **root**, você acessa cada replicação assim que ela terminar. Veja na figura como ficou o comando completo (a cada ponto digitado, **Crtl+espaço** e **não se esqueça do ponto e vírgula ao final**):

![](https://lh3.googleusercontent.com/kl_1Mwxvbq7UcFb-5TcbNQoyXn4d1bz6NTJMDxcYaw2J11ZwbIIHyaFqEPaXbDWxjUVgDqfzx3azwGFbNiYre7Wwzk5LE4tdrfZSMpx86LNklMJ0gPsqNi12ZsW7a1Gg-UibuP9v)

Um breve resumo do que fizemos até aqui:

1. Criamos um bloco **Statistics** **utilizacaoCaixas** dentro do **Parameters Variation**.
2. Nas propriedades do experimento **Parameters Variation**, colocamos no campo **After simulation run** da aba **Java actions**, o comando:&#x20;

**`utilizacaoCaixas.add(root.caixasDeAtendimento.utilization())`**

A sua atenção agora deve ser direcionada para a janela de propriedades do experimento, na barra **Replications**:

![](https://lh6.googleusercontent.com/bZX6Ly5K5Q98Ws9YJMiM4-PcCW_yWxCF2i_8pweu5IrTO-4SosgXc9CvIbarMs7RddeotSNAAOX2Dzdi22bFDHqe1nnFuYSu4EeTdhn0cmt7Y51v02Uw2QCf3x4qHMrW1Gahznzt)

A opção **Use replications** abre o resto de opções da janela:

* **Fixed number of replications** para executar um número fixo de replicações;
* **Varying number of…** para executar um número de replicações tal que garanta que o **intervalo de confiança** para determinado valor (parâmetro **of expression**) seja uma porcentagem (parâmetro **Error percent**) do seu valor médio.

Outra coisa importante: **o&#x20;*****default*****&#x20;do AnyLogic é manter a semente do gerador de números aleatórios fixa**, garantindo que os resultados das simulações com mesmo valor de semente sejam sempre iguais (mesmo que executados em computadores diferentes, por exemplo). Isto se aplica mesmo entre replicações, o que nos obriga a informar ao AnyLogic que queremos uma semente diferente a cada simulação. Isto é feito na aba **Randomness**, trocando a opção de semente para **Random seed**:

![](https://lh5.googleusercontent.com/ZqJz0ZqfLtOtv3B4gYR_b1aKd3kX0qbjdMc0Xg0P9EcLOM-RMTK-bsNySUPOA7Klp0Xn9C2SywwS7tAeAFAsexcgPKmhihnQCa-G0Vj5bgiuS-VWj81KnyFGxuof7N4yYAPe7x8U)

Agora é só simular e você terá o resultado da simulação para o número de replicações desejado.&#x20;

Observações:

* O bloco **Statistics** possui diversas funções para extrair a média, o menor valor, a variância etc. [Veja as opções no Help!](https://help.anylogic.com/topic/com.anylogic.help/html/analysis/statistics.html?resultof=%22%53%74%61%74%69%73%74%69%63%73%22%20%22%73%74%61%74%69%73%74%22%20)
* A sequência de passos anterior pode ser utilizada também para o bloco **Dataset**. Quando devo utilizar o **Dataset**? Quando você deseja armazenar a amostra, os resultados de cada replicação (em contraponto, o bloco **Statistics** não mantém a amostra utilizada nos cálculos);
* O Experimento **Parameters Variation**, permite simular com variação de parâmetros. Por exemplo, poderíamos simular nossa agência bancária para valores do número de caixas abertos iguais a 1, 2, 3, 4… Neste caso, deve-se tomar cuidado, pois apenas um bloco **Statistics** não seria suficiente. Precisaríamos de um bloco de estatísticas para cada parâmetro de entrada diferente. Foge ao espírito deste tutorial, mas uma boa alternativa neste caso, seria utilizar [**Collections**](https://help.anylogic.com/topic/com.anylogic.help/html/data/collection-variables.html?resultof=%22%63%6f%6c%6c%65%63%74%69%6f%6e%22%20%22%63%6f%6c%6c%65%63%74%22%20).
