# Tutorial AnyLogic: simulação de dinâmica de sistemas

## Introdução

![](/files/-MSK2Km5eGBgACP7tIjC)

Este é um Tutorial do AnyLogic, ambiente de Simulação de Eventos Discretos, Agentes e Dinâmica de Sistemas (*Si desea leer la versión en español* [*clic aquí*](https://tutorial-ds.anylogicbrasil.com.br/espanol)).

Ele foca o conteúdo de **Simulação de Dinâmica de Sistemas** do AnyLogic. (Nota: o AnyLogic também permite a modelagem de problemas da Dinâmica de Sistemas, que podemos chamar de mãe da simulação de dinâmica de sistemas, comum nas grades curriculares de cursos tecnológicos de Naval, Mecatrônica, Elétrica, Química etc. O conteúdo a seguir serve igualmente de base para esse tipo de modelagem).

![Os três métodos de simulação do AnyLogic](/files/-MSKr5VwplB-UjNMEoTf)

Embora seja o 2° volume da série de “tutoriais rápidos” (o 1º, de simulação de processos no AnyLogic, [você encontra aqui](https://tutorial.anylogicbrasil.com.br/)), ele pressupõe que o leitor ainda não conhece o AnyLogic e busca uma **partida a quente** do software (eventualmente por já conhecer outras ferramentas, como o Vensim ou o Stella).

Então, não confunda: este tutorial versa sobre Dinâmica de Sistemas; o volume I, sobre Processos; e um possível volume III será sobre simulação híbrida (união das 3 técnicas).

*Se você deseja um treinamento completo em AnyLogic, visite a* [*página da Genoa no Eventbrite*](https://genoa.eventbrite.com.br) *e se quiser saber mais sobre quem somos, o que fazemos e como vivemos, visite* [*a página da Genoa*](https://www.genoads.com.br/) *na rede mundial de computadores.*

![](/files/-MSK2OsJtsBXAqIO1UgG)

## Premissa

Este tutorial parte da premissa de que você já teve algum contato com a Simulação de Dinâmica de Sistemas. Ao final, são oferecidos alguns links, vídeos e sugestões de livros para ampliar seu conhecimento. Em momento algum o Tutorial vai explicar conceitos de modelagem ou simulação, assumindo que você já entenda o básico. Se você quiser a recomendação de [um livro bacana de Simulação, siga o link.](https://leanpub.com/msed)

## O que você precisa para este tutorial

Para realizar este Tutorial, você precisa de:

1. Um computador ou notebook (64 bits) com Windows, Mac ou Linux instalado;
2. Mouse com rodinha (para o **zoom** de tela), exceto se estiver usando um Mac;
3. Acesso à Internet;
4. Amor no coração.

## Etapas

Este tutorial tem quatro partes que devem levar *cerca de* duas horas para serem percorridas. Recomendo que você abra este arquivo em outro monitor conectado ao seu computador, ou em um segundo dispositivo, como um tablet ou até mesmo a tela do celular. Não imprima este arquivo ou mesmo gere um pdf, pois eu já fiz isso e deu errado não tem cabimento imprimir um tutorial cheio de gifs animados.

Ah, além das quatro partes, há também o Apêndice, que complementa o tutorial com tópicos específicos e de execução rápida.

**Nota para docentes**: dimensionamos o tutorial para uma aula prática de 2 horas em laboratório com recursos computacionais, para alunos que já tiveram algum contato teórico com simulação de dinâmica de sistemas (o material é autoexplicativo, ficando a cargo do professor qual a dinâmica da aula). Apesar disso, ao começo da Parte II, elaboramos uma breve discussão sobre a modelagem de laços causais do problema proposto, que pode servir de base para uma introdução teórica ao tema.

![](/files/-MSG7AZBkQ3ehKstoOmM)


# Instalação, abrir, fechar e uso do mouse

## Download e instalação da versão PLE

O AnyLogic possui uma versão chamada [**PLE - Personal Learning Edition**](https://www.anylogic.com/downloads/), específica para autoaprendizagem ou uso em sala de aula. Todo este tutorial foi elaborado nela.

Se ainda não o fez, você deve baixar a versão PLE por meio deste [link](https://www.anylogic.com/downloads/).

## Tela de boas vindas

Quando o AnyLogic é aberto pela primeira vez, surge a tela de boas vindas, como na imagem abaixo (a cor predominante pode ser outra se a sua versão do AnyLogic for diferente, não se preocupe quanto a isso):

![](/files/-MSG7AZCa7SsphT00e7F)

## Abrindo um modelo

Vamos começar abrindo um modelo. Clique no botão **Open examples,** localizado à esquerda na janela.

A tela muda para refletir a disponibilidade dos mais de 390 exemplos embarcados no AnyLogic, inclusive é importante que se destaque: todo usuário avançado do AnyLogic copia (=CTRL+C) ideias destes exemplos.

Se você rolar a barra da esquerda um pouco para baixo, vai encontrar todos os exemplos do Livro [“Business Dynamics”, de John Sterman](https://www.mhhe.com/business/opsci/sterman/)[\[1\]](broken://pages/-MSG7AZ93zE9lncHj8ge#footnote-1), considerada a bíblia da dinâmica de sistemas aplicada aos negócios.

![](/files/-MSG7AZD0sbd-ojMfWXo)

Nossa primeira atividade será abrir um modelo e entender um pouco do AnyLogic: procure o modelo **Insurgency Dynamics** em “Social and Eco Dynamics” na coluna **Examples** e, a seguir, selecione o modelo **Insurgency Dynamics** na coluna à direita ou simplesmente digite **Insurgency Dynamics** no espaço para digitação (na parte superior da primeira coluna).

![](/files/-MSG7AZEguhuauWbo91b)

Com o modelo aberto, é fácil reconhecer as 3 grandes regiões de trabalho e comandos do AnyLogic:

* À esquerda é por onde você vai navegar pelos **agentes** do seu modelo ou buscar, na paleta, elementos/blocos de construção;
* Na região central, temos a área de trabalho propriamente dita, para onde os blocos são arrastados e o modelo é construído;
* À direita, temos a janela de **propriedades do elemento selecionado com o mouse.** Na figura a seguir, por exemplo, o objeto selecionado é o ícone com o nome do modelo **Insurgency Dynamics \[cloud],** de modo que à direita temos as propriedades principais do modelo aberto (note que podemos modificar o seu nome ou a sua unidade de tempo, por exemplo):

![](/files/-MSG7AZFP1TIekUchHTW)

Na janela **Properties** existe um campo, logo abaixo, em que o desenvolvedor deixou um texto que descreve o que o modelo faz (boa ideia: sempre comente seus modelos).

Resumidamente, trata-se de um modelo clássico de insurgência em uma sociedade. Nesse contexto, as pessoas são divididas em quatro grupos: apoiadores do governo, dissidentes, insurgentes e insurgentes removidos. Os dissidentes e insurgentes se comunicam com apoiadores do governo que recrutam pessoas para se tornarem dissidentes. Mas nem todos os dissidentes se tornam necessariamente insurgentes: uma fração do grupo dissidente é apaziguada pelo governo e volta a apoiá-lo. O restante dos dissidentes acabam se tornando insurgentes. A força dos esforços do governo para reduzir os insurgentes depende dos recursos alocados e é proporcional ao tamanho do grupo de insurgentes.

Parece divertido! Para execução do modelo, primeiramente deve-se clicar no botão verde na barra de menu superior **Run Insurgency Dynamics/Simulation** ou usar o atalho (F5, para Windows):

![](/files/-MSG7AZGUa3A34VnrSjY)

O AnyLogic compila o modelo e, se não houver nenhum erro de compilação, ele abre o modelo no seu formato **executável.**

**Importante:** o AnyLogic gera modelos executáveis em linguagem Java. A versão profissional do software permite que o usuário exporte seus modelos em formato executável, de modo que eles possam ser distribuídos e executados em computadores que não possuam o AnyLogic instalado, sem custo adicional ou necessidade de licença.

![](/files/-MSG7AZHkjONh-fWkqC5)

Na tela de abertura são apresentados os diversos parâmetros do modelo com botões de deslizar (que nós veremos como são feitos ao longo deste tutorial). Sem perder muito tempo, inicie o experimento de simulação por meio do botão de **Run** no ![](/files/-MSG7AZIqQVfxrEc6DLr)canto inferior esquerdo da janela:

![](/files/-MSG7AZJQNolKCX0pbB-)

Este modelo é mais que um modelo: na verdade são dois modelos executados ao mesmo tempo!

O **SD model** é o modelo representado por dinâmica de sistemas e o **AB model** é o mesmo modelo representado por [simulação baseada em agentes](https://www.anylogic.com/use-of-simulation/agent-based-modeling/). Os gráficos na parte de baixo mostram como evoluem a parcela de cada grupo da população (à esquerda, o modelo de dinâmica de sistemas e à direita, de agentes).

Com um olhar atento você deve notar que o gráfico do modelo de SD é suave, enquanto o AB tem alguns degraus. Você consegue explicar por quê? (Resposta ainda hoje, nesta seção mesmo).

![](/files/-MSG7AZKtM54ya_WCHCi)

Clique em **SD model** no canto superior direito para acessar o modelo de Dinâmica de Sistemas (este menu foi criado pelo desenvolvedor do modelo). É um modelo de porte médio para os padrões da dinâmica de sistemas. Parece confuso, mas não é: note que a parte de cima representa o *fluxo de pessoas* desde o nascimento até que se tornem insurgentes removidos (acho que já deu para entender que “removido” é um [eufemismo](https://pt.wikipedia.org/wiki/Eufemismo), não?) ou, simplesmente, criem juízo \</ironic off> e tornem-se apoiadores do governo.

![](/files/-MSG7AZL6-HtF7Nxn1Z6)

Se você clicar agora em **AB model** vai visualizar o modelo baseado na simulação de agentes, *em que cada indivíduo é representado por um agente específico* (por isso o gráfico da simulação de agentes não é tão suave quanto o da simulação de sistemas dinâmicos, que não individualiza a pessoa, pois trabalha sempre com **fluxos**).

**Importante:** note que o modelo de agentes é, de fato, um modelo **híbrido**, pois o fluxo de mensagens antigoverno é modelado por dinâmica de sistemas (representado pela região amarelada na parte de baixo da figura a seguir), enquanto as pessoas são modeladas por agentes. Esta é outra característica única do AnyLogic: construir modelos híbridos misturando sistemas dinâmicos, agentes e eventos discretos.

![](/files/-MSG7AZM1qEoLJdm9RmJ)

Se você clicar no botão **Open statechart of random agent** poderá visualizar como o agente foi codificado neste modelo, em que cada balão representa um **estado do agente** e as transições são feitas, na sua maioria, por mensagens trocadas entre os agentes (foge ao objetivo deste tutorial explicar o procedimento).

Agora é hora de fechar esse “app” clicando no “x” do canto superior direito da sua janela e partir para colocar a mão na massa!


# Difusão no mercado do novo app de uma startup

Construiremos um modelo de uma startup que pretende lançar um novo aplicativo (app) para celulares no mercado. Em uma primeira etapa, estamos preocupados em como o produto irá se difundir no mercado e, numa etapa seguinte, completaremos o exercício considerando o fluxo de caixa (investimento, faturamento e custos envolvidos).

O app será gratuito e a monetização se dará por anúncios e pela venda de funcionalidades adicionais. Assim, a startup entende que o volume de usuários é parâmetro fundamental para a viabilidade do negócio.

### Objetivo desta etapa:

* Construir um modelo de simulação que permita avaliar como o app irá se difundir no mercado e estimar por quantos meses a startup deverá investir em marketing de modo que ela atinja, ao menos, 1 milhão de usuários até o 6o mês do lançamento do app.

### Dados:

* O tamanho do mercado é estimado em 5.000.000 clientes potenciais e, uma vez convertido, o cliente nunca abandona o app;
* Estima-se que cada mês de investimento em marketing seja capaz de converter 1,1% dos clientes potenciais em novos clientes;
* Existe um efeito esperado de propaganda boca-a-boca: cada usuário do app comenta com 10 dos seus contatos por mês e, neste caso, a probabilidade de sucesso de conversão é de 5% (dentre aqueles que ainda não são usuários).

A startup tem pela frente, portanto, o lançamento de um novo produto que será difundido no mercado por meio de ações de marketing (propagandas, participação de eventos, press releases etc.). Espera-se que, em algum momento, o produto “viralize” por meio de propaganda boca-a-boca.

Definido desta forma, o problema é semelhante ao modelo clássico de marketing, conhecido como: [Modelo de Difusão de Bass](https://en.wikipedia.org/wiki/Bass_diffusion_model), criado por [Frank Bass](https://en.wikipedia.org/wiki/Frank_Bass).

![Dr. Frank Bass](/files/-MSKrw5Zy46DCReS53Dm)

Pela perspectiva de um *problema de otimização*, temos como variável de decisão o número de meses de investimento em marketing e o objetivo é minimizar o custo de marketing, sujeito à condição de que em 6 meses, o número de clientes deve ser maior ou igual a 1 milhão.

Antes de começar no AnyLogic, temos duas seções que descrevem o modelo que será construído por meio do seus diagramas de “laços causais” (ou *causal loop diagram*, como diria o Tio Sam) e diagramas de “estoque e fluxo”.


# Diagrama de Laços Causais (DLC): modelo de difusão do produto

Se você pensar apenas no **ciclo de marketing**, o Diagrama de Laços Causais - DLC, a seguir é representativo da *dinâmica do sistema*:

* Pelo arco inferior, quanto mais clientes em potencial (ou mais mercado não explorado), maior a de conversão de marketing e, portanto, maior o número de pessoas comprando nosso app. A conversão de cliente potenciais em compradores do app é governada por dois parâmetros: “eficácia das ações de mktg” – que equivale ao percentual de clientes potenciais convertido por mês ou taxa de conversão mensal de clientes – e o número de “meses” – que equivale ao número de meses investidos em marketing;
* Pelo arco superior, quanto mais pessoas compram o app, menos pessoas estão disponíveis no mercado (se, por exemplo, o mercado fosse composto pelas pessoas que trabalham ou estudam com você, a cada “convertido” o seu mercado ficaria uma pessoa menor, até que todos fossem convertidos e você não teria mais o que fazer na vida).

![](/files/-MSG7AZN8-jGqpZl2zJi)

Na figura, eu acrescentei também uma letra “B” com um loop desenhado, representando que a sequência “Clientes potenciais > Conversão > Pessoas comprando > Clientes potenciais” é um **loop de balanceamento** (daí o “B”) ou **equilíbrio**.

Um “loop de balanceamento” é caracterizado por laços que se compensam, formando uma sequência que busca um ponto de equilíbrio dentro do sistema. Para identificá-lo, percorremos o loop partindo de qualquer variável, como Clientes potenciais, por exemplo. Supondo que esta primeira variável aumente, se, ao retornar para a variável, o efeito causado pelo loop for oposto, ou seja, de diminuição, então temos um loop de equilíbrio (caso contrário, temos um loop de reforço, que será exemplificado daqui a pouquinho). Neste exemplo, temos o seguinte efeito: se a quantidade de clientes potenciais aumentar, a conversão por marketing também aumenta, o que gera um aumento na quantidade de pessoas comprando o app, que, por sua vez, causa uma diminuição na quantidade de clientes potenciais. Ou seja, saímos de um aumento nos clientes potenciais e retornamos com uma diminuição dos mesmos. O conceito é esse, mas caso você prefira usar uma regrinha: quando o número de sinais negativos nos laços que compõem o loop é ímpar, ele é de balanceamento. Seja como for, acostume-se à ideia de que, terminado um loop, você deve passar mentalmente pela sua sequência e verificar se ela faz sentido.

Mas como eu disse, marketing é só uma das formas de atração de novos compradores. Nosso app também será divulgado pelos usuários nas redes sociais, formando um rede de divulgação boca-a-boca (Fica como exercício: na era das redes sociais, como denominar a divulgação “boca-a-boca”?), cuja dinâmica está representada na figura abaixo:

![](https://lh3.googleusercontent.com/YSLlLotWHZS56U1aaXA4paUFNF9gmDrOT0rekwPD8UTGLS-xC2RENBNzCcCovSXU90ryMg4DLKhsfTVtTw70uiJoLMmJ-uoXbAKlcBc_aZ37JbjuTaD_wY67UVndSA5dARE7f7cC)

* A taxa de pessoas comprando o app tem um impacto positivo (e direto) sobre o número de clientes (arco superior);
* Com o aumento do número de clientes, mais gente divulgará nosso poderoso app e, portanto, maior será a taxa de conversão de novos clientes por rede social. De novo, ter mais pessoas convertidas significa que mais pessoas estão comprando o app. O arco inferior representa esses efeitos.

Neste desenho, o loop de “boca a boca” ganhou um “R”, indicando que ele é um loop de reforço. Neste tipo de loop, o sistema parece aumentar (ou diminuir) indefinidamente. Tipo picada de borrachudo: quanto maior a coceira, mais você coça, o que aumenta a coceira, só que aí você coça mais… e poderíamos ficar nesse ciclo vicioso pra sempre.

A boa prática recomenda que você não desenvolva uma (nova) neurose detalhando mais e mais o diagrama de laços causais. Embora ~~o meu psiquiatra tenha sido claro~~ o diagrama anterior já seja adequado, eu ainda vou acrescentar mais um loop e gostaria que você refletisse sobre o significado dele:

![](https://lh5.googleusercontent.com/HujaWQ7EgAJ5B82kUv-6S5obj7c7K1Tu13HQmVEbBld_EkTLLdpEPQoWw46ljYJ575aFOEg87V-PjIz1Ff_fpYtrUHlFH562CHCnN5EBrcSXdwmtRk-mGXiOSvdi5iFHeTnNn_qN)

Se você quiser um roteiro conciso de dicas para construir um bom DLC, visite [esta página no The Systems Thinker](https://thesystemsthinker.com/guidelines-for-drawing-causal-loop-diagrams-2/) ou essa série bacana de [2 posts do Sterman](https://thesystemsthinker.com/fine-tuning-your-causal-loop-diagrams-part-i/) no próprio The System Thinker.


# Diagrama de estoque e fluxo

No diagrama anterior representamos apenas relações de causa e efeito, sem dar muita bola para quais seriam as unidades envolvidas, valores ou relações matemáticas e lógicas. A etapa seguinte é representar o sistema por meio de um diagrama de estoque e fluxo, representação que está mais próxima daquilo que você vai construir no AnyLogic.

O primeiro passo é refletir, no diagrama anterior, quais seriam as unidades envolvidas. Este tipo de reflexão é fundamental para que você ganhe conhecimento sobre o sistema e o modelo a ser construído:

![](https://lh3.googleusercontent.com/FwXPpK1D4aXQODAce3d86-idY5BxfIGIq-plg3YPWQoIeTHxUXxL8sh2wR5fPsgCkBtiu4iclzsLPP4Zbgs6EQdLNVH13Q1KoPlERua0lkJWFPSySLyZQShHOTbiznwQliL4jmCA)

Neste tipo de diagrama, “estoques” representam coisas que se acumulam ou se esgotam ao longo da simulação. Enquanto “fluxos” representam  as taxas com que esses estoques aumentam ou diminuem.

Para o nosso caso, o diagrama de estoque e fluxo pode ser representado como a figura a seguir, destacando:

* As caixas (parecidas com caixas d’água) representam os estoques de clientes potenciais e de clientes (a aguinha azul é só charme);
* Existe um fluxo de pessoas passando de um estoque para outro, isto é: a taxa de pessoas comprando o app, que é representada pela válvula ligando ambos os estoques.

![](https://lh3.googleusercontent.com/cGj-puvsV1jYwhmXCUZQrd7fBnWyOiHwWmnVMYLzHRkKiaNTfs5xmXEAYPjroe8vwyMbIDEj72kEqQ4V5zQSbJgRbP85-sLgdBqiGS-6GyhTNStpIjjg0SaXwNxGuqKutNP9WG4C)


# Criação do modelo

Um novo modelo no AnyLogic é criado pela opção de menu suspenso **File > New > Model**. Informe na janela de criação o nome do modelo, StartUp, e troque a unidade de tempo geral do modelo, de **seconds** para **months**.&#x20;

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


# Construindo o diagrama de estoque e fluxo no AnyLogic

## **Blocos Stock & Flow**

O AnyLogic possui diversas paletas com blocos de comandos que são arrastados para a área central de modelagem.

Nesta primeira etapa do exercício, construiremos o diagrama de estoque e fluxo, como no desenho anterior, a partir da paleta de comandos **System Dynamics**. As paletas de comando estão do lado esquerdo da tela e quando você deixa o mouse por algum tempo bem na margem da tela, aparecem os nomes das paletas:

![](https://lh3.googleusercontent.com/jCxxD0I7Niiu8nXqiCGeBja18CEWVtZnY1uPgyBDK6waJHl-u6OtZqMJj56Yx4vCeSOQjdAP_j4VwZAGqqg6P1V133GQ-iPT-sKn5gVGzuwn-_iVF5MSKjVpd8NFnXW4L1nEJxhp)

A paleta é bem simples (o que é bom!) e os comandos são utilizados por sequências de clicar e arrastar. Por exemplo, vamos criar o nosso primeiro bloco de estoque (urra!): clique, segure e arraste o bloco **Stock**, a partir da paleta, para o meio da tela! \[Repare, na região de **Properties** à direita, como o menu se altera para refletir as propriedades do que você clica na tela]:

![](https://lh6.googleusercontent.com/0pbkUVPsE_eHusZjeMjcq5begizrhl4asPFI1OQSTuoW2BI0GvUVcfKMwT6eBY4EHxzydGvkzkH9npXqszq24BLelW1UTuzfrS7BkRpCjlLRc--4XgeGYUdUvparC5Ewx2MaTQgw)

Arrume um pouco o bloco:&#x20;

* Modifique o nome para **ClientesPotenciais**;
* Aumente um pouco o tamanho e centralize o texto:

![](https://lh4.googleusercontent.com/iEpTgZF7Y7VPbnkNX69sCs-WPQEtLaz5_Mpj3JBI3nQfigaa6B4bM-82vO9f2yiSDdMypOv7xNttRhlVG20wEig-dqQiQl7D0-w_ekk9Tk_m5fzgZ9ULDZXi3jO_0GXrzZeTwqxO)

{% hint style="info" %}
**Importante**

No AnyLogic todos os nomes de blocos e elementos são considerados também como nome de variáveis, parâmetros ou classes, dentre outros animais. Assim, ele não aceita nestes campos: espaços em branco, acentuação ou cedilha, dentre outros animais.
{% endhint %}


# Zoom

O comando de zoom no AnyLogic está escondido no seu **mouse**: segure o botão de **Ctrl** e gire a rodinha do mouse (ou pressione **⌘** enquanto faz o gesto de rolagem de tela, no **trackpad** do seu Mac). Alternativamente, você pode utilizar os comandos de zoom na barra de menu superior do AnyLogic.

![](https://lh5.googleusercontent.com/PCGVT7dPsM718THlhuPs5woWbxGHGdX9pI6LkUn2aEf7QfBIvE1D9oLqS6T9ML4IIoqVoeA_xChu3JcL-cakUFHR7TnEFEKOCB9UpBAr0S5_e8GDQ6l-BvkS4C0WAV0vqJ8gbE8n)

Para o segundo bloco de estoque, vou utilizar o comando de **Copy/Paste**, mas antes que você faça qualquer coisa, conheça mais um comando secreto do seu mouse:&#x20;

* Clique e segure o botão de **Ctrl** (ou **⌘** no Mac) do seu teclado, ao mesmo tempo em que clica e segura no elemento que deseja copiar;
* Arraste até o local desejado e solte.

Agora, modifique o nome do bloco para **Clientes**.

![](https://lh3.googleusercontent.com/rF3pVNbZA71RXCkl8ZXfxBuqWSb1__lV82ismEl7563w-DxsMSPazRB2L_ZKsnFAoYtanuNDPkL-3Q6aElDsYfNV6MpQJ3MFKZ1WEjtYL6OqS0-gQQafQHeyiea349whyBbgjZwI)

Entre os estoques existe um fluxo e o AnyLogic possui duas formas de construí-lo: desenhando do ponto de início ao fim ou arrastando (como feito no bloco **Stock**).

Sempre que um elemento de paleta do AnyLogic possui um ícone amarelo ao seu lado direito, se você der um duplo clique, ele entra no modo de desenho e aparece uma caneta que substitui seu ícone:

![](https://lh5.googleusercontent.com/ZuSGShlAyQuRs3vMD-wsjPpHuLqXCqiDq5z5keQKSvGkbHW4MX9p_R7H-9eY7m9IT3jxGZWkt488ZgkOSMAFqyojOnpTqEC4iduB80Yjc1hihHblF8qYqWh5wKFokXgC1nixAYMY)

Agora crie o **Flow taxaDeConversao** entre os dois estoques, utilizando o modo de desenho do AnyLogic:&#x20;

![](https://lh3.googleusercontent.com/3M0Mo0QkUCGEztI5lvrGWZU2zl9Wt0cU3p7Ou8l5BqC38oOLb2nuY4v25Espt0YpIAU7k73S1mT_fyDNo6D3F-xWvnIk4X-Pv-V5BVdiQZxTqARQULqZZrD1lmFCOEZax1KKzAKe)

**Importante**: para estar corretamente conectados, o início e fim do fluxo devem estar conectados, respectivamente, com os centros dos blocos de estoques. Isso é identificado pelas bolinhas verdes nas extremidades (quando não há conexão, o AnyLogic cria uma nuvenzinha):

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

Note que o elemento **Flow** é altamente configurável. Por exemplo, se você quiser criar um zigue-zague ou mesmo tirar qualquer canto do elemento, basta clicar em cima do bloco e aproveitar os nós que surgem ou clicar de novo nesses mesmos nós, para que o canto desapareça:

![](https://lh6.googleusercontent.com/Y0LYig39AAQeUW7M9HGWf0nXTkUzNnTGorFOKhZd8M9EoGgN-_f9lBkecBvmlvwuNmclscD-X0ylNIYVeEHt2JSadFh3OPhGgpxxMyMk7IXpoTaaIiT0gtCecuoazIRBQ3bZH5X0)

Lembre-se que o app não começa com zero usuários: você, seus funcionários, pai e mãe entram na conta, de modo que o estoque **Cliente** começa com **Initial value**  igual a 10 clientes!

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

Já se parece um pouco com o diagrama de estoque e fluxo, não?


# Parâmetros no AnyLogic

Existem valores neste problema que poderiam ser considerados como parâmetros a serem preenchidos em alguma interface ou, mais especificamente, **parâmetros de entrada** do modelo (dados de entrada). Eles são fáceis de identificar:

* A população total (ou o número de clientes potenciais ao início da simulação);
* A eficácia das ações de marketing e o número de meses de investimento em marketing;
* A taxa de contato dos clientes e a probabilidade de conversão.

No AnyLogic, parâmetros se equivalem a variáveis, mas com uma diferença: parâmetros são utilizados automaticamente na interface de entrada do modelo. Isto ficará mais claro em breve, quando estivermos mexendo com **experimentos**, por enquanto, vamos criar os parâmetros necessários utilizando o bloco chamado, pasmem: **Parameter**.

![](https://lh4.googleusercontent.com/aFGpRHh_ykO0T9L1IxjfJ1kl5IuUcfizizNOxBEk39f0M6vQHTTbPXPvcmBnnNNSPcU3vrfOxv_hraTitmT7yqHE3r8QuHUH619lxjrs8pR6CkJAGFpA7VE7qLqJEg_ZO9KxUnFj)

Como um parâmetro é sempre um dado de entrada, convém atribuir algum valor default. Atribua o valor 5.000.000, por meio da janela **Properties** ao lado direito da tela:

![](https://lh4.googleusercontent.com/jvNzTasxF4TyVb37y82qhY4i_YXmzmVii-ckjuwYIe61JuzRTUG65m89rKVmYtDgXC6SY3ttf-cmK0v3w-9s_W7oOdPS3GFN9DI7iMylf1DvZXw2vJ5uYe84f7MdwZSofUNt-whk)

Com o parâmetro criado, você deve construir a conexão entre **populacaoTotal** e **ClientesPontenciais**, por meio do elemento **Link** da paleta de comandos:

![](https://lh5.googleusercontent.com/GXofsylgZgVmH6Mlx6_F9Fnx6RsORgyVa_InyG_buQ7kRtjg7-GfXVziLXyqxKvHYLTps_zdAI7pVFaVmPdnpBYVyUQTswwLTgMvdQGyfYHeKeSUYBK5Kb8ShELh-LTxHDw2TV7M)

Note que o **Link** é representado por uma linha tracejada. Isto indica que a ligação criada termina em um estoque.

Atenção: para não errar a construção do **Link**: as extremidades devem sempre estar com pequenos círculos verdes, quando selecionadas. Veja o exemplo:

![](https://lh6.googleusercontent.com/roLl_J6nQHqsNVTtupAHsyfjOA6BBR-p_lqqJ5CvT0_ekMjgg7K0zP5KKkOtqVI-tbXR93Ot_ElGzNxzf43XBcQ5pF4A9sZjkMAnpWWAYIyD27gnLfn2ut5MT3dRQagNtOGCExCi)

A última etapa é atribuir o parâmetro **populacaoTotal** ao valor inicial do estoque **ClientesPotenciais**. Novamente, a janela **Properties** do bloco de estoque resolve o problema e basta digitar **populacaoTotal** no campo **Initial value**.&#x20;

Mas antes, eu tenho que te apresentar o atalho do AnyLogic mais importante, mais utilizado por seus usuários e que acelera o tempo de desenvolvimento: **Ctrl + Espaço** (no **Mac**, use **option + espaço**):

![](https://lh4.googleusercontent.com/YY8k5cu3qVea4kncT2lYhJqVVwnrHubRer7XwctSZEf6H8da0xiQ2WIaIA3nHhxXJE6GXjuB7xAvTscfatZGKusCYrBAJNvzd-QDLyD4X9fBeiOctBN3ERYy1b3QIldBuz973tNc)

* Digite, no campo **Initial value**, apenas parte do nome do parâmetro: **pop**;
* A seguir, segure o botão de **Ctrl** (ou **option**, no Mac) e clique na **barra de Espaço**;
* O AnyLogic traz todas as opções que contêm a cadeia de caracteres digitada, inclusive, o parâmetro desejado **populacaoTotal**:

![](https://lh5.googleusercontent.com/IvU8GySURxFl4OOUhE4WVh093QrnV17V7DEhdAK-Klb3Nv9yEV-ekYUmbV7n_VmbQZrE54sAAyvvbd8MdP4LJQ2IHZZuw6bikXMPRvOS53jRrVVs8bJKwcPOG42AWhyfflr9vs7m)

Importante: a partir deste ponto, sempre que você preencher algum campo de valor no AnyLogic, habitue-se ao **Ctrl** (ou **option**) + **Espaço**. Além da rapidez, o comando evita erros de digitação, esses sim, que deixam o desenvolvimento do modelo bem lento.

O próximo parâmetro que adicionaremos é a eficácia do investimento em marketing, **eficaciaMktg**, com valor default de 1,1% ao mês. Crie o parâmetro com o que aprendeu até agora:

![](https://lh6.googleusercontent.com/uycN2H9IUOU8_OKS0xwFRqPZfOY7d6pdLhuM8NYnXegLJnGUaTEThFMJ8wtv5_ouGjn-kQcvWECcskD52FjEK5YC0O6PCZIBoy-iFPB2UgmH6Sp3To_GVt31De-TRBXZCwB5JAIX)

Não se esqueça de atribuir ao **Default value** do parâmetro o valor **0.011** (equivalente a 1,1% ao mês):

![](https://lh4.googleusercontent.com/AbLpEeOrTxAplIoctcPwui9z_mFFtuJ8jfXIJBNp_wufEcPdhwfph3GdAxKCWr1RlE4r2X1vQT4kb1HtD1BOKUqf7EmgeCh5eMg4clYpqoJ_spRkpcvSfd37DkYjQ3ap_xzmUlbW)

O próximo parâmetro é o número de meses de investimento em marketing, **meses**. Faça como no caso anterior e, como não sabemos ainda quantos meses serão (essa é nossa variável de decisão) atribua o valor de **6** meses:

![](https://lh3.googleusercontent.com/7AT5B7-ABj1KvzQbzHDI5ojJHAG8jGFHCTBjhX_3_kyWJdyh_Hw_9Tor0vxjlA97H-YDzLsD8QrpT3lPuZcVTdaMNCl1YpwjMEaNf4tYQ3C1RNMRU5v0Aop-lFDpzWituaYlB8-Y)


# Variáveis dinâmicas no AnyLogic

Já temos os estoques, os fluxos e os parâmetros. Agora e hora das variáveis dinâmicas.&#x20;

As taxas de conversão de clientes por marketing ou boca a boca são exemplos de cálculos que devem ser realizados dinamicamente, isto é: conforme o número de potenciais clientes diminui e o de clientes aumenta, essas taxas devem ser recalculadas.

O AnyLogic possui um tipo de variável específica para isso: a **Dynamic Variable**. Vamos criar uma **Dynamic Variable** para a "conversão por marketing”, denominada: **conversaoMktg**. Não se confunda: uma **Dynamic Variable** não tem aquele pequeno pedaço de pizza do **Parameter**:

![](https://lh4.googleusercontent.com/xtnxLX4J5M5tnAkGCuPWGSDELm4XN7DYEJbfXT1iUYQgnWASKP6k84hcRdwYSlFzZ9fIHX5tO7xl_RNM7ljLfeOBqzzEiy1XHqyxOYSlPMxx7A4xn9ES5zLIleWl_uWahFNmQx4w)

Em modelos de dinâmica de sistemas, devem ser representados todos os **Links** existentes entre estoques, variáveis, fluxos e parâmetros. Assim, com base no diagrama de laços causais, crie as ligações entre os parâmetros usando o **Link** da paleta de comandos:

![](https://lh6.googleusercontent.com/vTVC-dmkXkiyXmhm8WettjMSHJYe_AcTNSeGyYMHk3Dd7_Iit4H5RSq1JtoyflxtkR7_13uD9DSFs-XCe9TzkQz2lCJ5dyeQc-CXb0hB0mCJBz0E1MzIcQKvOlLFkuFGRrQzMv0Q)

O elemento **Link** possui como propriedade o seu sinal. Assim, clique no respectivo elemento e, na janela de **Properties** à direita, selecione o respectivo sinal do **Link**.

![](https://lh5.googleusercontent.com/KPWcRjQ_CXV7ZqVVWSufjXOKFaffvDNp9JQUy4ifUp4BbyzxRP7TYjy9qoKBHjS5q6cVKEPPxTPA3LDOwS_BLLDR1IPQs2agQxp1lv0aR5pmYpLeNyo0EywDoBFQQ-2DY7B4XiQf)

Chegamos ao final: construir a equação que rege a variável dinâmica. Clique na variável dinâmica **conversaoMktg** e localize, nas suas propriedades, um campo com o título **“conversaoMktg=”**.&#x20;

Queremos colocar ali a expressão que retorna o número de clientes potenciais convertidos. Contudo, se o número de meses de simulação for maior que o parâmetro **meses**, a conversão deve receber o valor 0.&#x20;

No AnyLogic, a função que retorna o tempo de simulação (na unidade de tempo do modelo) é `time()`. Assim, precisamos de algo como:

*`se`*` ``time() <= meses`` `*`então:`*

&#x20;    `conversaoMktg = ClientesPotenciais x eficaciaMktg`

*`senão:`*

&#x20;    `conversaoMktg = 0`

Tenho uma boa notícia: o AnyLogic possui uma forma de lidar com condições “se-então-senão” parecido com o que você possivelmente já utilizou em planilhas eletrônicas:

`“=SE(condição; caso verdadeiro; caso falso)”`.&#x20;

No AnyLogic (e no Java) você utiliza o sinal de interrogação "?" para a pergunta e o sinal de dois pontos ":" para as ações:

`condição ? caso verdadeiro : caso falso`

Assim, no caso da startup, basta colocarmos no campo da variável **conversaoMktg**:

`time() <= meses ? ClientesPotenciais x eficaciaMktg : 0`

Embora você já consiga fazer isso com o **Ctrl(⌘)+Espaço**, nesta etapa iremos por outro caminho: note um pequeno “x” vermelho ao lado do campo, o AnyLogic está informando existir um erro no respectivo campo (e dá até para adivinhar o que seja):

![](https://lh3.googleusercontent.com/HR1CHkORjFU2TjQXP33Z3PBY68uigHkmJIz6I4WB1-rCromaoZvHcNIkfH0MZRvht0ZkO_6fwdQeOlAlMOvudulvwPg_4ruYTPqihoi3bQB2kluVkCo3k20ak2FazS5RiTf0dfRP)

&#x20;Neste campo, o AnyLogic esconde mais um facilitador que acelera o processo de desenvolvimento:

* Clique **dentro do campo** com problema (clique *dentro* do box, hein);
* Deve aparecer um “X” dentro de uma bola vermelha (lembrando o símbolo dos [X-Men](https://pt.wikipedia.org/wiki/X-Men)). Clique nele, e note que o AnyLogic apresenta uma lista de opções: ou você adiciona uma variável/parâmetro/estoque que tem **Link** com o elemento atual ou, simplesmente, você elimina o **Link**.&#x20;

Assim, montar a equação ficou fácil:

![](https://lh3.googleusercontent.com/n1IQEeVMlsZiZeRrrIoKYxufDA6q_ZP8w1m1_21V5SMLT-a5my2wO1m_btitwpiHtNuZW6UyG8uaOYTx9APnSao3CnXllXCDdlhYwiwHpqYBdWL1FFiobcYiV1p085HASatHWprT)

Resolvida a **conversaoMktg**, passemos ao fluxo **taxaDeConversao**. Note que ele tem um **Link** (vindo da **conversaoMktg**) que também não fizemos a equação ainda:

![](https://lh3.googleusercontent.com/RcD7K7HweGGg5QMBKwio_arwq1r9bJilgewha2CxHXxQcWi1xcWBogcPrg_BpC1Q9gNxMIcy6SfhnVbj6-8bdflr9d_s-inwB1DZg5w2ugwSVW5JC_wBqrlvE6lZSMzaPcPzV-V8)

Pronto, já pode… SIMULAR!

![](https://lh4.googleusercontent.com/IC2PR48PBI-RsimYboFJOZQ6A0krD8zIeLhlSetcfDbzImFaS6_wP16rsuDZqun8iqXWuGBg1Ngqqu1DMiBh6Oe5xvvx94_5is22e70oVw4ztGV-XIPlcwg5hX9aZHTvg7BVxgK6)

Se você quiser acelerar ou desacelerar a simulação, utilize os botões na barra inferior do app:

![](https://lh5.googleusercontent.com/C6DfnLo1QfzD5ihbAZqXUhtRM3q4_BU552FCZCbLFOwZn27HKbB_NkgsVdo0TlEmuwuoJQf3SOCPbi_hrjXIV2Mitv72EHij2pkfzkgnRIdBCAMkaK6nV9rAR-j1Mwy3kAVb9T7W)

Se tudo der certo, surge o fluxo de pessoas do estoque **ClientesPotenciais** para o estoque **Clientes** pelos primeiros 6 meses e depois esse fluxo se encerra. Em breve você vai aprender a controlar a duração da simulação. Por enquanto, continue a construção do modelo, agora representando o ciclo de conversão boca a boca.


# O outro lado por outro caminho: o loop de conversão boca a boca

Vamos repetir o processo de construção do modelo do outro lado, mas utilizando outras potencialidades do AnyLogic (até para que você se acostume, entenda o AnyLogic como um software aberto, no sentido que qualquer coisa pode ser feita por 2 métodos óbvios e ~~8.695~~ diversos outros não tão óbvios, mas que se tornam fáceis com o aumento do seu conhecimento sobre o software. Eu costumo chamá-lo de “software de bordas infinitas”).

Comece criando os parâmetros **taxaDeContato** (**Initial value**: 10 pessoas/mês) e probabilidadeDeConversao (**Initial value**: 5%):

![](https://lh6.googleusercontent.com/RS1hfadRrncGUELFo-8QGRxNadjnqs5SAw1K2E14DY72Yy4X6khjeLSs4dkAK_tGZDZ5GpbOSBN_dM8zgF0_cNjI82pd2oXEheS3ujyeYWHy9TgwCubM9Zuai6luANS6Mi_vMBnL)

Continue o exercício criando a variável dinâmica **conversaoPorBaB** e crie todos os links necessários. Com o que você aprendeu até aqui, o modelo deve ficar como o da figura a seguir (a imagem foi gerada com o **Zoom** em 200% no AnyLogic e eu engrossei momentaneamente os **Links** apenas para facilitar o seu trabalho de verificação):

![](https://lh4.googleusercontent.com/8LPKJbD5OqNfl5JMSGcH841wxTkhBpz9F2mMbzj9FmtvjP8ALlsGJ-QuEXjY2kEA54bU3MQ07Lkb14K8LLw3b9SpfNg_ryRrVadfDGi4bxELrabw261FMb8uIqON5UXsCQE38qdK)

Montada a estrutura do modelo, é hora de digitar a equação da variável dinâmica **conversaoPorBaB**:

`Clientes x taxaDeContato x probabilidadeDeConversao x ClientesPotenciais/populacaoTotal`

Sinta-se à vontade para construir a equação pelo comando **add** (do “X” vermelho) ou pela opção do **Ctrl (⌘) + Espaço** (hey, *Sherlock*, você consegue notar a novidade que o Gif a seguir mostra para você?):

![](https://lh5.googleusercontent.com/6K1-iRH4apq-fHJyk35MfmoPRzphcy8Mek7NRR5gSjTCNyfANWSAG80OE6b_e9H4eK5oPJ6MMqIXC-DzH2Bqs9ShR--TCnPXnSkdwfhON0lOYBkzSQQaeBdF3Dwi4zR4Y-5Dqyth)

Exato, *Watson*, você não precisa se preocupar com o espaço pequeno para digitar a equação, pois o Java (linguagem que você está usando e provavelmente não sabia) não tem indentação rígida (algo que provoca gatilho em metade da população mundial, dizem).

Para fechar o equacionamento do modelo, falta ainda a ligação entre a variável dinâmica **conversaoPorBaB** e o fluxo **taxaDeConversao**. Escolha um dos dois métodos vistos (pelo "x" vermelho ou criando o link) e conclua o modelo:

![](https://lh6.googleusercontent.com/mvEdjbmncJKwEak7NYoWne6zolO5qXHJKBQoDtEREbNRRLmBnU9I3_rbT_piXqsy8dFrlff7I9pal0e_2Dxrt_ckEx7reci5ZoB0krO01xu9KzlPNmRd-vhhC6Xgz6e4QSKoPXk4)

E chegamos a última e derradeira etapa: colocar os marcadores de loop de balanceamento ou reforço:

![](https://lh3.googleusercontent.com/yrkB3IlCYtXAAh0U6gzGKx9vUy-fMXoaOS0-LMgUI_PducmFmgNOSDsnrqMAqHU0q6G6ivuGY4CiAMCwjIb6G-38HtTRtILsH3j8v4JCMyULC3yXTDH0kwv95KoV-Ovfw81qORuy)

{% hint style="info" %}
**Importante**

Para o AnyLogic, esses marcadores não tem efeito algum, eles servem apenas para visualização.
{% endhint %}

Pronto!

Pronto?

**Simule!** :woman\_astronaut:&#x20;

Sim, agora é executar o seu primeiro modelo no AnyLogic utilizando o **botão verde** da barra de menu superior (clique nos elementos do modelo, eles são cheios de surpresas!):

![](https://lh4.googleusercontent.com/K34nP6fenfiM0GbFXQIuxgijjt6nxTMwE7XkTisrF6JRQZjAEizQTWvlJ1ummT8LwhQWgLDm1izU54ghQdXznBjOpf9FPM56VzWJQaXD5B8Bud5V71iXnIDxR6BwSS9TOvwgXC5e)

Já temos um modelo que funciona! Vamos acrescentar algumas saídas, de modo a poder ajudar nossa StartUp na decisão de quanto investir em marketing.


# Criando saídas para o modelo: Time Plot

Vamos, inicialmente, adicionar dois gráficos ao nosso modelo:

* A evolução dos estoques de clientes potenciais e de clientes;
* A evolução das taxas de conversão por marketing e por boca a boca.

Os comandos de coleta e análise de dados da simulação estão concentrados na paleta **Analysis**:

![](https://lh5.googleusercontent.com/S5NCvewNuPB-Eji7YnSkjYvZBgaCWVTeoAchx1MvZgncKGmPaYw7bmqWyGSNCj9_Jx57ydrU8x6MCI9YKisVHl8AfQjMUy1tn-sn0Bm5KZarN8uUR1IVG0qsnNRJIR0fPTlYu9p5)

Como os gráficos propostos são compostos por curvas de evolução ao longo do tempo, o AnyLogic tem um elemento pronto para isso: o **Time Plot** (gráfico em que o eixo “x” é o tempo de simulação). Clique e arraste um **Time Plot** para o lado direito do seu modelo:

![](https://lh6.googleusercontent.com/JZfG37kJ0yHHcFqs0uC5Obd7ZpKYQe__sMh_rNXeU1cBKjFPXPXyTwV5ZH4reZseGbDiD_o3IeB2GnGcRNSF6aKBAiPonxaqZHUZ1grh6T4kGvO9TIruLcGJhDAO9Bq485m8EIau)

O primeiro gráfico mostrará a evolução dos clientes potenciais e dos cliente ao longo da simulação, com a ajuda do **CTRL + Espaço** você não deve encontrar dificuldades no preenchimento dos campos de dados:

![](https://lh6.googleusercontent.com/BOHrFEVrifSO-_9SQdkzgAOqny9eYDWm55x5l-OoezcAzsdDDFJgSnsVvaFGFnRiFLKpIr_mBBaOTPBGUUnEfgacgnF7GvEFavNaZWgCtkhmiz5FvRH0A-D8MabSQen1SVRYzJ-F)

Existem algumas propriedades do **Time Plot** que você deve estar sempre atento:

1. Como os dados serão coletados ao longo da simulação: automaticamente pelo AnyLogic ou por algum comando específico chamado pelo usuário no modelo;
2. Intervalo entre coletas (caso a opção escolhida seja de coleta automática);
3. **Display up to:** tamanho da amostra (se o tamanho da amostra ultrapassar este limite, o 1º valor coletado é descartado para dar lugar à nova coleta);
4. **Time window:** intervalo máximo do eixo x (no caso o intervalo máximo de tempo do gráfico).

Como este modelo não passa de 40 meses de simulação, eu sugiro que você altere o **Time window** de 100 para 40 (meses);

![](https://lh6.googleusercontent.com/hiLLuyuXabOZFYUPTPg7c9Fvd-TVrvA_bJQ0TLx7c7MpcInlh86YId8D53H-UuHBBu9rxwYn95AnHt8vr43loFeeAgmj02xNZ2oRGDKV95qVJmLfNIVgDLuqmlhADU3GuIvnY8iY)

A parte de baixo das propriedades do gráfico permite que você configure cores, legendas etc. A menos que eu queira algo muito diferente, normalmente eu nunca mexo nessa região.

Aproveite o embalo e também crie os gráficos **Time Plot** de evolução de conversão de marketing e boca a boca, por meio do comando de cópia rápida: mantenha o botão de **CTRL** apertado e arraste o que quer copiar:

![](https://lh3.googleusercontent.com/ODlNBft3eb_Zrszzd48skKmEalVsn_6HwbLxRch9Yw3Sr02IoflAVbSUygyveWvk_Ek-7Xim7onj8pLNGxHU15DpKZ7AF_2rKLkCz-f8GSPDfcmTYlo9fKGOp2ONgMs1yeJ57KTi)

Complete as informações dos campos **Data** e comemore que todas as configurações do gráfico (cores, legenda, tamanho da amostra etc.) foram copiadas junto.

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

Simule para verificar como ficou! :woman\_astronaut:&#x20;

![](https://lh6.googleusercontent.com/faCY13EOCfKesdoi4RWQIkCda6uYae-SCoGxyo8pTGRHhk7jY7yvMgyos6FQPqf7edhYMiLOG8tEVG7WRRIfxogIj56hIChGEJtomGZaYvPTfsx6gEgh18GqlNCxWBR-zueBYQKV)

A coisa até começa bem, mas quando passamos de 30 meses, mais ou menos, o modelo dispara rumo ao nada. Na verdade, estamos simulando sem limitar o tempo total de simulação e isso atrapalha a visualização dos gráficos (mas não invalida os resultados).

Para evitar esta dificuldade, podemos configurar melhor o nosso **Experimento** de simulação.&#x20;

Usando a tela da esquerda, selecione a aba **Projects**. Você visualiza um navegador com ícones empilhados, como pastas: os botões vermelhos com o símbolo de um bonequinho que representam **Agentes**; e o ícone azul com um **xis**, lembrando um distintivo dos X-men, representa um **Experimento**.

![](https://lh3.googleusercontent.com/dUk60ci2Pe0IWHd4g7kADNMiOuPBF0HjQY-QBRcwdGtJoLjqwBp5TS8M3P-teIe4Fc5EgCPK_L1VekZepdu5zsxFxwW8v2E9ci_R03UZijcsKyTTcjWP5bw18aCj_J-Jov_2opI3)


# O que é um experimento?

![](/files/-MSGIuWljQRXK1wyqRM0)

Cada **Experimento** armazena a configuração a ser usada em uma simulação e você  pode criar, para um mesmo modelo, quantos experimentos quiser. Ao criar um experimento, o usuário pode criar ainda uma tela de boas vindas para o usuário e definir valores para parâmetros importantes para a simulação, como:&#x20;

* O tempo de duração da simulação;
* O número de replicações;
* A semente de número aleatórios;
* O tipo de experimento, explicado a seguir.

A versão **PLE** permite a construção de 3 tipos de experimento:

* **Simulation** (*default* do AnyLogic), executa a simulação com animação gráfica. Note que você não tem controle de replicações neste tipo de Experimento;
* **Parameters Variation** permite simular diversas rodadas do mesmo modelo variando um (ou mais) parâmetro(s) (neste exercício, um experimento deste tipo poderia executar a simulação para a taxa de contato de 1 até 10 clientes/mês, por exemplo). Além disso, o **Parameters Variation** permite limitar o número de replicações, que pode ser pré-definido por você, ou identificado pelo próprio AnyLogic, de maneira a atingir o intervalo de confiança que você tenha especificado na definição do experimento;
* [Otimização,](https://youtu.be/3pM30wQfxV8) com configuração de função objetivo e restrições (construídas a partir dos parâmetros do modelo). [Veja o vídeo how to](https://youtu.be/3pM30wQfxV8):

{% embed url="<https://www.youtube.com/watch?v=3pM30wQfxV8&feature=youtu.be>" %}

Outros tipos de experimento, não disponíveis na versão PLE, são: [Calibração,](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/calibration-experiment.html?cp=0_11_4) [Monte Carlo](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/monte-carlo-experiment.html?cp=0_11_6), [Machine Learning](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/rl-experiment.html?cp=0_11_8) e [Custom](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/custom-experiment.html?cp=0_11_9), este último permite a combinação de diferentes tipos de experimentos.

Neste exemplo, vamos definir a duração da simulação em **40** e isso é bem simples na janela de propriedades do **Experimento**:

![](https://lh6.googleusercontent.com/xD7C6-JhrAlosRrqOVrLipKXk3AdxKxsf1-uUHzUbrGPLVISpJBC2vHxZWGIdytbP67qMYvjr2lPlGmkZfaImr4X5LiWs-l0W1_zyiIjDhCM0Sh7XM_KKmzAj9CyaAS_RbMbyPzq)

Execute e note como o experimento agora termina no tempo determinado.&#x20;

Outra característica bacana do **Experimento**: como os parâmetros são considerados dados de entrada, ele constrói automáticamente uma interface de dados para o usuário. Ela está na aba **Parameters** nas propriedades do **Experimento**:

![](https://lh4.googleusercontent.com/tD534Q428jDGtZdQq8rWZ9jkCra-c-VG-ks8NOOZ0f_vwXUEiW10KP8Ij7itDgway_q9lujuKWIWfqsNTOxeCyb1-Xs-7CdZJcMfD40hznWkSeCmggqnPnwjveGy0n8O5IbhdqPY)

Antes de concluirmos, se você retornar a atenção para a janela à esquerda, deve notar que o nome do modelo está com um asterisco ao lado, indicando que seu modelo ainda não foi salvo. Para salvá-lo, selecione o nome do arquivo e clique no ícone do *disquete* no canto superior direito do menu superior do AnyLogic.

![](https://lh3.googleusercontent.com/4V9zKnnLpUpxAvLuoEzCAaVLEa9fSymAeRDsXdQl08xUH3kqXi9ei5S97vIBKHowtOGLCSP3kP7oQdLZbjGAGbR1UisYQEUe9deEIkdbn9tPg-pPr6ElLys8NwZ55bCrvj8yz_t7)

\[E se acabar a luz? ~~Chore~~ O AnyLogic tem um salvamento automático temporizado!]


# Experimentação do modelo: a dinâmica de adoção do app por marketing e boca-a-boca

É notória a facilidade de modelos de simulação de dinâmica de sistemas em explicar o funcionamento do sistema a partir da interação dinâmica dos seus mecanismos de feedback.

Começando pelo cenário base, se todos os parâmetros adotados estiverem corretos, o modelo prevê o seguinte comportamento para o sistema:

![](https://lh3.googleusercontent.com/5zhPXomkIW9wg1vEK-hKY_yV1CM85yBGDhtSWoMQHytbTIvL5dvKth3q-zNy3lf7xAWKmKWwv8v52X5mFEC2QJXAHN1LO2ot4kiYTg2U37yOAq2oN4WMoWpUclH25rJx9hoOBatu)

Pelo resultado anterior, passados 20 meses, todos os clientes potenciais tornaram-se clientes. Nos primeiros meses, a conversão foi conduzida pelas ações de marketing, mas quando o processo de divulgação boca a boca inicia-se, a conversão de clientes cresce exponencialmente até o pico próximo de 620.000 clientes/mês no mês 8. Na sequência, a conversão cai, pois a relação de “clientes potenciais”/”clientes” (ou a probabilidade de encontrar alguém que ainda não é cliente) começa a diminuir e, portanto, pouco adianta você convidar seus colegas para o curtir o novo app se eles já têm o app.

O resultado anterior mostra que a força de vendas quando um produto *viraliza* supera qualquer ação de marketing. Pensando nisso, podemos simular um cenário em que a StartUp não gaste um tostão com divulgação do produto e, a partir dos 10 eleitos ao início do projeto, ela consiga o mesmo efeito de viralização. Atribua o valor 0 para o parâmetro meses e simule:

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

Wow, os resultados são muito parecidos, a menos do “atraso” na curva de conversão que agora tem seu pico apenas no mês 26 (ou 18 meses mais tarde do que o cenário em que temos ações de marketing envolvidas)! (Notou a exclamação? Impressione-se!)

A conclusão é que realmente precisamos de algum investimento de marketing ao início do projeto (e você pode estar pensando em uma análise de sensibilidade para a taxa de contato, valores financeiros, onde eu assino etc).&#x20;

Antes de assinar alguma coisa, não seria melhor se esses valores pudessem ser exportados para o Excel e os gráficos e cenários pudessem ser salvos em algum lugar? É o que faremos na próxima sessão.

{% hint style="success" %}

#### Observações

* Quer incrementar seu modelo com controles em tempo real bem legais? Veja [este vídeo!](https://youtu.be/pd8QMBL-ri4)
* Que tal estudar o que ocorre em cada parte do seu modelo por logs automaticamente criados pelo AnyLogic? Você está a 5 minutos de aprender isto [neste vídeo.](https://www.youtube.com/watch?v=jVkDkXsTIHI\&list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3\&index=22)
  {% endhint %}

{% embed url="<https://www.youtube.com/watch?v=pd8QMBL-ri4&feature=youtu.be>" %}


# Exportar e executar o modelo na nuvem pública do AnyLogic

Para realizar uma análise de sensibilidade do sistema quanto ao comportamento da conversão por boca a boca, aproveitando que já temos um modelo de simulação da difusão do app, basta, por exemplo, executarmos o modelo para diferentes valores do parâmetro **taxa de conversão**.

Para estes casos, o AnyLogic possui um **Experimento** específico, chamado **Parameters variation** (ou apenas **Variation**, quando executado na nuvem), que permite simular automaticamente diversos cenários para variação de um ou mais parâmetros, dentro de intervalos definidos pelo usuário.

Tal experimento poderia ser criado a partir do menu **File > New > Experiment**, mas faremos algo mais bacana: vamos criá-lo no céu! Isto é, [na nuvem do AnyLogic.](https://cloud.anylogic.com/models)

O processo de levar o modelo à nuvem, vai exigir que você:

* Execute o configurador da nuvem no modelo;
* Selecione quais os parâmetros de entrada e quais as saídas do modelo (o AnyLogic Cloud vai construir uma interface para o seu modelo automaticamente!);
* Crie uma conta (gratuita) na nuvem do AnyLogic, se ainda não criou;
* Execute o modelo e veja se está tudo funcionando, antes de mandá-lo para o grupo da família no zap!

O configurador do **AnyLogic Cloud** é a nuvenzinha azul na barra do Projeto. Clique nela duas vezes, para que sejam criados os campos onde você definirá os parâmetros de entrada e as estatísticas de saída do seu experimento:

![](https://lh4.googleusercontent.com/26g6j9SQc7zdC1G0vJFJ9HrMtg3l_e2MQGmCdeTR9XRj0ZVm45BLZFeMGxNdbgX9-w2gC0mp917d9OI4n3a51NDFKY7lLaTQAOYSyzVkHdSbv03Ha-W3w1oYabqMXwH3fjFIZYN9)

Selecione, na tela seguinte, quais são os parâmetros de entrada (**Inputs**) e as saídas (**Outputs**) do modelo (clique e arraste ou duplo clique se estiver com pressa):

![](https://lh4.googleusercontent.com/8rDPz3czLZ88qg_1wJJKcMV-NXdpA1-vTLsfI9KkBcMREQDaTOl0xzOGXEQJkeMyOz0GCryjNSL3I-qhK4wfyWZspu1-hzCTVW8UK52QN7zxNNYMoUsU8sRO4bO5X6jajvOrvFRi)

Perceba que o AnyLogic “corrigiu” automaticamente os nomes dos parâmetros de entrada (fique a vontade para corrigir a acentuação):

![](https://lh3.googleusercontent.com/U62KmyG-KppHA7LkcKmjr4i944S-tnHD6YXUfaZ5riKM1HiUMftnU9KWrk3YZGy7dMIGTMWdyqEff_sL5tHTcKCrwFoH1C4yoXKQUR0t3Q9ZswN6HLnTAYJUGw1pfnNI8lCUE6zT)

Antes de exportar o modelo, atenção a duas mudanças na janela de propriedades: defina o tempo de simulação e o critério de parada da animação:

![](https://lh6.googleusercontent.com/DLfNvQwT_LhsuH_b_7CDJn7b71FebhP5ZgW_GXLuH_s-VROgMgkkxnfxB_OLZDvkyKJP4BYinMUy2xTm3IjGIfjy4Q5H-2OD2Eo0udUQD6OpNokmiaLK2gpqx7vsP8BrUATflQtb)

Se você chegou até aqui, existe um link azul Export model na parte superior da janela de propriedades:

![](https://lh5.googleusercontent.com/vWZMxZLXHJzXYD3h_UAPdrcRP3GZhkd-ydJSC92dSkxbkz5CszOqPt65wo3xaHh9sxXdHC3wuFNuF2WvN7EH4VCF7FBivTK2aMCt8-baoIdavNudRrcdVCCgeMxeJNVkFHj_xTQj)

A primeira janela deve pedir para você criar uma conta (utilize suas contas nas redes sociais!) ou entrar na sua conta se ela já existe.&#x20;

As telas seguintes são autoexplicativas:

![](https://lh3.googleusercontent.com/E97aZediW1lRsBMzTL2w32Omu05lYWV7uMocAurKdNs8PcuyYVHerIejiU5ThfLAs-3WA-k1HGEiG1z0YL38LUZVp9bYTCRWJjUXRW47SfLHtSoWIWoi18d2n1nHP65PcB7eT_p3)

Após o término do *upload*, o AnyLogic deve abrir o seu browser padrão já na tela do modelo pronto para ser executado!

Olhando o canto superior direito, você deve notar que está numa conta Guest, ou seja, chore o AnyLogic não entrou na sua conta. Faça o procedimento de Login:

![](https://lh5.googleusercontent.com/X-V8G5X0gpYt_QXynaoMcT1UVeF7Nm5isfLV3R_lS4ruJ5bJFzLW7dyiKHIVtc3y6r7FfllKdmZWiTmHkHeKo2ag7CJcsA6ZCSlw00mi7r2vWDEofOtbF_Wex-BKg2tnpYJ0z0jl)

Inicialmente, temos apenas um Experimento na nuvem. Vamos executá-lo selecionando o **Experiment** do lado esquerdo e clicando no botão de execução **Run** na barra de menu superior:

![](https://lh4.googleusercontent.com/pi9xpiqOslwMk_ICYBbk4XqKwZkd-CvzLhmScnoigSuPOmTCXYe_NyCl3UyV0YtJ-An1UmWyvVTt5Xmh9HJRU4qCTr8iiA1uc5YeixrRRLr04yAnBBMZoArSu4_xn8ElcXtybi0Y)

O AnyLogic Cloud, mesmo nesta versão pública (a conta gratuita não permite que você armazene modelos na nuvem de forma privada), permite que você crie novos **Experimentos**.&#x20;

Criaremos um novo experimento do tipo **Variation**, que permite simular diversos cenários ao mesmo tempo, variando um ou mais parâmetros. Para isto, siga os seguintes passos:

* Crie um novo experimento do tipo **Variation** e dê um nome apropriado, como “Variação da taxa de contato”;
* Edite o **Dashboard** deste novo experimento: o parâmetro de entrada **Taxa de contatos** deve ser alterado de **Edit box** para **Varied in range**;
* Salve o **Dashboard** criado.

Crie o novo experimento:

![](https://lh6.googleusercontent.com/bdESH1kjW7YCJy84aXA0yOPcMmQ5G7lj-jiIeeyuopMDwu2qJdGxnXefR6wDEMKlpBDIXN9cysUzUPGfcd55lAfWqHh7M8zp1SOzcVbQmiX6a3BnCXArh760dg9OA7Ve1QGXs2HG)

Edite o **dashboard** (salve ao final!):

![](https://lh6.googleusercontent.com/aovT5XLB5Bx05eXew-YGH967L-pmA1XVjdVxoyavlxiAI1uN_opcDKMrO6izrMbDxjfne0wgmNenIYRZsa-IG6VBm0cAc0yRSc3aRi1UaLxhglDdJuIIHE6bQX8zqgvE_XqiwUcA)

Para solucionar a questão do problema original (quantos meses de marketing eu preciso para que a base de clientes nos primeiros seis meses seja maior do que 1 milhão, vamos variar a **Taxa de contatos** de 1 até 6 meses e executar (note que as simulações não ocorrem no seu computador, mas na nuvem do AnyLogic):

![](https://lh3.googleusercontent.com/IAE4hBmKZLhJjQN7nPd5_tHOiPohwblD1f83_x7MWTKPZ_2VkK4A-3ASEL1MU6FFXQkF1Nx0Va_THEG46lJG_0BQ-CJBErA1j82pJGyKPw_qAtT88vDLJVq7BckiHdT-HnxyciN-)

Tchan! Tchan!

Os 6 cenários foram executados e o AnyLogic ainda devolveu um bela interface de saída interativa e que você pode exportar para o Excel (o botão no canto superior direito ao lado da balança), compartilhar com os amigo ou mesmo salvar para consultas futuras na nuvem:

![](https://lh5.googleusercontent.com/BNOtuWeAAwZsgq-e94-9re3D0FUZ4f6fQpw7dTkpBeAWBc2M2a5h8FrwkDDpttA2XnfBzOr1BTKx8u0BL4wfDLFWWGN0M9Oom83I3mxTHliUFSq-jI5Zb6qbw2QcvobXNpP2GZKt)

Você notou que o AnyLogic Cloud armazena os cenários simulados? Se você pedir a simulação de um determinado experimento já executado anteriormente, ele não simulará o modelo novamente, mas buscará em sua base de dados o resultado que já está pronto, economizando o seu tempo (e o dele). Quer saber tudo sobre o AnyLogic Cloud da boca dos desenvolvedores da AnyLogic? [Então veja este vídeo](https://www.youtube.com/watch?v=_IWjzpr9DMA).

Você pode compartilhar o link do modelo com ~~seu/sua arqui-inimigo/a~~ os amigos e amigas, incorporar o modelo ao seu site (ou blog), tornando sua página interativa [como neste tutorial,](https://www.anylogic.com/blog/conveyors-using-the-material-handling-library-part-1/) ou fazer algo bem mais avançado: uma [interface completa de execução do modelo](https://cloud.anylogic.com/custom-ui-demo/index.html) usando a API da ferramenta.

Para saber mais sobre o **AnyLogic Cloud**, existe uma [página](https://www.anylogic.com/features/cloud/) dedicada no site da AnyLogic.


# Solução do problema da Startup

Vamos recuperar o objetivo original do problema da Startup:

* Construir um modelo de simulação que permita identificar como o app irá se difundir no mercado e identificar por quantos meses a startup deverá investir em marketing de modo que ela atinja, ao menos, 1 milhão de usuários até o 6 mês do lançamento do app.

Pelo gráfico a seguir (extraído do gráfico **Plot|Clientes** da nuvem), com 0 ou 1 mês de apenas de marketing, o app fica abaixo de 1 milhão de clientes. A partir de 2 meses, o número de clientes ultrapassa a meta e o problema está resolvido: 2 meses apenas de investimento em marketing.

![](https://lh6.googleusercontent.com/QfdTArDkOtfPvsEsGSM-2TtihqKuzzIa6ngJAEkTUu8XhNixLr-TpHD6dc-Wn0CWpuUBV5DnpBM3zQ5GgljbJAqON3c6pa2DHUZ9OHtRoVt4HDqkllkGd88UXIFF6RAprUV5rfU6)

Note que este resultado é compatível com a realidade de qualquer lançamento de produto, afinal, o produto tem um orçamento de divulgação limitado e consumido nos primeiros meses de lançamento.

A parte básica deste tutorial está no fim.&#x20;

Como de costume, quando estudantes deparam-se pela primeira vez com a prática da simulação de dinâmica de sistemas, é natural um fervilhar de ideias de possíveis sistemas e situações do cotidiano em que a técnica poderia ser aplicada (e espero que este seja o seu caso).

Se você tem interesse em empreendedorismo e está procurando temas interessantes para uma monografia, por exemplo, evolua o modelo da Startup de modo a considerar outros componentes relevantes do sistema, tais como: faturamento, custos, necessidade de mão de obra ao longo do tempo, reputação do app etc. A bibliografia no assunto é extensa, de boa qualidade e, confesso, que a ideia deste tutorial partiu [daqui](https://www.mdpi.com/2071-1050/12/10/4005/htm).


# Epílogo: como aprender o AnyLogic a partir daqui

Chegamos ao fim de nossa atividade de lhe introduzir ao AnyLogic para simulação de dinâmica de sistemas.&#x20;

O conhecimento acerca da Simulação de Dinâmica de Sistemas é incrivelmente vasto, com livros, sites (visite o [The System Thinker](https://thesystemsthinker.com/)), papers (muitos!) e aulas no YouTube, como por exemplo, a da [Profa Donella Meadows](https://www.youtube.com/watch?v=XL_lOoomRTA) (veja a [bio](https://en.wikipedia.org/wiki/Donella_Meadows)) ou este [Ted-Ed sobre loops de feedback na natureza](https://youtu.be/inVZoI1AkC8) da Profa [Anje-Margriet Neutel](https://www.bas.ac.uk/profile/anjute/).&#x20;

A bíblia sobre o assunto é o [Business Dynamics](https://www.amazon.com.br/Business-Dynamics-Systems-Thinking-Modeling/dp/0071179895/ref=pd_lpo_14_t_0/136-6869167-5805313?_encoding=UTF8\&pd_rd_i=0071179895\&pd_rd_r=670cfd3b-50fe-4fb8-b945-f0456e42723a\&pd_rd_w=1159a\&pd_rd_wg=gUGwh\&pf_rd_p=e7e26e7d-6256-4aae-92f9-7ffa337ed626\&pf_rd_r=Q6Z7HWHTPGEDSJ5ZM9K0\&psc=1\&refRID=Q6Z7HWHTPGEDSJ5ZM9K0), livro do Prof. Sterman, fácil de encontrar em bibliotecas.&#x20;

A partir daqui, o que você pode fazer para avançar no AnyLogic:

* Se você já possui ou pretende adquirir a versão **Profissional** do AnyLogic, o caminho natural é fazer um dos [treinamentos mensais oferecidos pela Genoa;](https://genoa.eventbrite.com.br/)&#x20;
* O [site da AnyLogic](https://www.anylogic.com/) disponibiliza uma seção **Resources** com diversos livros, vídeos e *white papers* gratuitos:
  * Para uma visão geral do software, incluindo os três métodos de simulação que ele comporta (Processos, Agentes e Dinâmica de Sistemas), um bom ponto de partida é o livro gratuito: [AnyLogic in three days](https://www.anylogic.com/resources/books/free-simulation-book-and-modeling-tutorials/) ou sua versão em Português, [AnyLogic em três dias.](https://www.anylogic.com/resources/books/material-de-aprendizado-em-portugues/) Existem, ainda, versões pagas para o [Kindle,](https://www.amazon.com/AnyLogic-Three-Days-Simulation-Modeling-ebook/dp/B07FYP8Y3C) leitor de livros digitais da Amazon;
  * Se você está interessado em aplicações em Logística, Cadeia de Suprimentos, eu sugiro que você investigue outro software: o [anyLogistx,](https://www.anylogistix.com/) que é um spin-off do AnyLogic para a área de Cadeia de Suprimentos e já vem com o CPLEX (pacote de otimização da IBM) embarcado;
* Existe uma sensacional [seção de vídeos “How-to” no youTube,](https://www.youtube.com/playlist?list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3) com legendas em Português e duração de 3 a 7 minutos cada. Sugiro alguns para começar:
  * [Importando modelos do Vensim](https://youtu.be/YmhUnDjsEzc): o vídeo é bem curto, pois é só importar o arquivo e pronto. Lembre-se que o Vensim é um software de 1990 e muitos modelos que você encontrará para download estarão neste formato;
  * [Distribuições de probabilidade customizadas:](https://www.youtube.com/watch?v=YniPxHYfbrc\&list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3\&index=10\&t=0s) você vai aprender algumas técnicas que o AnyLogic possui para leitura de dados e conversão em distribuições de probabilidades;
  * Além da seção How-to, a [playlist de webinars](https://www.youtube.com/playlist?list=PLUJJN9tmVTj1kKggcvpPtVBc7--imAkuW) é muito boa também;
* Dúvidas: atualmente, o melhor lugar na Internet é o [Stack Overflow](https://stackoverflow.com/questions/tagged/anylogic) que possui um grupo bem atuante de perguntas/respostas. Se você possui a licença **Profissional** ou **University Researcher**, *better call Saul!* chame o [Get Support!](https://www.anylogic.com/resources/support/)
* Com a popularização do AnyLogic, existe uma comunidade crescente de youtubers e blogueiros do AnyLogic. Cito alguns:
  * No YouTube, um dos bons é o [AnyLogic 101](https://www.youtube.com/playlist?list=PLiGJP0k1miFYSAGsN45QSedkBinTEfItr) do consultor Benjamin Schumann, um cara bem entusiasmado e didático. Existem muitos canais de professores, por exemplo [aqui](https://www.youtube.com/watch?v=uuQ-M85aCs0) e [aqui;](https://www.youtube.com/user/NathanielOsgood/playlists)
  * O Eng. Alvaro Gil mantém [um blog bem legal em espanhol](http://agiltools.com/blogsp/author/alvaro/) (veja os tutoriais!);
  * Aqui na Genoa, a gente gosta muito [do site do Florian Huebler,](https://florianhuebler.com/) que mostra coisas bem avançadas.


# Table functions

**Table functions** (funções tabuladas) são ferramentas fundamentais do arsenal de qualquer desenvolvedor sério de modelos de dinâmica de sistemas. Elas representam tabelas de valores conhecidos, facilitando e direcionando a construção do modelo.

Considere, por exemplo, que a Startup está preocupada com o nível de engajamento dos seus usuários. Em apps semelhantes, o nível de engajamento é determinado pelo tempo médio que um usuário se mantém ativo. Para o app desenvolvido, estima-se que o tempo que o usuário fica ativo é definido pelo próprio número de usuários, isto é: quanto maior o tamanho da rede de usuários, maior o tempo médio que o usuário permanece ativo.&#x20;

Assim, o tempo médio de engajamento é estimado pela seguinte tabela:

O diagrama de estoque e fluxo deve ser modificado, como na figura a seguir, para representar a perda por desinteresse (fluxo "Pessoas desistindo do app") e o número de clientes inativos (estoque "Clientes inativos"). Estude as alterações realizadas no diagrama de estoque e fluxo do problema e veja se consegue compreendê-las.

![](https://lh6.googleusercontent.com/SD5yVq1nZHcX84qAhZjk6-2qU-vABOrLI9GpG5iwPgVQixJxZPOR2NU-NeDzL0RrMaOopVyC3MyzVo7FOyXG24GWczwiU22j_txy3vVBgwS33727zkSuI2lOsiX7r9PEl6hRMQCB)

`Clientes / tempo médio de engajamento`&#x20;

Este valor representa a taxa por mês com que os clientes desistem do app.

Comece adicionando ao modelo o novo estoque de **ClientesInativos**, o **Link** entre **Clientes** e **ClientesInativos** e o **Loop**. O novo modelo deve ficar assim:

![](https://lh4.googleusercontent.com/3dhNGVb79B_7_fMwMUhOuJWxdTNnpH2MW3kSNMFriF0o6B4uFFCAIR8RsOq_sdCR90iiXSIqhYuckI5ryDZXYVLwAUITMhiniauV6oTudIcCjJVkxXZQ3HWf8uQ1VTu9Cwy8GV7x)

&#x20;Pronto, o modelo deve ficar como a figura a seguir:

![](https://lh4.googleusercontent.com/NyP4dNC9SkWqwKZ-oyE6hRxCoudPdokcYtHGdxy9GW4500nxUzzam-smHZSKi6cFAu2oUrmRuP84paggEtq9t6Vb3GZ3_j9IhhxXYzC0ls8H97EPa3TtfdWlu_bDyGkg8JprZGaR)

O próximo passo é criar a **Table Function** para o tempo médio de engajamento dos usuários. O elemento está disponível na paleta de Dinâmica de Sistemas (**System Dynamics**) do AnyLogic:

![](https://lh3.googleusercontent.com/rnilSTsXWjHJpgvdXAGVkbdXa-H6HGEb8W8wzlGX7MLM_Jz9gkkhmvMj2kX5Os8CT3nOCuaYgATESA1rtuE8eRQCoVMEb1HEL_hMXssMv3wWduMWa4bfbYys4X4agXVBhKBeMoGa)

Para preencher os valores, você pode digitar um a um :cry: ou utilizar Copy/Paste :sunglasses:, bastando copiar a tabela fornecida alguns parágrafos atrás neste tutorial e colar no **Table data:**

![](https://lh5.googleusercontent.com/zYjb2I872gH8vmwYhEupOfdY7R_Dty5gxIscFJtuUCKDe23KKL-mkAQm-9EmOcyZNxFGfJhpPMLPgX42hO8V44q6lGOTtH2s_rclxgORnXgbGmtEFiKV8mPBg890btAxp70RSBWa)

Note que você deve apagar a primeira linha, pois ela repete o valor inicial de 0 clientes (sem a correção, ao tentar executar o modelo, o AnyLogic apresenta erro de compilação).

Antes de prosseguir, duas coisas bacanas que você deve saber sobre **Table funtions**:&#x20;

* No campo **Interpolation** você pode selecionar a técnica de interpolação adotada. No caso do exemplo escolha a opção **Linear**, que representa uma interpolação linear entre os pontos (as opções estão melhor descritas no Help);
* No campo **Out of range** você pode selecionar a regra a ser adotada caso o parâmetro de entrada fornecido pelo usuário esteja fora dos intervalo (**range**) da tabela. Para nosso caso, selecione **Nearest**:

![](https://lh5.googleusercontent.com/TWN3RAjevtofV4YZJlApPzcPA4I5TECrssyjFCujDX6U6pZuza-9Oax4ejYiwGIGGWVk54BJPguxX5Ad0zNsCuhGSLT7QxnKAfHVppMhsUtHJRh_88_izxyprhdRxiv6qsakyN0b)

Agora você pode utilizar a função onde quiser do modelo, em particular para equacionar o fluxo **taxaDeDesistencias**.&#x20;

![](https://lh3.googleusercontent.com/LoyMYlMEhXScz9Pp-boDqcje_C3HeHBGvr9OBd9HqeAmNbYRplf6X2iRRSy2XBAZ60wbRWTD9IOKTUvFGtGXAxt4ldwqxF2mabfd8rp6hlnMc2DhPO0KWjg8ppZ9Gu_XYkq0xgte)

Voilá, simule!

<img src="https://images.unsplash.com/photo-1518364538800-6bae3c2ea0f2?crop=entropy&#x26;cs=srgb&#x26;fm=jpg&#x26;ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHw0fHxyb2NrZXR8ZW58MHx8fHwxNjM0NjQyODA3&#x26;ixlib=rb-1.2.1&#x26;q=85" alt="" data-size="original">

{% hint style="info" %}
**Perguntas**

* Com os novos resultados, você mudaria sua decisão de investir apenas 2 meses em marketing?
* Você consegue explicar o novo comportamento da curva de boca a boca?
  {% endhint %}


# Experimento de variação de parâmetros e coleta de dados com dataset

Assim como na nuvem, o AnyLogic possui um experimento de variação de parâmetros, o **Parameter Variation**.

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

Velocidade, amigos! :woman\_running: :man\_running:&#x20;

A criação de novos experimentos é intuitiva e basta seguir a sequência de comandos do menu suspenso **File > New > Experiment:**

![](https://lh4.googleusercontent.com/L1MQRjONaoNY3LqLqTv3j2P9aiMLwdt_S3kj0vY3wfDCCfcsfI4cP99RDPD8wjwlDHrdeaSge8YVgtx1h1Ir_GyYwqSCq4u-gKnw4NI0UYvCyhRGmtj7HUAtvXzQ0hwj7GKlen1S)

Embora já tenhamos criado diversas saídas para o modelo, todas elas foram criadas no experimento **Simulation**. No recém criado experimento **ParametersVariation: Main**, ainda não há uma mísera saída.&#x20;

O primeiro passo, portanto, é 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.&#x20;

Usaremos duas saídas nas análises: a curva de taxa de conversão por boca a boca e um outro valor bem específico, quantos clientes foram alcançados em 6 meses.&#x20;

## **Curva da taxa de conversão por boca a boca**

Se você clicar com o segundo botão do mouse sobre os blocos e elementos de tela, eles normalmente têm opções de coletas de dados. Clique com o botão da direita do mouse no fluxo **taxaDeConversão** e crie instantaneamente um **Data Set** com a opção **Create Data Set**:

![](https://lh5.googleusercontent.com/ciyz9rjV3zDXY4G_8aPszJjtNkERkEqYIvGT4KEfC7teKXfj_js-vRsZdSy0-6kjmz2E5G7z01u7Nek6wBIeBgdYUHOK5DCLmPoaEAXg1NHbEeg-5cbJoySyBVU39m2eVf_mpyR6)

Por padrão, o **Data Set** é criado sem a opção de atualização de dados automática (mais adiante eu mostrarei como fazer isso). Por hora, ative a opção de coleta de dados automática e deixe com a opção de coleta mensal de valores (o **Data Set** vai armazenar um número por mês):

![](https://lh6.googleusercontent.com/Ctc9uGJ5jU4jAREPhPTWRy3QDwN3WjZ0dfY09pmdlUTirIla_DrHZmWTaqdYM2VLLs6BBpDYEq3yYTetZSmbnFLTxfMY5AnID0cdqc_1N6Rqy7KESey3Y9lJ9RWCtcKYCswAiUx0)

## **Número de clientes alcançados em 6 meses**

Esse é um pouco mais comp… FÁCIL! A opção **Output** da paleta **Analysis** nasceu para isso. Clique e arraste o elemento **Output** e nomei-o **metaOutput**:

![](https://lh6.googleusercontent.com/zcZ8grRBYXN9a900ginIyq2pJsdMUPPKR8Xpd1Kt32UQLzM84jBKbIQZ1evkoAaHLhdlwe47IT67SbT1LTdWHmC1YEPrUrEe5ud9Pmuph8VmeavPGT8wO7gRkLiKds4x4BTAO3Du)

O bloco **Output** precisa apenas de duas informações: o que ele vai medir (no caso o número de Clientes) e como ele vai fazer isso (no caso, pela coleta do dado decorrido um tempo de simulação de seis meses):

![](https://lh4.googleusercontent.com/V9j58yrXhmx2Ulu9QIhZ3dUA4IRR7OT277KxuXWnvjSgBnjDGsbRlTIGWOpC76zNZ7E8clPwzTq-aVh0jrUIhQZMRews0JyPgUEcoE9Je75C6k_egw90CV7x0bsfhNHJTCGUOl_c)

Teste o modelo, simule! :woman\_astronaut:&#x20;

![](https://lh6.googleusercontent.com/K5YLCuHCZmo2qsxgErSuyBstz9GDi7u1_LU88vL0FWdAFYK2EV4SIa71Y1oscieeFwQIs-slnAT_osOEEYEYzQJQ4ZPoOUpc2QfV36FqBWQ2-_oMO0OHJAXmj168egVh2ZuCd_9p)

## **Juntando tudo no Parameter Variation**

Volte para a aba do experimento **ParametersVariation** e vá a janela de **Properties**.&#x20;

Inicialmente, crie um interface padrão ao clicar no botão **Create default UI**:

![](https://lh3.googleusercontent.com/pvuBYO5_TehAkAALhS8nxAD2Akw84BL90LQcdvVOvZ-bDxIda6-x6vPeGr7XcyQbQKWOsXxnBg_VCQl9mO2YFdiEwMoRrDTrtRPJIVgYl8MSmQjShUbPmxwn1XBgh4wb3gaUIKMq)

Agora, veja como na aba **Parameters** você pode variar os parâmetros (como você fez há algum tempinho atrás, lá na nuvem). Varie o número de meses entre 0 e 10 meses, modificando a coluna **Type** do parâmetro meses:

![](https://lh5.googleusercontent.com/NM2B8tEN9r7fxdrGA02s3hY9f7Vko-p4xMF1lAFEcZ8SGDCXHjXLEO41blINGZGaUJFFMISY5nWTf3-YJ543EStMDACpzdktiUKAH2XcaOPNnRbRSRsB4pem8mGauWiZZQ5Cmsou)

A região da tela do **ParametersVariation** aceita comandos de análise de dados (gráficos, histogramas, saídas etc.), então vamos acrescentar um **Time Plot** para o apresentar os resultados da curva da taxa de conversão, a cada cenário simulado:

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

* Retire qualquer item da aba **Data** (pois os dados não serão coletados automaticamente);
* Selecione a opção **Do not update data automatically** e
* Não se esqueça de mudar a opção **Time window** da aba **Scale**, para **40**:

![](https://lh6.googleusercontent.com/ZSY2XHUbxDj7vhTzEXPGRWGQUovS1BjIDV4ce3_n5ZGAMJ1klB0ZIlz9KFrLadB0F_UZBMZVdN8qg3gzQ-aYRCPnIO-5VjLAgR1xW112eIBkR3Ku6fLjvf4j1mLS3oXzxwZ9vLC2)

Diferentemente de todos os gráficos que fizemos até agora, este é o tipo de gráfico que não coletará dados automaticamente, mas sim, receberá um comando de adicionar dados a cada simulação executada.

Tarefa relativamente simples, dado que todo elemento de coleta de dados (como o **Time Plot**) possui um comando **addDataSet**.&#x20;

Localize, na janela **Properties**, a linha **After simulation run**, no menu **Java actions**:&#x20;

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

Esta linha de comando (que no momento está vazia) é sempre executada quando o AnyLogic termina a simulação de uma replicação. Precisamos adicionar o resultado armazenado ao final de cada simulação no **Dataset taxaDeConversaoDS** no gráfico **taxasDeConversao**.

Com **CTRL + Espaço**, digite a linha de código (escolha a segunda opção de **addDataSet**):

`plot.addDataSet(ds, title)`

![](https://lh5.googleusercontent.com/oLdWtpwwKSHJmkhuwhB2DK4cEBcNRStmN0X_gu6pl4utcllPfpl9lplnVQnYqIK75uuAy2mD9EV9djX3BGwUgc_nOBfGSNNzRMKtIoYYM3egR_lIJsrwx3xOGNaRfgdUpws-bh-k)

{% hint style="info" %}
**Importante**

* Você notou que existem 5 comandos **addDataSet** na lista? Bem-vind@ à programação orientada ao objeto. A partir de agora será sempre assim: **CTRL + Espaço**, digita algo e aparecem todos os comandos disponíveis dentro daquele objeto. Não existe como memorizar esses comandos, pois o número de opções vai um pouco além do infinito.&#x20;
* Acostume-se, como (torço que) se acostumou a andar de bicicleta e conte com o [**Help** ](https://anylogic.help/)para comandos mais difíceis. Como regra, tudo o que você faz clicando, preenchendo campos ou conectando, seria passível de ser construído por comandos disponíveis na [API](https://pt.wikipedia.org/wiki/Interface_de_programa%C3%A7%C3%A3o_de_aplica%C3%A7%C3%B5es) do AnyLogic.
  {% endhint %}

A opção de **addDataSet** pede dois parâmetros, o dataset e o seu título. Como o **dataset taxaDeConversaoDS** está no **Main**, precisamos acessá-lo a partir do experimento atual.&#x20;

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/6n-ykos6EI2ywRsjTiTI0WG2vCbNtfyQ0eyBNCUofQoynLiWnUtZTgff9cj2gyeF3Y5R_z7MW6OSDxSk1M0T11WoaiiqwXdXYWvhJw27QcT4OqwupHpoOotg4tR1Gu_AZ0xGQQyT)

Com o comando **root**, você acessa cada replicação em execução ou ao seu término. Complete o  comando informado os dois parâmetros da função: o **Data Set** e a **String** indicando qual o mês foi simulado (a cada ponto digitado, **Crtl+Espaço** e não se esqueça do ponto e vírgula ao final):

![](https://lh6.googleusercontent.com/wSk73-WXWpgk6Tmb2I7OMPMPxybP8p4uiVe1KBeSe9RvCOCV3nZQAC3rr7kQCgUTjgnie5IqVaoDFbTVb_fxEO1Ou8WVuca6ZQ1joCEuo-jris1o7u86qvdb0E88aHLBv1l_78ym)

Simule! :woman\_astronaut:&#x20;

(não esqueça de apertar o botão **Run**!)

![](https://images.unsplash.com/photo-1546546274-1703737efede?crop=entropy\&cs=srgb\&fm=jpg\&ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHw5fHxyb2NrZXR8ZW58MHx8fHwxNjM0NjQyODA3\&ixlib=rb-1.2.1\&q=85)

![](https://lh3.googleusercontent.com/FB2Qr7ygiO4Unr1eEeiIuaMmqpo7fufcHAEa2aFvpfAGM4QzLUH3vpgXVmbHH7Ds99EjkoN13N4C-Z0aVfBVjZAXI7cQCvGbDCbYTpIL-O87MbmA0I8bvtynemdanr1Rt0r4IQXk)

Um pouco rápido, hein? Bem-vind@ ao processamento paralelo! Se o seu computador tem 8 cores como o meu, então o AnyLogic processou 8 cenários em paralelo na primeira leva e depois mais 3 cenários, totalizando 11 simulações.

Aproveite o embalo e crie um **Dataset** para armazenar o **metaOutput** que criamos no **Main**. Volte à linha **After simulation run** e, com a ajuda do **CTRL+Espaço**, procure o comando **add** dentro do **metaDS**:

![](https://lh5.googleusercontent.com/k5EOwPmukkYZTp-qwDNVuH_fYlEfeWbEY0Uawp3TPU1fv7D0G3xyuqZNk1ba0c9f7zbltOPlHNhioqqDYpxYaNlKMEhlkdTgzJ0b6AzVrAxBAuxO3KLk86gywt-t_kfBMuKbwNOs)

Por que um **Data Set**? Porque eu quero armazenar os valores de cada cenário simulado.

Como no caso do gráfico, precisamos adicionar o valor ao final de cada simulação:

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

Com o **root**, chegamos fácil nos valores da simulação:

![](https://lh6.googleusercontent.com/601_bxhaaJI9oRzJu6G_RybXpA-NGIjlnzEt6cUkj1zk10MJDcmBuqJAn8gNh2FWpik4RGl6sL5IKoRxKKW12EM45zVTsGVMLS6kfoWoqdVVp6pcJoVMTcHlfUe_QgazuQ45d3Ng)

Simula! :woman\_astronaut:&#x20;

![](https://lh5.googleusercontent.com/bPxAns3I6kMcZoPxuSRqoimV9y1v2rFqEnsbJ0lJ7RJJloBeC40Fd6LohMvXGOsYYha71mrhVaMq0f1iOkEAgjFoWhzjMoZ-Ea0kXLEeRM-F9WQknsWotFhSIkvzSYclAW1ik95k)

Analisando as saídas modelo, o período mínimo de investimento em marketing é de 6 meses.

Um breve resumo do que fizemos até aqui:

1. Criamos um bloco de **Data Set** e um bloco de **Output** no agente **Main**;
2. No experimento **ParametersVariation** criamos um **Time Plot**  e um **Data Set**  para armazenar, respectivamente, cada **Data Set** (conjunto de dados) que representa a curva de conversão e cada **Output** (valor único) do número de clientes atingido no 6º mês gerado em cada simulação;
3. Nas propriedades do experimento **ParametersVariation**, colocamos no campo **After simulation run** da aba **Java actions**, os comandos:&#x20;

* `plot.addDataSet(root.taxaDeConversaoDS, "Meses = " + root.meses);`
* `metaDS.add(root.meses, root.metaOutput);`

{% hint style="success" %}
**Dica**

* Experimentos ficam armazenados juntamente com modelos e você pode criar quantos quiser. Assim, faça como os profissionais: copie e cole que já fez (gráficos, datasets, códigos etc.) de um modelo para o outro.&#x20;
* Fique de olho nos exemplos diponíveis no AnyLogic (quase 400), sempre tem alguma sacada para nos inspirar.&#x20;
* Quer saber mais sobre o experimento de **Parameter Variation**, como lidar com replicações, tempo de warm-up etc.? Um caminho é [esta seção do Volume I](https://tutorial.anylogicbrasil.com.br/apendice-ou-coisas-que-deixariam-o-tutorial-ainda-maior/simulacao-com-replicacoes) desta série de tutoriais.
  {% endhint %}


# Criando estruturas de dados com Arrays

**Arrays** são estruturas de dados que permitem modelar vetores ou matrizes. Elas são particularmente úteis para a modelagem, pois conseguem incorporar rapidamente ao modelo novas dimensões ou categorias, por exemplo: os clientes da Startup poderiam ser divididos entre jovens e adultos, gênero, renda familiar etc.&#x20;

Um problema clássico de dinâmica de sistemas é a previsão do crescimento populacional. Na sua versão mais simples, ele apenas considera a população atual, a taxa de fertilidade e a taxa de mortalidade. Uma representação possível do diagrama de estoque e fluxo para o problema, seria:

<figure><img src="/files/QjqgZ5sbeDerKl8p9wzR" alt=""><figcaption></figcaption></figure>

Em 2007, por exemplo, a população mundial era de 6,6 bilhões de pessoas, a taxa de natalidade era de 21 pessoas/1.000 habitantes e a taxa de mortalidade era de 9 pessoas/habitantes. A pergunta que se coloca: *e se* a taxa de mortalidade for diferente entre homens e mulheres?

Para compreendermos a estrutura de **Array**, devemos ir além do modelo básico: considere que as taxas de mortalidade são diferentes para cada gênero (masculino/feminino).

Crie um modelo no AnyLogic com o nome **Populacao** e com unidade de tempo **years**:

![](https://lh5.googleusercontent.com/Pdwp-BORZr2_ybUU67vIX9shTcR6HqflrOBAdxeQGgEGdoFhy3chgEZtPkIFkVh4bFIjs3BTJ3ualcd1tim4TCkF7lkveAd28nNgRoG1KqX_FD5IxhPz5QM_n0dbfaV-jr31W2yd)

Com o que você já sabe do AnyLogic, construa o modelo básico, sem considerar ainda a questão de gênero. Adote:

* População = **6600000** (Nota: mais 3 zeros neste número e o AnyLogic apresentaria erro de tamanho de número inteiro. Para contornar este problema, coloque o número com o “ponto” indicativo de ponto flutuante, isto é: 660000000&#x30;**.0**);
* Fertilidade = **0,021**;
* Mortalidade = **0,009**.

Contruído no AnyLogic, o modelo deve ficar como o da figura:

![](https://lh4.googleusercontent.com/0-hhLkGFd9ddGSf0ijaQOxik2-5qIfUO8mY_fi-L4LBh9MUZcBDH0I8NmU3DkHDgE8ZEAeYTolCOCVX-15XcTONLZNMI2BTABVtY7uKv1l0BZrzxOgUPG4wa3m4-11BZFdxT5hiL)

Simule o seu modelo e compare com o resultado a seguir:

![](https://lh5.googleusercontent.com/cYPWZ1aHk6If30Yxfl1wEbPN6ZFJpOjtH99GU_Upf2LAFlrLM89QNjVN4Uj7Niad7F6RR-q4qoD0dYtO5RL4jdMHtdoBNOycMk-mY_JiDgH_nsDrEekaU6MQFKfXXhf3uxL-90wA)

Considere que a taxa de mortalidade seja diferente quando capturada por gênero, sendo de 0.0085 para mulheres e 0.0095 para homens, respectivamente 8,5 mortes/1.000 habitantes e 9,5  mortes/1.000 habitantes.

Para lidar com diferentes categorias (ou índices) o AnyLogic possui o elemento **Dimension**, disponível na paleta de dinâmica de sistemas. Crie uma “dimensão” denominada **Genero**, clicando e arrastando o elemento **Dimension** para a tela:

![](https://lh5.googleusercontent.com/589u1bQzyQJoNp30WLKozWvtTKPZBETdAxIu-ZU5EltzpeOq2zjniPDyFhSNn4mg13Vl-edrWnKzXs_mMz4wMVsMQ2-Lvbcv1-BnORMbDFZTDHeTZBLbJ4BIpxAf7-7b5Vy6hydU)

Modifique o parâmetro **mortalidade** para refletir a diferença de gênero:

* Selecione a opção de **System dynamic array** no parâmetro;
* Selecione a **Dimension** desejada (**Genero** no caso);
* Atualize os valores default (caso desejado) por meio do botão **Edit** ou mesmo digitando diretamente o **Array** “{valor1, valor2}”.

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

Todas as equações precisam refletir a dimensão **Genero**. Comece pelo **Stock Populacao**:

![](https://lh5.googleusercontent.com/0BW46CKGX-80L-buD6dKHzAPVQ4CcTbPZD8L1Hm03DO0DSswW8CEVs3_VJpa6ltJQe5D7kbrO2WwuY2-sv65PaAb46PjMQIUPBG01LAb_IkVmWzNSwv3a6MkB8sF0HANTsMgKEk8)

Como o **Stock Populacao** e o parâmetro mortalidade já estão com a dimensão definida, você pode agora atualizar a equação no **Flow mortes**. Nesta parte, o AnyLogic é bem democrático nas opções, permitindo que você trabalhe individualmente com cada categoria ou genericamente com as duas, bastando utilizar o subscrito correto - \[Masculino], \[Feminino] ou \[Genero].

No fluxo mortes, comece selecionando a opção Array e definindo o Array dimensions para Genero:

![](https://lh3.googleusercontent.com/eFMfVxrsFt0eygnK-s6AFhreLztAJ2ubIDkAVjMy_Ji91Fb6UQtdtvbXoMfwU-Bg2RLII8Zg0Np-_GoggiXfflWqehOviSs7X94zQH9ikLI3cXYw7wkp7QsjN14zJLDxxw3EFPtF)

Agora, vem a melhor parte: defina uma equação para cada gênero, note como o AnyLogic facilita a escolha de cada categoria:

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

Como resultado, as propriedades do fluxo mortes devem ficar assim:

![](https://lh3.googleusercontent.com/Bqv_ww3PW3-TMsjHAnCG_2M5Nz5JipU-I3f4Q9Wu2gwB_IUfN9ZstVMMA0J2SWfrDhNRdKf-VncK68oS2UiOAvtAMCPaR-6mHOib9kvdNwO0Nv26HhpvOSf05e4z09aafnKGu19x)

Chegamos à derradeira e última etapa: a equação de nascimentos. Neste caso, a fertilidade é a mesma para homens e mulheres (50/50) e a equação seria, portanto, a mesma. Você pode, como no caso anterior, criar um equação para cada gênero ou segurar a ansiedade e utilizar o subscrito \[**Genero**] que equivale a aplicar a mesma equação para ambas categorias:

![](https://lh5.googleusercontent.com/oIjA_D3Yfxu7VJGrqyU5P8a0Mu7ApQOSSprV-HEm_zn0sGPV3ctuC5oZ9epYOwp0y276JsYYq20YGy13nEtG7UsWPp73HrwYHbwethSRXnV4no8kxR0Yl3C-Kre74LMS-7QrEEFw)

Como resultado, o fluxo nascimentos fica:

![](https://lh6.googleusercontent.com/5bMLmah4oQN8471pTM7xVBhJdBf2pYgRNuNMpBnFhExBK8KC9KPJwUBnIPMGGnSBngeqWJ2ImOR70Ni3JAXOxtNvdeYrcdP2zMBz-XJBfauRwbKGIBbKWuZqNNBVKHln2N2tuRwx)

Já pode simular!

![](https://images.unsplash.com/photo-1457364887197-9150188c107b?crop=entropy\&cs=srgb\&fm=jpg\&ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHwxfHxyb2NrZXR8ZW58MHx8fHwxNjM0NjQyODA3\&ixlib=rb-1.2.1\&q=85)

![](https://lh5.googleusercontent.com/zoZ_zfQMIIBhNu82OQ6NQDymeCBpQJ5ksUyF0Q8peyQMurVAMn6ryT2raA1-FIp6NoNCwowbQHL0WYUH5nA8uIFXVu_hKKT8Yf6fevbJox6clG732Rss7o0ImeWJHgqr7HjaB8Xh)

Repare como dentro de cada bloco (**Stock**, **Flow** e **parameter**) os resultados já estão separados por gênero, com o AnyLogic encarregando-se de compor todo o equacionamento do modelo. Do ponto de vista de prática de modelagem, existe uma consequência natural deste recurso no AnyLogic: foque, inicialmente no modelo, estoques e fluxos. Com algo funcional em mão, dedique-se a eventual necessidade de uso de índices para categorizar fluxos específicos via **Arrays.**


# Comunicação com planilhas Excel

Para conexão com planilhas eletrônicas (tanto para entrada, quanto saída de dados), o AnyLogic fornece diversas alternativas. São duas as opções indicadas para iniciantes:

* Importar os dados da planilha para o banco de dados do AnyLogic ou
* Conectar diretamente a planilha como um objeto dentro do AnyLogic.

## **Importando os dados da planilha para o banco de dados do AnyLogic**

Neste caso, os dados da sua planilha do Excel devem estar com uma “cara tabular”, pois, no AnyLogic, cada pasta do Excel será importada para uma tabela própria do Banco de Dados e \[importante!] a primeira linha da planilha será utilizada como título das colunas da tabela. Assim, *nao utilize acentuacao* ou cedilha na primeira linha da planilha.&#x20;

Por exemplo, considere a seguinte planilha Excel:

![](https://lh3.googleusercontent.com/VFoqMjpnQhdKBSNkRhwG5vn2ISpTKc2iyIH2rZDyih3CBT_i9zWyXk3JOHYi8J3dNIBmUINHMbVIk-saIUCAVU1iTXvGp7RAv2WmEGjYUUl-2TROwOYZgw_hd3DRi_XucINYGvFj)

Para importar a planilha para o banco de dados, siga os passos:

* Clique com o 2° botão do mouse em cima do ícone **Database**, na aba de projetos e selecione a opção: **Import database tables**;
* Localize o seu arquivo Excel (ou tabela de banco de dados);
* Selecione, se for o caso, as pastas que queira importar e aperte o botão **OK**.

![](https://lh6.googleusercontent.com/aSyU-frig7breFNh1Sr5ugQMmInkOXZNFVY7uB3NqKCWTU0JrIY2bb9eY31mdokMaLiN0k9UPCzDpr-kJiHkRzpxGEosu4qeEwxMF1nno0eFAShUZSR4YDqzfzoRR3GQPSTJOTp8)

No exemplo, a planilha foi importada como uma tabela e, com dois cliques no seu ícone, você pode visualizar os dados armazenados:

![](https://lh6.googleusercontent.com/AyLN_LMjyel4OMyQLiUJ6MExnDg2NrGpcgLEidxRVnaTt90jpaGyKPZHqcUalUzpfwuq7-ngYjYRXSggM_NtfwJpKH-zZRSdFc3dAOXCtQV2gWRDU2l-9TGQJO3oGf-9xfSXQn8u)

O uso dos dados da tabela pode ser feito diretamente pelo comando **Insert Database Query**.&#x20;

Por exemplo, vamos utilizar a “População total”, armazenada no banco de dados, como valor de entrada para o parâmetro **populacaoTotal**. Neste caso, você precisa:

* Selecionar o campo onde o valor será preenchido (no caso **Default value**, nas propriedades do parâmetro);
* Clicar no ícone do  **Insert Database Query** (note que ele só fica ativo quando você entra no campo **Default value**;
* Selecionar a tabela com os dados em **Table**;
* Criar uma condição de pesquisa (note como o AnyLogic auxilia o processo, abrindo automaticamente as opções).

![](https://lh3.googleusercontent.com/OhB7pgVGpUsyQYkSJJMkBgGR6ERXl1TvyzfByQufd8sRDwWML5lrf9ZaAb4aKwMlJOd2aMPMSyef5pa4_-ULsIcZczgyaT4Xx3SRVuVbqIkui8_iIGD9q-P3ItnB4AzXpdtxU6Ju)

Caso você conheça a linguagem **SQL**, a diversão pode ser ainda maior, pois o campo de **Default value** (e qualquer campo que aceitar algum valor do banco de dados) aceita comandos SQL diretamente. Repare, por exemplo, na última opção da janela do **Insert Database Query:**

![](https://lh6.googleusercontent.com/KGmo5wqMGqPxImJvO9KNE6IvthnXSYhWXsazRggmlyJL_GCXgOjVGoQ0YKCFoI7iaM_s5ZXIg4TenE6r9ksqhYcH5LqDPkxoRB_D4BAAel-kIZ2ie3Hb-RAWdP1ls-lI-vHlWMNN=s0)

## Conectar diretamente a planilha do Excel como um objeto dentro do modelo

Neste caso, você deve trazer o Excel para dentro do modelo, por meio da paleta **Connectivity**:

* Arraste o bloco **Excel File** para o modelo;
* Selecione a planilha desejada na janela **Properties**.

![](https://lh6.googleusercontent.com/GRerymSmE8Nug-BS1-nJxYd5gakRpnVMMY4N3ySuQ5UPda_oa-jaATgfpnQfacTtBzseXXDm1W1ts9DS-tuPeeUdHPzQElwauqIp3P-cI9OFxJ8lcRyBZiDercIVJsAc-Hy8dckh)

Para importar/exportar valores entre a planilha e o modelo, são muitas funções, mas as principais são:

* **getCellNumericValue**(String sheetName, int rowIndex, int columnIndex): sheetName é o nome da planilha (por exemplo: “Inputs”), enquanto rowIndex e columnIndex são os índices linha/coluna da célula contados a partir de um;
* **getCellDateValue**(String sheetName, int rowIndex, int columnIndex): idem ao anterior, mas para uma data;
* **setCellValue**(value, String sheetName, int rowIndex, int columnIndex): exporta um valor para o Excel. Por exemplo: excelFile.setCellValue(2.0, "Outputs", 10, 2);  exporta o valor 2.0 para a célula da linha 10 e da coluna 2 da planilha “Outputs”;
* **writeDataSet**(DataSet dataset, String sheetName, int rowIndex, int columnIndex): idem ao anterior, mas para um dataset completo.

Por exemplo, se você quiser importar o valor do número de meses, ele está na pasta de Inputs, na linha 4 e coluna B. O comando ficaria:

`excelFile.getCellNumericValue("Inputs", 4, 2)`

Se você for um excelmaníaco, o comando anterior também aceita o formato:

`excelFile.getCellNumericValue(“Inputs!B4”)`

Todos os comandos possíveis com planilhas estão bem documentados no [Help](https://help.anylogic.com/index.jsp?topic=%2Fcom.anylogic.help%2Fhtml%2Fconnectivity%2Fexcel-file.html) e existe um modelo exemplo absolutamente completo no AnyLogic (procure por “Reading and Writing Excel Files” no menu suspenso Help, opção "Example Models") que você pode [executar sua versão na nuvem aqui](https://cloud.anylogic.com/model/99d9f196-17e7-47c3-9b28-63a6f23b0dad?mode=SETTINGS).


# Leitura/Gravação em arquivos txt

Na paleta **Connectivity**, também é possível criar conexões diretas com arquivos texto (“**.txt**”):

* Arraste o elemento **Text File** para o modelo;
* Configure seus parâmetros de nome/local (pode ser, inclusive, um arquivo com endereço na Internet!), se vai ser de leitura e/ou gravação e, caso seja um arquivo de leitura, indique o separador (linha, Tab, ponto e vírgula, vírgula ou espaço);
* No local que deseja ler/gravar algo no arquivo, utilize o nome do arquivo, seguido do ponto final e a função desejada (por exemplo: **println**, **readln**, **printf**, **readString**() etc).

Por exemplo, vamos gravar em um arquivo os resultados das replicações para a ocupação dos caixas de atendimento. Vamos criar um bloco **Text file** dentro do Experimento **Parameters Variation**:

![](https://lh5.googleusercontent.com/N1IdCEAaBTUnFyNa4zaIRNAbG-EJmAMPPDW4AAE6fR_JjuZUgnq4TvqxqlBniarAqJaRcShdPAEnBxPG-_0CRFi5ODs4RgsAnvbzqksDgU8YqooGV8v2FOonRnQd-oCrSRTtrxZc)

Para isso, precisamos ir ao **Experimento Parameters Variation** e acrescentar à opção **After simulation run** o comando de gravação no arquivo.

A utilização é semelhante à do Excel. Escreva o nome do elemento, digite o ponto final e plaft! (clique em **CTRL+Espaço**):

![](https://lh6.googleusercontent.com/yvgvGg8djq1bRo1AttTTG_KgHBN9cflSJiNsUSWYhRZ9nPNcgC1usFd0PRl2QwKwd35ogSpabgmqDKp9dNkpq2qGabkKlRDOMKjuI8gSVmO50EX91o1uofFFqWHXn6Z_gNMMyFqI)

No comando anterior o AnyLogic vai enviar ao arquivo, para cada cenário simulado, uma linha com o número de meses de investimento em marketing e o número de clientes atingidos no 6º mês, separados por ponto-e-vírgula (ou, precisamente, um arquivo do tipo ".CSV").

{% hint style="info" %}
Dicas:

* Se você quiser separar por espaço de tabulação, utilize “\t”);
* O Medium tem um post com um guia completo de formatação em Java, muito bom (clique no link a seguir):
  {% endhint %}

{% embed url="<https://medium.com/better-programming/formatting-strings-with-java-2281d40accce>" %}


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


# Outras funções matemáticas e de simulação de dinâmica de sistemas

As bibliotecas disponíveis no AnyLogic são variadas e extensas (inclusive você pode importar bibliotecas Java de terceiros. Eu, por exemplo, já importei [esta biblioteca de programação linear](https://github.com/quantego/clp-java) para um projeto).&#x20;

A primeira fonte de informações é o Help e [neste link você abre o catálogo de funções](https://help.anylogic.com/nav/3_1) separadas por tipo (matemáticas, arrays, distribuições probabilísticas, controle do tempo, dinâmica de sistemas e impressão).

Para dinâmica de sistemas, cabe destacar duas bibliotecas fundamentais:

* A biblioteca [Math](https://help.anylogic.com/nav/3_1), com seu arsenal de funções matemáticas;
* As [funções específicas de dinâmica de sistemas](https://help.anylogic.com/nav/3_1_4) (delay, delay1, delay3, delayInformation, delayMaterial, forecast, gammaLog, npv, npve, pulse, pulseTrain, ramp, smooth, smooth3, step e trend).

O uso deste *arsenal* foge ao escopo deste tutorial. Mas se você chegou ao ponto de utilizá-las, a partir deste ponto qualquer bom livro de simulação de dinâmica de sistemas vai guiá-lo para o infinito e além!&#x20;

Boa viagem!

![](https://images.unsplash.com/photo-1454789548928-9efd52dc4031?crop=entropy\&cs=srgb\&fm=jpg\&ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHwzfHxhc3Ryb25hdXR8ZW58MHx8fHwxNjM0NjU5NzI5\&ixlib=rb-1.2.1\&q=85)


# Tutorial AnyLogic: dinámica de sistemas

## Introducción

![](/files/-MSK2Km5eGBgACP7tIjC)

Este es un tutorial para el entorno AnyLogic, eventos discretos, agentes y simulación de dinámica de sistemas *se (se quiser ler a versão em pt-br,* [*clique aqui*](https://tutorial-ds.anylogicbrasil.com.br/)*)*.&#x20;

Se centra en el contenido de **Systems Dynamics** en el AnyLogic, o como se escribe y se habla comúnmente en español: **Simulación de Dinámica de Sistemas**.

![Os três métodos de simulação do AnyLogic](/files/-MSKr5VwplB-UjNMEoTf)

Aunque es el segundo volumen de la serie de “tutoriales rápidos” (el primero, sobre simulación de procesos en AnyLogic, [puede encontrarlo aquí](https://tutorial.anylogicbrasil.com.br/v/tutorial-es)), se asume que el lector aún no conoce AnyLogic y está buscando un **partido caliente** software (o posiblemente ya conozca otras herramientas de simulación de dinámica de sistemas, como Vensim o Stella).

Así que no se confunda: este tutorial trata sobre la dinámica de sistemas; el volumen I, sobre Procesos; y un posible volumen III será sobre simulación híbrida (unión de las 3 técnicas).

*Si quieres un curso completo de AnyLogic, visita* [*la página de Genoa en Eventbrite*](https://genoa.eventbrite.com.br/) *o si quieres saber más sobre quiénes somos, qué hacemos y cómo vivimos, visita*[ *la página de Genoa*](https://www.genoads.com.br/) *en la World Wide Web.*

![](/files/-MSK2OsJtsBXAqIO1UgG)

{% hint style="success" %}
Antes de que ruede la pelota, un agradecimiento especial a los profesores: Marisol Tapia (INACAP, Chile) y Ignacio Brottier (ITBA, Argentina) que ayudaron en el proceso de revisión de todo el material en español 🧡,  a todas las personas que ayudaron con las correcciones y, de antemano, **gracias a usted**, que está leyendo el tutorial ahora mismo y si encuentra algún error, enviará un correo electrónico cortés a *contato at genoads.com.br* 🧡💛💙
{% endhint %}

## Premisa

Este tutorial asume que ha tenido alguna experiencia con la simulación de dinámica de sistemas. Al final, se ofrecen algunos links, videos y sugerencias de libros para ampliar sus conocimientos. En ningún momento el tutorial explicará los conceptos de modelado o simulación, suponiendo que ya comprenda los conceptos básicos. Si desea una recomendación para [un buen libro de simulación, siga el enlace.](https://www.amazon.com.br/gp/product/8535279326/ref=as_li_tl?ie=UTF8\&camp=1789\&creative=9325\&creativeASIN=8535279326\&linkCode=as2\&tag=livrosimulaca-20\&linkId=b5e66cf9a4c417f108f7e7c43c388ccb)

## Qué necesita para este tutorial

Para realizar este tutorial, necesita:

1. Una computadora o ordenador portátil (64 bits) con Windows, Mac o Linux instalado;
2. Ratón preferiblemente con rueda de zoom (para **zoom** de pantalla);
3. Acceso a Internet;
4. Amor en el corazón.

## Pasos

Este tutorial tiene cuatro partes que deberían tardar alrededor de 2 horas en completarse. Le recomiendo que abras este archivo en otro monitor conectado a tu computadora, o en un segundo dispositivo: otro monitor conectado a su computadora, un Ipad o, en la pantalla del teléfono. No imprima este archivo ni genere un pdf, como ~~ya lo hice y salió mal~~, no tiene sentido imprimir un tutorial lleno de gifs animados.

Oh, además de las cuatro partes, también está el Apéndice, que complementa el tutorial con temas específicos y una ejecución rápida.

**Nota para profesores**: escalamos el tutorial para una clase práctica de 2 horas en un laboratorio con recursos computacionales, para alumnos que ya han tenido algún contacto teórico con simulación de dinámica de sistemas (el material es autoexplicativo, siendo el profesor responsable para la dinámica de la clase). No obstante, al comienzo de la Parte II, desarrollamos una breve discusión sobre la modelización de los vínculos causales del problema propuesto, que puede servir como base para una introducción teórica al tema.

![](/files/-MSG7AZBkQ3ehKstoOmM)


# Instalación, apertura, cierre y uso del mouse

## Descarga e instalación de la versión PLE

AnyLogic tiene una versión llamada [PLE - Personal Learning Edition](https://www.anylogic.com/downloads/), específicamente para autoaprendizaje o uso en el aula. Todo este tutorial se elaboró ​​sobre él.

Si aún no lo ha hecho, debe descargar la versión PLE a través de este [link](https://www.anylogic.com/downloads/).

## Pantalla de bienvenida

Cuando se abre AnyLogic por primera vez, aparece la pantalla de bienvenida, como en la imagen a continuación (el color predominante puede ser diferente si su versión de AnyLogic es diferente, no se preocupe):

![](/files/-MSG7AZCa7SsphT00e7F)

## Abrir una modelo

Comencemos abriendo un modelo. Haga clic en el botón **Open examples**, ubicado a la izquierda de la ventana.

La pantalla cambia para reflejar la disponibilidad de más de 390 ejemplos integrados en AnyLogic.  Es importante destacar que incluso usuarios avanzados de AnyLogic, todos copian (= CTRL + C) ideas de estos ejemplos.

Si te desplazas un poco hacia abajo en la barra izquierda, encontrarás todos los ejemplos en el libro [“Business Dynamics”, de John Sterman](https://www.mhhe.com/business/opsci/sterman/), considerado la biblia de la dinámica sistemas aplicada a los negocios.

![](/files/-MSG7AZD0sbd-ojMfWXo)

Nuestra primera actividad será abrir un modelo y comprender un poco de AnyLogic. Busque el modelo **Insurgency Dynamics** en **Social and Eco Dynamics**, en la columna **Examples** seleccione el modelo **Insurgency Dynamics** en la columna de la derecha, o simplemente escriba **Insurgency Dynamics** en espacio de escritura (en la parte superior de la primera columna).

![](/files/-MSG7AZEguhuauWbo91b)

Con el modelo abierto, es fácil reconocer las 3 grandes regiones de trabajo y comandos de AnyLogic:

* A la izquierda es donde navegará por los **agentes** de su modelo o buscará en la paleta elementos/bloques de construcción en la paleta de navegación;
* En la región central, tenemos el área de trabajo, donde se arrastran los bloques y se construye el modelo;
* A la derecha tenemos la ventana de **Properties** o **propiedades del elemento seleccionado**. En la siguiente figura, por ejemplo, el objeto seleccionado es el icono con el nombre del **Modelo Insurgency Dynamics \[cloud]**, de modo que a la derecha tenemos las principales propiedades del modelo abierto (tenga en cuenta que podemos modificar su nombre o su unidad tiempo, por ejemplo):

![](/files/-MSG7AZFP1TIekUchHTW)

En la ventana **Properties** hay un campo, debajo, en el que el desarrollador ha dejado un texto describiendo lo que hace el modelo (buena idea: comenta siempre tus modelos)..

En resumen, es un modelo clásico de insurgencia en una sociedad: la gente se divide en cuatro grupos: partidarios del gobierno, disidentes, insurgentes e insurgentes destituidos. Los disidentes e insurgentes se comunican con los partidarios del gobierno que reclutan personas para que se conviertan en disidentes. Pero no todos los disidentes se convierten necesariamente en insurgentes: una fracción del grupo disidente es apaciguada por el gobierno y regresa para apoyarlo. El resto de disidentes terminan convirtiéndose en insurgentes. La fuerza de los esfuerzos del gobierno para reducir a los insurgentes depende de los recursos asignados y es proporcional al tamaño del grupo insurgente.

¡Parece divertido! Para ejecutar el modelo, primero haga clic en el botón verde en la barra de menú superior **Run Insurgency Dynamics/Simulation** o use el acceso directo (**F5**, para Windows):

![](/files/-MSG7AZGUa3A34VnrSjY)

AnyLogic compila el modelo y, si no hay error de compilación, abre el modelo en su formato **ejecutable.**

**Importante:** AnyLogic genera modelos ejecutables en lenguaje Java. La versión profesional del software permite al usuario exportar sus modelos en formato ejecutable, para que puedan ejecutarse en computadoras que no tienen AnyLogic instalado.

![](/files/-MSG7AZHkjONh-fWkqC5)

La pantalla de inicio presenta los distintos parámetros del modelo con botones deslizantes (que veremos cómo se hacen a lo largo de este tutorial). Sin perder demasiado tiempo, inicie el experimento de simulación a través del botón **Run** en <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfku2UKZnJmyQkTu2uUrSsCbhDl8bfStW2CE-2rbk92-fvSrFZi4ctSRU4t5AW69Slz4b0VDa5PZXqvRzs1aLOeeYwpX76C1eS9U5dokLZZf6jJ1UZAvJnmYaliK16Z3vfaVmbdgXd53BJ2n4sIZAWWcus?key=SdyPO9ljx-fNJUKZIZPKWQ" alt="" data-size="line">la esquina inferior izquierda de la ventana:

![](/files/-MSG7AZJQNolKCX0pbB-)

Este modelo es más que un modelo: ¡en realidad son dos modelos ejecutándose al mismo tiempo!

El **SD model** es el modelo representado por la dinámica del sistema y el **AB model** es el mismo modelo representado por la [simulación basada en agentes](https://www.anylogic.com/use-of-simulation/agent-based-modeling/). Los gráficos de la parte inferior muestran cómo evoluciona la participación de cada grupo de población (a la izquierda, el modelo de dinámica de sistemas y a la derecha, sobre los agentes).

Con una mirada de cerca, debería notar que los gráficos del modelo SD son suaves, mientras que el AB tiene algunas muescas. ¿Puedes explicar por qué? (Responde hoy, en esta sección).

![](/files/-MSG7AZKtM54ya_WCHCi)

Haga clic **SD model** en la esquina superior derecha para acceder al modelo de dinámica del sistema (este menú fue creado por el desarrollador del modelo **Insurgency Dynamics**). Es un modelo de tamaño mediano y suena confuso, pero no lo es: tenga en cuenta que la parte superior representa el flujo de personas desde el nacimiento hasta que se convierten en insurgentes *eliminados* (creo que puede entender que eliminados es un [eufemismo](https://es.wikipedia.org/wiki/Eufemismo)) o simplemente convertirse en partidarios del gobierno.

![](/files/-MSG7AZL6-HtF7Nxn1Z6)

Si ahora hace clic en el **AB model** verá el modelo basado en la simulación de agentes, en el que cada individuo está representado por un agente específico (es por eso que el gráfico de simulación de agentes no es tan suave como la simulación de dinámica de sistemas, que no individualiza la persona, ya que siempre funciona con **flujos**).

**Importante:** tenga en cuenta que el modelo como un todo es, de hecho, un modelo **híbrido**, ya que el flujo de mensajes antigubernamentales está modelado por la dinámica del sistema (representada por la región amarillenta en la parte inferior de la figura siguiente), mientras que las personas son modeladas por agentes. Esta es otra característica única de AnyLogic: construir modelos híbridos mezclando dinámica de sistemas, agentes y eventos discretos.

![](/files/-MSG7AZM1qEoLJdm9RmJ)

Si hace clic en el botón **Open statechart of random agent**, podrá ver cómo se codificó el agente en este modelo, en el que cada globo representa **el estado de agente** y las transiciones se realizan, en su mayoría, por mensajes intercambiados entre agentes (es más allá del alcance de este tutorial, explique el procedimiento).

¡Ahora es el momento de cerrar esta aplicación haciendo clic en la "x" en la esquina superior derecha de la ventana y empezar a ensuciarse las manos!


# Ejercicio: Difusión de una nueva aplicación

En este tutorial, crearemos un modelo de simulación de una startup que tiene la intención de lanzar una nueva aplicación móvil (app) en el mercado. En un primer paso, nos preocupamos de cómo se extenderá el producto en el mercado y, en un paso siguiente, completamos el ejercicio considerando el flujo de caja (inversión, ingresos y costos involucrados).

La aplicación será gratuita y la monetización se realizará a través de anuncios y la venta de funciones adicionales. Así, la startup entiende que el volumen de usuarios es un parámetro fundamental para la viabilidad del negocio.

### Objetivo de este paso:

* Construir un modelo de simulación para evaluar cómo se extenderá la aplicación en el mercado y estimar en cuántos meses debería invertir la startup para que llegue al marketing, al menos un millón de usuarios para el sexto mes de lanzamiento de la aplicación.

### Dado que:

* El tamaño del mercado se estima en **5.000.000** de clientes potenciales y, una vez convertido, el cliente nunca abandona la aplicación;
* Se estima que cada mes de inversión en marketing es capaz de convertir el **1,1%** de los clientes potenciales en nuevos clientes;
* Existe un efecto esperado de la publicidad boca a boca: cada usuario de la aplicación comenta con *10* de sus contactos al mes y, en este caso, la probabilidad de conversión exitosa es del **5%** (entre los que aún no son usuarios).

Por tanto, la startup afronta el lanzamiento de un nuevo producto que se difundirá en el mercado a través de acciones de marketing (anuncios, participación en eventos, notas de prensa, etc.). Es de esperar que, en algún momento, el producto "se vuelva viral" por medio de la publicidad de boca en boca.

Definido de esta manera, el problema es similar al modelo clásico de marketing conocido como: [Modelo de Difusión de Bajos](https://en.wikipedia.org/wiki/Bass_diffusion_model), creado por [Frank Bass](https://en.wikipedia.org/wiki/Frank_Bass)

<img src="/files/-MSKrw5Zy46DCReS53Dm" alt="Dr. Frank Bass" width="375">

Desde la perspectiva de un problema de optimización, tenemos como variable de decisión el número de meses de inversión en marketing y el objetivo es minimizar el costo de marketing, sujeto a la condición de que en 6 meses el número de clientes debe ser mayor que o igual a 1 millón.

Antes de comenzar con AnyLogic, tenemos dos secciones que describen el modelo que se construirá a través de su diagramas “bucles causales” (o *causal loop diagram*, como diría el Tío Sam) y diagramas de “flujos y stock”.


# Diagrama de bucle causal (DBC): modelo de difusión del producto

Si solo piensa en **el ciclo de marketing**, el diagrama de bucle causal - DBC, a continuación, es representativo de la **dinámica del sistema**:

* Por el arco inferior, cuántos más clientes potenciales (o mercado más sin explotar), más conversión de marketing, y por lo tanto, más personas comprando nuestra aplicación. La conversión de clientes potenciales en compradores de aplicaciones se rige por dos parámetros: "efectividad de las acciones de mktg", que equivale al porcentaje de clientes potenciales convertidos por mes o tasa de conversión de clientes mensual, y el número de "meses", que equivale al número de meses. invertido en marketing;
* Pelo arco superior, quanto mais pessoas compram o app, menos pessoas estão disponíveis no A través del arco superior, cuantas más personas compren la aplicación, menos personas estarán disponibles en el mercado (si, por ejemplo, el mercado estuviera formado por personas que trabajan o estudian con usted, con cada "conversión" su mercado se convertiría una persona más pequeña, incluso que todos se convirtieron y no tendrías nada más que hacer en la vida).

![](/files/-MSG7AZN8-jGqpZl2zJi)

En la figura, también agregué una letra "B" con un bucle dibujado, que representa que la secuencia "Clientes potenciales> Conversión> Personas comprando> Clientes potenciales" es un **bucle de equilibrio** (de ahí la "B") o **equilibrio**.

Un “bucle de equilibrio” se caracteriza por bucles de compensación, formando una secuencia que busca un punto de equilibrio dentro del sistema. Para identificarlo, recorremos el bucle partiendo de cualquier variable, como Leads, por ejemplo. Suponiendo que esta primera variable aumenta, si, al volver a la variable, el efecto que provoca el bucle es opuesto, es decir, decreciente, entonces tenemos un bucle de equilibrio (en caso contrario, tenemos un bucle de refuerzo, que se ejemplifican a continuación un poco). En este ejemplo, tenemos el siguiente efecto: si aumenta la cantidad de leads, también aumenta la conversión de marketing, lo que genera un aumento en la cantidad de personas que compran la aplicación, lo que, a su vez, provoca una disminución en la cantidad de clientes potenciales. . Es decir, dejamos un aumento de clientes potenciales y volvimos con una disminución de ellos. El concepto es este, pero en caso de que prefieras usar una pequeña regla: cuando el número de signos negativos en los bucles que componen el bucle es impar, es un acto de equilibrio. En cualquier caso, acostúmbrate a la idea de que una vez que hayas terminado un bucle, deberías revisar mentalmente tu secuencia y ver si tiene sentido.

Pero como dije, el marketing es solo una forma de atraer nuevos compradores. Nuestra aplicación también será difundida por los usuarios en las redes sociales, formando una red de difusión boca a boca, cuyas dinámicas están representadas en la siguiente figura:

![](https://lh3.googleusercontent.com/YSLlLotWHZS56U1aaXA4paUFNF9gmDrOT0rekwPD8UTGLS-xC2RENBNzCcCovSXU90ryMg4DLKhsfTVtTw70uiJoLMmJ-uoXbAKlcBc_aZ37JbjuTaD_wY67UVndSA5dARE7f7cC)

* La tasa de personas que compran la aplicación tiene un impacto positivo (y directo) en el número de clientes (arco superior);
* A medida que aumenta el número de clientes, más personas darán a conocer nuestra potente aplicación y, por tanto, mayor será la tasa de conversión de nuevos clientes por red social. Nuevamente, tener más personas convertidas significa que más personas están comprando la aplicación. El arco inferior representa estos efectos.

En este dibujo, al bucle "boca a boca" se le ha dado una "R", lo que indica que es un **bucle de refuerzo**. En este tipo de bucle, el sistema parece aumentar (o disminuir) indefinidamente. Tipo de picadura de goma: cuanto mayor es la picazón, más pica, lo que aumenta la picazón, pero luego pica más ... y podríamos quedarnos en este círculo vicioso para siempre.

La buena práctica recomienda que no se desarrolle una nueva neurosis detallando cada vez más el diagrama de bucle causal. A pesar de que ~~mi psiquiatra ha dejado claro que~~ el diagrama anterior ya es adecuado, agregaré un bucle más y me gustaría que reflexionaras sobre el significado del mismo:

![](https://lh5.googleusercontent.com/HujaWQ7EgAJ5B82kUv-6S5obj7c7K1Tu13HQmVEbBld_EkTLLdpEPQoWw46ljYJ575aFOEg87V-PjIz1Ff_fpYtrUHlFH562CHCnN5EBrcSXdwmtRk-mGXiOSvdi5iFHeTnNn_qN)

Si quieres un guión muy conciso de consejos para construir un buen DLC, visita [este página en The Systems Thinker](https://thesystemsthinker.com/guidelines-for-drawing-causal-loop-diagrams-2/) o esa genial [serie de dos publicaciones de Prof. Sterman](https://thesystemsthinker.com/fine-tuning-your-causal-loop-diagrams-part-i/) en The System Thinker.


# Inventario y flujo

En el diagrama anterior representamos relaciones de la **causa y efecto**, sin pensar mucho en cuáles serían las unidades, valores o relaciones matemáticas y lógicas involucradas. El siguiente paso es representar el sistema mediante un inventario y un diagrama de flujo, que se acerca más a lo que creará en AnyLogic.

El primer paso es reflejar, en el diagrama anterior, cuáles serían las unidades involucradas. Este tipo de reflexión es fundamental para que usted adquiera conocimientos sobre el sistema y el modelo a construir:

![](https://lh3.googleusercontent.com/FwXPpK1D4aXQODAce3d86-idY5BxfIGIq-plg3YPWQoIeTHxUXxL8sh2wR5fPsgCkBtiu4iclzsLPP4Zbgs6EQdLNVH13Q1KoPlERua0lkJWFPSySLyZQShHOTbiznwQliL4jmCA)

En este tipo de diagrama, los “stocks” representan cosas que se acumulan o agotan a lo largo de la simulación. Mientras que los "flujos" representan las tasas a las que estos stocks aumentan o disminuyen.

Para nuestro caso, el inventario y diagrama de flujo se puede representar como la siguiente figura, destacando:

* Las cajas (similares a tanques de agua) representan las existencias de clientes potenciales y clientes (la pequeña agua azul es solo un encanto);
* Hay un flujo de personas que pasan de una acción a otra, es decir: la tasa de personas que compran la aplicación, que está representada por la válvula que conecta ambas acciones.

![](https://lh3.googleusercontent.com/cGj-puvsV1jYwhmXCUZQrd7fBnWyOiHwWmnVMYLzHRkKiaNTfs5xmXEAYPjroe8vwyMbIDEj72kEqQ4V5zQSbJgRbP85-sLgdBqiGS-6GyhTNStpIjjg0SaXwNxGuqKutNP9WG4C)


# Creación del modelo

Un nuevo modelo en AnyLogic se **crea** mediante la opción de menú desplegable **File> New**. Ingrese en la ventana de creación el nombre del modelo y cambie la unidad de tiempo general del modelo de **seconds** a **months**.

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


# Creación del diagrama de flujo y stock en AnyLogic

## Bloques de stock y flujo

AnyLogic tiene varias paletas con bloques de comando que se arrastran al área de modelado central.

En este primer paso del ejercicio, crearemos el diagrama de flujo y stock, como en el dibujo anterior, desde la paleta de comandos de **Dinámica Sistema**. Las paletas de comandos están en el lado izquierdo de la pantalla y cuando dejas el mouse por un tiempo en el borde mismo de la pantalla, aparecen los nombres de las paletas:

![](https://lh3.googleusercontent.com/jCxxD0I7Niiu8nXqiCGeBja18CEWVtZnY1uPgyBDK6waJHl-u6OtZqMJj56Yx4vCeSOQjdAP_j4VwZAGqqg6P1V133GQ-iPT-sKn5gVGzuwn-_iVF5MSKjVpd8NFnXW4L1nEJxhp)

La paleta es muy simple (¡lo cual es bueno!) Y los comandos se utilizan en secuencias haga clic y arrastre. Por ejemplo, creamos nuestro primer bloque de **Stock**: haga clic, mantenga presionado y arrastre el bloque de **Stock** desde la paleta hasta el centro de la pantalla. \[Observe, en la región **Properties**, la derecha, cómo cambia el menú para reflejar las propiedades de lo que hace clic en la pantalla]:

![](https://lh6.googleusercontent.com/0pbkUVPsE_eHusZjeMjcq5begizrhl4asPFI1OQSTuoW2BI0GvUVcfKMwT6eBY4EHxzydGvkzkH9npXqszq24BLelW1UTuzfrS7BkRpCjlLRc--4XgeGYUdUvparC5Ewx2MaTQgw)

Arregle un poco el bloque:&#x20;

* Cambie el nombre a **PotentialClients**;
* Aumente un poco el tamaño y centre el texto:

![](https://lh4.googleusercontent.com/iEpTgZF7Y7VPbnkNX69sCs-WPQEtLaz5_Mpj3JBI3nQfigaa6B4bM-82vO9f2yiSDdMypOv7xNttRhlVG20wEig-dqQiQl7D0-w_ekk9Tk_m5fzgZ9ULDZXi3jO_0GXrzZeTwqxO)

{% hint style="info" %}
En AnyLogic todos los nombres de bloques y elementos se consideran nombres de variables, parámetros o clases, entre otros animales. Así, no acepta en estos campos: espacios en blanco, acentos o cedilla, entre otros animales.
{% endhint %}


# Zoom

El comando de **zoom** en AnyLogic está oculto en su **mouse**: mantenga presionado el botón **Ctrl y gire la rueda del mouse** (o presione **⌘** mientras realiza ella **gesto de desplazamiento de pantalla**, en el trackpad de su Mac). Alternativamente, puede usar los comandos de zoom en la barra de menú superior.

![](https://lh5.googleusercontent.com/PCGVT7dPsM718THlhuPs5woWbxGHGdX9pI6LkUn2aEf7QfBIvE1D9oLqS6T9ML4IIoqVoeA_xChu3JcL-cakUFHR7TnEFEKOCB9UpBAr0S5_e8GDQ6l-BvkS4C0WAV0vqJ8gbE8n)

Para el segundo bloque de valores, voy a usar el comando **Copy/Paste**, pero antes de hacer nada, sepa otro comando *secreto* del mouse:&#x20;

* Haga clic y mantenga presionado el **Ctrl** (o ⌘ botón) en su teclado, al mismo tiempo que haga clic y mantenga presionado el elemento que desea copiar;
* Arrastre hasta la ubicación deseada y suéltalo.

Agora, modifique o nome do bloco para **Clientes**.

![](https://lh3.googleusercontent.com/rF3pVNbZA71RXCkl8ZXfxBuqWSb1__lV82ismEl7563w-DxsMSPazRB2L_ZKsnFAoYtanuNDPkL-3Q6aElDsYfNV6MpQJ3MFKZ1WEjtYL6OqS0-gQQafQHeyiea349whyBbgjZwI)

Entre las bloques de **Stock** hay un flujo y AnyLogic tiene dos formas de construirlo: dibujando de principio a fin o arrastrando.

Siempre que un elemento de la paleta de AnyLogic tiene un **icono amarillo** en su lado derecho, si hace doble clic en él, entra en modo de dibujo y aparece un bolígrafo que reemplaza su icono:

![](https://lh5.googleusercontent.com/ZuSGShlAyQuRs3vMD-wsjPpHuLqXCqiDq5z5keQKSvGkbHW4MX9p_R7H-9eY7m9IT3jxGZWkt488ZgkOSMAFqyojOnpTqEC4iduB80Yjc1hihHblF8qYqWh5wKFokXgC1nixAYMY)

Ahora cree el Flow tasaDeFlujo entre las dos acciones, usando el modo de dibujo de AnyLogic:&#x20;

![](https://lh3.googleusercontent.com/3M0Mo0QkUCGEztI5lvrGWZU2zl9Wt0cU3p7Ou8l5BqC38oOLb2nuY4v25Espt0YpIAU7k73S1mT_fyDNo6D3F-xWvnIk4X-Pv-V5BVdiQZxTqARQULqZZrD1lmFCOEZax1KKzAKe)

**Importante**: para estar correctamente conectado, el inicio y el final del flujo deben estar conectados con los centros de los respectivos bloques de stock. Esto se identifica por los puntos verdes en los extremos (cuando no hay conexión, AnyLogic crea una pequeña nube):

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

Tenga en cuenta que el elemento **Flow** es altamente configurable. Por ejemplo, si quieres crear un zigzag o incluso quitar alguna esquina del elemento, simplemente haz clic en el bloque y aprovecha los nodos que aparecen o haz clic de nuevo en estos mismos nodos, para que la esquina desaparezca:

![](https://lh6.googleusercontent.com/Y0LYig39AAQeUW7M9HGWf0nXTkUzNnTGorFOKhZd8M9EoGgN-_f9lBkecBvmlvwuNmclscD-X0ylNIYVeEHt2JSadFh3OPhGgpxxMyMk7IXpoTaaIiT0gtCecuoazIRBQ3bZH5X0)

Recuerda que la aplicación no comienza con cero usuarios: usted, sus empleados, mamá y papá inician sesión en la cuenta, por lo que el inventario de clientes comienza con un valor inicial igual a 10 clientes:

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

Ya se parece un poco al diagrama de flujo y stock, ¿no??


# Parámetros en AnyLogic

Hay valores en este problema que podrían considerarse como parámetros a ser llenados en alguna interfaz o, más específicamente, **parámetros de entrada del modelo** (datos de entrada). Son fáciles de identificar:

* La población total (o el número de clientes potenciales al inicio de la simulación);
* La efectividad de las acciones de marketing y el número de meses de inversión en marketing;
* Tasa de contacto con el cliente y probabilidad de conversión.

En AnyLogic, los **parámetros** son equivalentes a las **variables**, pero con una diferencia: los parámetros se utilizan automáticamente en la interfaz de entrada del modelo. Esto se aclarará pronto, cuando estemos jugando con experimentos, por ahora, creemos los **parámetros** necesarios usando el bloque llamado, sorprendentemente: **Parameter**.

![](https://lh4.googleusercontent.com/aFGpRHh_ykO0T9L1IxjfJ1kl5IuUcfizizNOxBEk39f0M6vQHTTbPXPvcmBnnNNSPcU3vrfOxv_hraTitmT7yqHE3r8QuHUH619lxjrs8pR6CkJAGFpA7VE7qLqJEg_ZO9KxUnFj)

Como un parámetro siempre son datos de entrada, es una buena idea asignar algún valor predeterminado. Asigne el valor 5,000,000, a través de la ventana **Propiedades** en el lado derecho de la pantalla:

![](https://lh4.googleusercontent.com/jvNzTasxF4TyVb37y82qhY4i_YXmzmVii-ckjuwYIe61JuzRTUG65m89rKVmYtDgXC6SY3ttf-cmK0v3w-9s_W7oOdPS3GFN9DI7iMylf1DvZXw2vJ5uYe84f7MdwZSofUNt-whk)

Con el parámetro creado, debe construir la conexión entre **populacaoTotal** y **ClientesPontenciais** a través de elemento **Link** de la paleta de comandos:

![](https://lh5.googleusercontent.com/GXofsylgZgVmH6Mlx6_F9Fnx6RsORgyVa_InyG_buQ7kRtjg7-GfXVziLXyqxKvHYLTps_zdAI7pVFaVmPdnpBYVyUQTswwLTgMvdQGyfYHeKeSUYBK5Kb8ShELh-LTxHDw2TV7M)

Note que el **vínculo** está representado por una línea discontinua. Esto indica que el enlace creado termina en stock.

**Atención**: no equivocarse al construir el **Link**: los extremos siempre deben tener pequeños círculos verdes, cuando se seleccionan. Vea el ejemplo:

![](https://lh6.googleusercontent.com/roLl_J6nQHqsNVTtupAHsyfjOA6BBR-p_lqqJ5CvT0_ekMjgg7K0zP5KKkOtqVI-tbXR93Ot_ElGzNxzf43XBcQ5pF4A9sZjkMAnpWWAYIyD27gnLfn2ut5MT3dRQagNtOGCExCi)

El último paso es asignar el parámetro **populacaoTotal** al valor inicial del inventario **ClientesPontenciais**. Nuevamente, la ventana **Properties** del bloque de valores resuelve el problema y simplemente escriba **populacaoTotal** en el campo **Initial value**.&#x20;

Pero primero, tengo que presentarles el acceso directo de AnyLogic más importante, más utilizado por sus usuarios y que acelera el tiempo de desarrollo: **Ctrl + Espacio** (en Mac, use opción + espacio):

<img src="https://lh4.googleusercontent.com/YY8k5cu3qVea4kncT2lYhJqVVwnrHubRer7XwctSZEf6H8da0xiQ2WIaIA3nHhxXJE6GXjuB7xAvTscfatZGKusCYrBAJNvzd-QDLyD4X9fBeiOctBN3ERYy1b3QIldBuz973tNc" alt="" width="188">

* Escriba, en el campo **Initial value**, sólo una parte del nombre del parámetro: **populacaoTotal**;
* A continuación, mantenga presionado el Ctrl botón (u opción, en Mac) y haga clic en la **barra espaciadora**;
* AnyLogic trae todas las opciones que contienen la cadena escrita, incluido el parámetro deseado de **populacaoTotal**:

![](https://lh5.googleusercontent.com/IvU8GySURxFl4OOUhE4WVh093QrnV17V7DEhdAK-Klb3Nv9yEV-ekYUmbV7n_VmbQZrE54sAAyvvbd8MdP4LJQ2IHZZuw6bikXMPRvOS53jRrVVs8bJKwcPOG42AWhyfflr9vs7m)

Importante: a partir de este momento, siempre que complete cualquier campo de valor en AnyLogic, acostúmbrese a **Ctrl** (opción) + **Espacio**. Además de la velocidad, el comando evita errores tipográficos, estos sí, que ralentizan el desarrollo del modelo.

El siguiente parámetro que añadiremos es la efectividad de la inversión en marketing, **eficaciaMktg**, con un valor por defecto del 1,1% mensual. Cree el parámetro con lo que ha aprendido hasta ahora:

![](https://lh6.googleusercontent.com/uycN2H9IUOU8_OKS0xwFRqPZfOY7d6pdLhuM8NYnXegLJnGUaTEThFMJ8wtv5_ouGjn-kQcvWECcskD52FjEK5YC0O6PCZIBoy-iFPB2UgmH6Sp3To_GVt31De-TRBXZCwB5JAIX)

No olvide asignar el **Default value** parámetro el valor **0.011** (equivalente a 1,1% por mes):

![](https://lh4.googleusercontent.com/AbLpEeOrTxAplIoctcPwui9z_mFFtuJ8jfXIJBNp_wufEcPdhwfph3GdAxKCWr1RlE4r2X1vQT4kb1HtD1BOKUqf7EmgeCh5eMg4clYpqoJ_spRkpcvSfd37DkYjQ3ap_xzmUlbW)

El siguiente parámetro es el número de meses de inversión en marketing, **meses**. Haz como en el caso anterior y, como aún no sabemos cuántos meses serán (esta es nuestra variable de decisión) asigna el valor de **6 meses**:

![](https://lh3.googleusercontent.com/7AT5B7-ABj1KvzQbzHDI5ojJHAG8jGFHCTBjhX_3_kyWJdyh_Hw_9Tor0vxjlA97H-YDzLsD8QrpT3lPuZcVTdaMNCl1YpwjMEaNf4tYQ3C1RNMRU5v0Aop-lFDpzWituaYlB8-Y)


# Variables dinámicas en AnyLogic

Ya tenemos los stocks, flujos y parámetros. Ahora es el momento de **las variables dinámicas**.&#x20;

Las tasas de conversión de clientes por marketing o el boca a boca son ejemplos de cálculos que deben realizarse de forma dinámica, es decir: a medida que el número de clientes potenciales disminuye y los clientes aumentan, estas tasas deben volver a calcularse.

AnyLogic tiene un tipo de variable específico para esto: la variable dinámica. Creemos una **Dynamic Variable** para la "conversión de marketing" llamada: **conversaoMktg**. No se confunda: una **Dynamic Variable** no se parece como el pequeño pedazo de pastel de un **Parameter**:

![](https://lh4.googleusercontent.com/xtnxLX4J5M5tnAkGCuPWGSDELm4XN7DYEJbfXT1iUYQgnWASKP6k84hcRdwYSlFzZ9fIHX5tO7xl_RNM7ljLfeOBqzzEiy1XHqyxOYSlPMxx7A4xn9ES5zLIleWl_uWahFNmQx4w)

En los modelos de dinámica de sistemas, todos deben estar representados **vínculos** los existentes entre acciones, variables, flujos y parámetros. Así, con base en el diagrama de bucle causal, cree los enlaces entre los parámetros utilizando el **Link** de la paleta de comandos:

![](https://lh6.googleusercontent.com/vTVC-dmkXkiyXmhm8WettjMSHJYe_AcTNSeGyYMHk3Dd7_Iit4H5RSq1JtoyflxtkR7_13uD9DSFs-XCe9TzkQz2lCJ5dyeQc-CXb0hB0mCJBz0E1MzIcQKvOlLFkuFGRrQzMv0Q)

El elemento **Link** tiene su señal como una propiedad, así que haga clic en el elemento respectivo y luego en la ventana de **Properties** en a la derecha, seleccionamos la señal respectiva del **Link**.

![](https://lh5.googleusercontent.com/KPWcRjQ_CXV7ZqVVWSufjXOKFaffvDNp9JQUy4ifUp4BbyzxRP7TYjy9qoKBHjS5q6cVKEPPxTPA3LDOwS_BLLDR1IPQs2agQxp1lv0aR5pmYpLeNyo0EywDoBFQQ-2DY7B4XiQf)

llegamos al momento de construimos la ecuación que gobierna la variable dinámica. Click en la variable dinámica **conversaoMktg** y ubicamos en sus propiedades, un campo con el título"**conversaoMktg**=".

Queremos la expresión que devuelve el número de clientes potenciales convertidos. Sin embargo, si el número de **meses** de simulación es mayor que el parámetro de meses, la conversión debe recibir el valor 0.&#x20;

En AnyLogic,la función que devuelve el tiempo de simulación (en la unidad de tiempo del modelo) es **time()**. Entonces, necesitamos algo como:

*`si`*` ``time() <= meses`` `*`entonces:`*

&#x20;    `conversaoMktg = ClientesPotenciais x eficaciaMktg`

*`de lo contrario:`*

&#x20;    `conversaoMktg = 0`

Tengo buenas noticias: AnyLogic tiene una forma de manejar las condiciones "si-entonces-otro" similar a lo que usted posiblemente haya usado en hojas de cálculo:

`“=SI(condición; caso verdadero; caso falso)”`.&#x20;

En AnyLogic (y Java) utiliza el signo de interrogación "?" para la pregunta y los dos puntos “:” para las acciones:

`condición ? caso verdadero : caso falso`

Entonces, en el caso de inicio, simplemente ingrese el campo de variable **conversaoMktg**:

`time() <= meses ? ClientesPotenciais x eficaciaMktg : 0`

Aunque ya puede hacer esto con **Ctrl(⌘)+Espaço**, en este paso iremos al revés: observe una pequeña “x” roja al lado del campo, AnyLogic está reportando un error en el respectivo campo (e incluso puedes adivinar qué es):

![](https://lh3.googleusercontent.com/HR1CHkORjFU2TjQXP33Z3PBY68uigHkmJIz6I4WB1-rCromaoZvHcNIkfH0MZRvht0ZkO_6fwdQeOlAlMOvudulvwPg_4ruYTPqihoi3bQB2kluVkCo3k20ak2FazS5RiTf0dfRP)

&#x20;En este campo, AnyLogic esconde otro facilitador que acelera el proceso de desarrollo:

* Haz clic **dentro del campo** con un problema (clic **haz dentro** del cuadro);
* Debe aparecer una "X" dentro de una bola roja (que recuerda al símbolo de X-Men). Haga clic en él y observe que AnyLogic presenta una lista de opciones: o agrega una variable / parámetro / stock que está **Link** al elemento actual, o simplemente elimina el **Link**.

Por lo tanto, configurar la ecuación fue fácil:

![](https://lh3.googleusercontent.com/n1IQEeVMlsZiZeRrrIoKYxufDA6q_ZP8w1m1_21V5SMLT-a5my2wO1m_btitwpiHtNuZW6UyG8uaOYTx9APnSao3CnXllXCDdlhYwiwHpqYBdWL1FFiobcYiV1p085HASatHWprT)

La resuelta **conversaoMktg**, pasemos al flujo **taxaDeConversao**. Tenga en cuenta que tiene un **Link** (procedente de **conversaoMktg**) que aún no hemos hecho la ecuación:

![](https://lh3.googleusercontent.com/RcD7K7HweGGg5QMBKwio_arwq1r9bJilgewha2CxHXxQcWi1xcWBogcPrg_BpC1Q9gNxMIcy6SfhnVbj6-8bdflr9d_s-inwB1DZg5w2ugwSVW5JC_wBqrlvE6lZSMzaPcPzV-V8)

Listo, ahora puede… ¡SIMULAR!

![](https://lh4.googleusercontent.com/IC2PR48PBI-RsimYboFJOZQ6A0krD8zIeLhlSetcfDbzImFaS6_wP16rsuDZqun8iqXWuGBg1Ngqqu1DMiBh6Oe5xvvx94_5is22e70oVw4ztGV-XIPlcwg5hX9aZHTvg7BVxgK6)

Si desea acelerar o ralentizar la simulación, use los botones en la barra inferior de la aplicación:

![](https://lh5.googleusercontent.com/C6DfnLo1QfzD5ihbAZqXUhtRM3q4_BU552FCZCbLFOwZn27HKbB_NkgsVdo0TlEmuwuoJQf3SOCPbi_hrjXIV2Mitv72EHij2pkfzkgnRIdBCAMkaK6nV9rAR-j1Mwy3kAVb9T7W)

Si todo funciona, el flujo de personas desde el stock aparece **ClientesPotenciais** de durante los **Clientes** primeros 6 meses y luego este flujo termina. Pronto aprenderá a controlar la duración de la simulación. Por ahora, continúe construyendo el modelo, que ahora representa el ciclo de conversión de boca en boca.


# El bucle de conversión de boca en boca

Repitamos el proceso de construcción del modelo en el otro lado (Clientes), pero usando otras capacidades de AnyLogic (incluso para acostumbrarte, entender AnyLogic como un software abierto, en el sentido de que cualquier cosa se puede hacer por 2 métodos obvios y ~~8,695~~ varios otros no tan obvios, pero que se vuelven más fáciles a medida que aumenta su conocimiento sobre el software. Normalmente lo llamo “software de bordes infinitos”)..

Empiece por crear los parámetros de **taxaDeContato** (**Initial value**: 10 personas / mes) y **probabilidadeDeConversao** (**Initial value**: 5%):

![](https://lh6.googleusercontent.com/RS1hfadRrncGUELFo-8QGRxNadjnqs5SAw1K2E14DY72Yy4X6khjeLSs4dkAK_tGZDZ5GpbOSBN_dM8zgF0_cNjI82pd2oXEheS3ujyeYWHy9TgwCubM9Zuai6luANS6Mi_vMBnL)

Continúe el ejercicio creando la variable dinámica **conversaoPorBaB** y cree todos los enlaces necesarios. Con lo que ha aprendido hasta ahora, el modelo debería verse como el de la siguiente figura (la imagen se generó con **Zoom** en 200% en AnyLogic y yo esperé momentáneamente los **Links** solo para facilitar su trabajo de verificación):

![](https://lh4.googleusercontent.com/8LPKJbD5OqNfl5JMSGcH841wxTkhBpz9F2mMbzj9FmtvjP8ALlsGJ-QuEXjY2kEA54bU3MQ07Lkb14K8LLw3b9SpfNg_ryRrVadfDGi4bxELrabw261FMb8uIqON5UXsCQE38qdK)

Ensamblada la estructura del modelo, es hora de escribir la ecuación de la variable dinámica **conversaoPorBaB**:

`Clientes x taxaDeContato x probabilidadeDeConversao x ClientesPotenciais/populacaoTotal`

Siéntase libre de construir la ecuación usando el comando add (de la "X" roja) o usando **Ctrl + Espacio** (hey, Sherlock, ¿puedes notar las novedades que te muestra el siguiente Gif?):

![](https://lh5.googleusercontent.com/6K1-iRH4apq-fHJyk35MfmoPRzphcy8Mek7NRR5gSjTCNyfANWSAG80OE6b_e9H4eK5oPJ6MMqIXC-DzH2Bqs9ShR--TCnPXnSkdwfhON0lOYBkzSQQaeBdF3Dwi4zR4Y-5Dqyth)

Exactamente, Watson, no tienes que preocuparte por el pequeño espacio para escribir la ecuación, ya que Java (el lenguaje que estás usando y probablemente no lo hizo ya sabes) no tiene una sangría rígida (algo que desencadena a la mitad de la población mundial, dicen).

Para cerrar la ecuación del modelo, todavía existe una conexión entre la variable dinámica **conversaoPorBaB** y el flujo **taxaDeConversao**. Elija uno de los dos métodos que se ven (por la "x" roja o creando el enlace) y complete el modelo:

![](https://lh6.googleusercontent.com/mvEdjbmncJKwEak7NYoWne6zolO5qXHJKBQoDtEREbNRRLmBnU9I3_rbT_piXqsy8dFrlff7I9pal0e_2Dxrt_ckEx7reci5ZoB0krO01xu9KzlPNmRd-vhhC6Xgz6e4QSKoPXk4)

Y llegamos al último y último paso: colocar los marcadores de bucle de balanceo o impulso:

![](https://lh3.googleusercontent.com/yrkB3IlCYtXAAh0U6gzGKx9vUy-fMXoaOS0-LMgUI_PducmFmgNOSDsnrqMAqHU0q6G6ivuGY4CiAMCwjIb6G-38HtTRtILsH3j8v4JCMyULC3yXTDH0kwv95KoV-Ovfw81qORuy)

{% hint style="info" %}
Para AnyLogic, estos marcadores no tienen ningún efecto, son solo para fines de visualización.
{% endhint %}

¡Listo!

¿Listo?

**¡Simular!** :woman\_astronaut:&#x20;

Ahora está ejecutando su primer modelo en AnyLogic usando el botón verde en la barra de menú superior (haga clic en los elementos del modelo, ¡están llenos de sorpresas!):

![](https://lh4.googleusercontent.com/K34nP6fenfiM0GbFXQIuxgijjt6nxTMwE7XkTisrF6JRQZjAEizQTWvlJ1ummT8LwhQWgLDm1izU54ghQdXznBjOpf9FPM56VzWJQaXD5B8Bud5V71iXnIDxR6BwSS9TOvwgXC5e)

¡Ya tenemos un modelo que funciona! Agreguemos algunos resultados para que podamos ayudar a nuestra StartUp a decidir cuánto invertir en marketing.


# Creación de resultados del modelo: tiempo

Agreguemos inicialmente dos gráficos a nuestro modelo::

* la evolución de las existencias de clientes potenciales y clientes;
* La evolución de las tasas de conversión por marketing y por el boca a boca.

Los comandos de recopilación y análisis de datos de simulación se concentran en la paleta **Analysis**:

![](https://lh5.googleusercontent.com/S5NCvewNuPB-Eji7YnSkjYvZBgaCWVTeoAchx1MvZgncKGmPaYw7bmqWyGSNCj9_Jx57ydrU8x6MCI9YKisVHl8AfQjMUy1tn-sn0Bm5KZarN8uUR1IVG0qsnNRJIR0fPTlYu9p5)

Los gráficos propuestos se componen de curvas de evolución a lo largo del tiempo dado que, AnyLogic tiene un elemento listo para usar: el **Time Plot** (gráfico en el que el "eje" x es el tiempo simulado). Haga clic y arrastre un **Time Plot** al lado derecho de su modelo:

![](https://lh6.googleusercontent.com/JZfG37kJ0yHHcFqs0uC5Obd7ZpKYQe__sMh_rNXeU1cBKjFPXPXyTwV5ZH4reZseGbDiD_o3IeB2GnGcRNSF6aKBAiPonxaqZHUZ1grh6T4kGvO9TIruLcGJhDAO9Bq485m8EIau)

Gráfico del primer gráfico mostrará la evolución de los clientes potenciales y los clientes a lo largo de la simulación, con la ayuda de **CTRL + Espacio** no debería encontrar ninguna dificultad para completar los campos de datos:

![](https://lh6.googleusercontent.com/BOHrFEVrifSO-_9SQdkzgAOqny9eYDWm55x5l-OoezcAzsdDDFJgSnsVvaFGFnRiFLKpIr_mBBaOTPBGUUnEfgacgnF7GvEFavNaZWgCtkhmiz5FvRH0A-D8MabSQen1SVRYzJ-F)

Hay algunas propiedades del **Time Plot** que siempre debe conocer:&#x20;

1. Cómo se recopilarán los datos a lo largo de la simulación: automáticamente mediante AnyLogic o mediante algún comando específico llamado por el usuario en el modelo;&#x20;
2. Intervalo entre cobros (si la opción elegida es el cobro automático);
3. **Display up to:** tamaño de la muestra (si el tamaño de la muestra excede este límite, el primer valor recolectado se descarta para dar paso a la nueva colección);
4. **Time window:** rango máximo del eje "x" (en este caso, el lapso de tiempo máximo del gráfico)

Como este modelo es sólo 40 meses de simulación, le sugiero que cambie el **Time window** de 100 para 40 (meses).

![](https://lh6.googleusercontent.com/hiLLuyuXabOZFYUPTPg7c9Fvd-TVrvA_bJQ0TLx7c7MpcInlh86YId8D53H-UuHBBu9rxwYn95AnHt8vr43loFeeAgmj02xNZ2oRGDKV95qVJmLfNIVgDLuqmlhADU3GuIvnY8iY)

La parte inferior de las propiedades del gráfico le permite establecer colores, leyendas, etc. A menos que quiera algo muy diferente, normalmente nunca me muevo en esta región.

Disfrute del impulso y también cree gráficos de **Time Plot** de la evolución del marketing y la conversión de boca en boca, a través del comando de copia rápida: mantenga presionado el botón **CTRL** y arrastre lo que desea copiar:

![](https://lh3.googleusercontent.com/ODlNBft3eb_Zrszzd48skKmEalVsn_6HwbLxRch9Yw3Sr02IoflAVbSUygyveWvk_Ek-7Xim7onj8pLNGxHU15DpKZ7AF_2rKLkCz-f8GSPDfcmTYlo9fKGOp2ONgMs1yeJ57KTi)

Complete la información en los campos de **Data** y célebre que se copiaron todas las configuraciones del gráfico (colores, leyenda, tamaño de muestra, etc.).

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

¡Simule para ver cómo resultó! :woman\_astronaut:&#x20;

![](https://lh6.googleusercontent.com/faCY13EOCfKesdoi4RWQIkCda6uYae-SCoGxyo8pTGRHhk7jY7yvMgyos6FQPqf7edhYMiLOG8tEVG7WRRIfxogIj56hIChGEJtomGZaYvPTfsx6gEgh18GqlNCxWBR-zueBYQKV)

Incluso la cosa empieza bien, pero cuando pasan los 30 meses, más o menos, la maqueta se dispara a la nada. De hecho, estamos simulando sin limitar el tiempo total de simulación y esto dificulta la visualización de los gráficos (pero no invalida los resultados).

Para evitar esta dificultad, podemos configurar mejor nuestro **Experimento** de simulación.&#x20;

Usando la pantalla izquierda, seleccione la pestaña **Projects**. Verá un navegador con íconos apilados, como carpetas: los botones rojos con la figura de palo que representa a los **Agentes**; y el ícono azul con un **xis**, que se asemeja a una insignia de X-men, representa un **Experimento**.

![](https://lh3.googleusercontent.com/dUk60ci2Pe0IWHd4g7kADNMiOuPBF0HjQY-QBRcwdGtJoLjqwBp5TS8M3P-teIe4Fc5EgCPK_L1VekZepdu5zsxFxwW8v2E9ci_R03UZijcsKyTTcjWP5bw18aCj_J-Jov_2opI3)


# Qué es un experimento

<img src="/files/-MSGIuWljQRXK1wyqRM0" alt="" width="188">

Cada **experimento** (o **Experiment**) almacena la configuración que se utilizará en una simulación y puede crear, para el mismo modelo, tantos experimentos como desee. Al crear un experimento, el usuario también puede crear una pantalla de bienvenida para el usuario y definir valores para parámetros importantes para la simulación, tales como:

* La duración de la simulación;
* El número de repeticiones;
* La semilla del número aleatorio;
* El tipo de experimento, explicado a continuación.

La versión **PLE** permite la construcción de 3 tipos de experimentos:

* **Simulation** (*default* de AnyLogic), que ejecuta la simulación con animación gráfica. Tenga en cuenta que no tiene control sobre las replicaciones en este tipo de Experimento;
* **Parameters Variation** pue permite simular varias corridas de un mismo modelo variando uno (o más) parámetro(s) (en este ejercicio, un experimento de este tipo podría ejecutar la simulación para una tasa de contacto de 1 a 10 clientes/mes, por ejemplo). Además, la **Parameters Variation** le permite limitar el número de repeticiones, que puede ser predefinido por usted, o identificado por AnyLogic, para alcanzar el intervalo de confianza que ha especificado en la definición del experimento;
* [Optimization,](https://youtu.be/3pM30wQfxV8) con configuración de funciones objetivo y restricciones (construidas a partir de parámetros del modelo). [Veja o vídeo how to](https://youtu.be/3pM30wQfxV8):

{% embed url="<https://www.youtube.com/watch?v=3pM30wQfxV8&feature=youtu.be>" %}

Otros tipos de experimentos, no disponibles en la versión PLE, son: [Calibration,](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/calibration-experiment.html?cp=0_11_4) [Monte Carlo](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/monte-carlo-experiment.html?cp=0_11_6), [Machine Learning](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/rl-experiment.html?cp=0_11_8) e [Custom](https://help.anylogic.com/topic/com.anylogic.help/html/experiments/custom-experiment.html?cp=0_11_9), permitiendo este último la combinación de diferentes tipos de experimentos.

En este ejemplo, vamos a establecer la duración de la simulación en **40** y esto es bastante simple en la ventana de propiedades del **Experiment**:

![](https://lh6.googleusercontent.com/xD7C6-JhrAlosRrqOVrLipKXk3AdxKxsf1-uUHzUbrGPLVISpJBC2vHxZWGIdytbP67qMYvjr2lPlGmkZfaImr4X5LiWs-l0W1_zyiIjDhCM0Sh7XM_KKmzAj9CyaAS_RbMbyPzq)

Ejecuta y observa cómo el experimento ahora termina en el tiempo asignado.

Otra característica interesante del **Experiment**: omo los parámetros se consideran datos de entrada, crea automáticamente una interfaz de datos. Está en la pestaña **Parameters** en las propiedades del **Experiment**:

![](https://lh4.googleusercontent.com/tD534Q428jDGtZdQq8rWZ9jkCra-c-VG-ks8NOOZ0f_vwXUEiW10KP8Ij7itDgway_q9lujuKWIWfqsNTOxeCyb1-Xs-7CdZJcMfD40hznWkSeCmggqnPnwjveGy0n8O5IbhdqPY)

Antes de concluir, si regresa su atención a la ventana de la izquierda, debe notar que el nombre del modelo tiene un asterisco al lado, lo que indica que su modelo aún no se ha guardado. Para guardarlo, seleccione el nombre del archivo y haga clic en el icono del disquete en la esquina superior derecha del menú superior de AnyLogic.

![](https://lh3.googleusercontent.com/4V9zKnnLpUpxAvLuoEzCAaVLEa9fSymAeRDsXdQl08xUH3kqXi9ei5S97vIBKHowtOGLCSP3kP7oQdLZbjGAGbR1UisYQEUe9deEIkdbn9tPg-pPr6ElLys8NwZ55bCrvj8yz_t7)

\[¿Se acabará la luz? ~~**llorar**~~ AnyLogic tiene un autoguardado cronometrado.]


# Experimentación con modelos: la dinámica de la adopción de app

Es notoria la facilidad de los modelos de simulación de dinámica de sistemas para explicar el funcionamiento del sistema a partir de la interacción dinámica de sus mecanismos de retroalimentación.\
Partiendo del escenario base, si todos los parámetros adoptados son correctos, el modelo predice el siguiente comportamiento para el sistema:

![](https://lh3.googleusercontent.com/5zhPXomkIW9wg1vEK-hKY_yV1CM85yBGDhtSWoMQHytbTIvL5dvKth3q-zNy3lf7xAWKmKWwv8v52X5mFEC2QJXAHN1LO2ot4kiYTg2U37yOAq2oN4WMoWpUclH25rJx9hoOBatu)

Según el resultado anterior, después de 20 meses, todos los clientes potenciales se han convertido en clientes. En los primeros meses la conversión estaba impulsada por las acciones de marketing, pero cuando comienza el proceso de difusión boca a boca, la conversión de clientes crece exponencialmente, alcanzando un pico cercano a los 620.000 clientes/mes en el mes 8. Posteriormente, la conversión desciende, ya que el ratio “clientes potenciales”/”clientes” (o la probabilidad de encontrar a alguien que aún no es cliente) empieza a disminuir y, por tanto, de poco sirve invitar a tus compañeros a darle like a la nueva app si ya la tienen.\
El resultado anterior muestra que la fuerza de ventas cuando un producto se vuelve viral supera cualquier acción de marketing. Con eso en mente, podemos simular un escenario en el que StartUp no gasta un centavo en publicitar el producto y, de 10 elegidos al inicio del proyecto, logra el mismo efecto de se vuelve viral.&#x20;

Asigne el valor 0 al parámetro meses y simular:

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

¡Vaya, los resultados son muy similares, excepto por el "retraso" en la curva de conversión que ahora sólo alcanza su punto máximo en el mes 26 (o 18 meses después del escenario en el que tenemos acciones de marketing involucradas)! (¿Ves el signo de exclamación? ¡Impresionante!)\
La conclusión es que realmente necesitamos una inversión de marketing al comienzo del proyecto (y es posible que esté pensando en un análisis de sensibilidad para la tasa de contacto, los valores financieros, dónde firmó, etc.).\
Antes de firmar nada, ¿no sería mejor si estos valores se pudieran exportar a Excel y los gráficos y escenarios se guardaran en algún lugar? Eso es lo que haremos en la próxima sesión.

{% hint style="success" %}
Comentarios

* ¿Quiere darle vida a su modelo con algunos controles geniales en tiempo real? vea [¡](https://youtu.be/pd8QMBL-ri4)[este vídeo!](https://youtu.be/pd8QMBL-ri4)
* ¿Qué tal estudiar lo que sucede en cada parte de su modelo a través de registros creados automáticamente por AnyLogic? Estás a 5 minutos de aprender esto en [este vídeo.](https://www.youtube.com/watch?v=jVkDkXsTIHI\&list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3\&index=22)
  {% endhint %}

{% embed url="<https://www.youtube.com/watch?v=pd8QMBL-ri4&feature=youtu.be>" %}


# Exportar y ejecutar el modelo en la nube pública de AnyLogic

Para realizar un análisis de sensibilidad del sistema respecto al comportamiento de la conversión boca a boca, aprovechando que ya disponemos de un modelo de simulación de difusión de app, basta, por ejemplo, con ejecutar el modelo para diferentes valores del parámetro **tasa de conversión**.

Para estos casos, AnyLogic tiene un **Experiment** específico, llamado **Parameters Variation** (o solo **Variation**, cuando se ejecuta en la nube), lo que permite simular automáticamente diferentes escenarios para variar uno o más parámetros, dentro de intervalos definidos por el usuario.

Tal experimento podría crearse desde el menú. **File> New > Experiment**, pero haremos algo más genial: ¡lo subiremos al cielo! Esto es, [en la nube del AnyLogic.](https://cloud.anylogic.com/models)

El proceso de llevar el modelo a la nube requerirá que:

* Ejecute el configurador de la nube en el modelo;
* Seleccione los parámetros de entrada y las salidas del modelo (¡AnyLogic Cloud creará una interfaz para su modelo automáticamente!);
* Cree una cuenta en la nube AnyLogic (gratuita) si aún no lo ha hecho;
* ¡Ejecuta el modelo y ve si todo funciona, antes de enviarlo al grupo familiar en zap!

El configurador de **AnyLogic Cloud** es una pequeña nube azul en la barra de Proyecto. Haga doble clic en él para crear los campos donde definirá los parámetros de entrada y las estadísticas de salida de su experimento:

![](https://lh4.googleusercontent.com/26g6j9SQc7zdC1G0vJFJ9HrMtg3l_e2MQGmCdeTR9XRj0ZVm45BLZFeMGxNdbgX9-w2gC0mp917d9OI4n3a51NDFKY7lLaTQAOYSyzVkHdSbv03Ha-W3w1oYabqMXwH3fjFIZYN9)

Seleccione, en la pantalla siguiente, cuáles son los parámetros de entrada (**Inputs**) y las salidas (**Outputs**) del modelo (haga clic y arrastre o haga doble clic si tiene prisa):

![](https://lh4.googleusercontent.com/8rDPz3czLZ88qg_1wJJKcMV-NXdpA1-vTLsfI9KkBcMREQDaTOl0xzOGXEQJkeMyOz0GCryjNSL3I-qhK4wfyWZspu1-hzCTVW8UK52QN7zxNNYMoUsU8sRO4bO5X6jajvOrvFRi)

Tenga en cuenta que AnyLogic ha "corregido" automáticamente los nombres de los parámetros de entrada (siéntase libre de corregir el acento):

![](https://lh3.googleusercontent.com/U62KmyG-KppHA7LkcKmjr4i944S-tnHD6YXUfaZ5riKM1HiUMftnU9KWrk3YZGy7dMIGTMWdyqEff_sL5tHTcKCrwFoH1C4yoXKQUR0t3Q9ZswN6HLnTAYJUGw1pfnNI8lCUE6zT)

Antes de exportar el modelo, preste atención a dos cambios en la ventana de propiedades: defina el tiempo de simulación y el criterio de finalización de la animación:

![](https://lh6.googleusercontent.com/DLfNvQwT_LhsuH_b_7CDJn7b71FebhP5ZgW_GXLuH_s-VROgMgkkxnfxB_OLZDvkyKJP4BYinMUy2xTm3IjGIfjy4Q5H-2OD2Eo0udUQD6OpNokmiaLK2gpqx7vsP8BrUATflQtb)

Si llegaste hasta aquí, hay un enlace azul **Export model to AnyLogic Cloud** en la parte superior de la ventana de propiedades:

![](https://lh5.googleusercontent.com/vWZMxZLXHJzXYD3h_UAPdrcRP3GZhkd-ydJSC92dSkxbkz5CszOqPt65wo3xaHh9sxXdHC3wuFNuF2WvN7EH4VCF7FBivTK2aMCt8-baoIdavNudRrcdVCCgeMxeJNVkFHj_xTQj)

La primera ventana debería pedirle que cree una cuenta (¡use sus cuentas de redes sociales!) o inicie sesión en su cuenta si ya existe.&#x20;

Las siguientes pantallas se explican por sí mismas:

![](https://lh3.googleusercontent.com/E97aZediW1lRsBMzTL2w32Omu05lYWV7uMocAurKdNs8PcuyYVHerIejiU5ThfLAs-3WA-k1HGEiG1z0YL38LUZVp9bYTCRWJjUXRW47SfLHtSoWIWoi18d2n1nHP65PcB7eT_p3)

Después del final *upload*, ¡AnyLogic debería abrir su navegador predeterminado ya en la pantalla del modelo listo para ser ejecutado!

Mirando en la esquina superior derecha, deberías notar que estás en una cuenta **Guest**, o sea, faena AnyLogic no ha iniciado sesión en su cuenta. hacer el procedimiento **Login**:

![](https://lh5.googleusercontent.com/X-V8G5X0gpYt_QXynaoMcT1UVeF7Nm5isfLV3R_lS4ruJ5bJFzLW7dyiKHIVtc3y6r7FfllKdmZWiTmHkHeKo2ag7CJcsA6ZCSlw00mi7r2vWDEofOtbF_Wex-BKg2tnpYJ0z0jl)

Inicialmente, solo tenemos un experimento en la nube. Vamos a ejecutarlo seleccionando el **Experiment** en el lado izquierdo y haciendo clic en el botón **Run** na barra de menu superior:

![](https://lh4.googleusercontent.com/pi9xpiqOslwMk_ICYBbk4XqKwZkd-CvzLhmScnoigSuPOmTCXYe_NyCl3UyV0YtJ-An1UmWyvVTt5Xmh9HJRU4qCTr8iiA1uc5YeixrRRLr04yAnBBMZoArSu4_xn8ElcXtybi0Y)

AnyLogic Cloud, incluso en esta versión pública (la cuenta gratuita no permite almacenar modelos en la nube de forma privada), permite crear nuevos **Experiments**.&#x20;

Crearemos un nuevo experimento del tipo **Variation**, que permite simular varios escenarios a la vez, variando uno o más parámetros. Para ello, sigue estos pasos:

* Crear un nuevo experimento de tipo Variación y asígnele un nombre apropiado, como “Variación de tarifa de contacto”;
* Editar el **Dashboard** deste novo experimento: el parámetro de entrada **Taxa de contatos** debe ser cambiado en **Edit box** para **Varied in range**;
* Salva el **Dashboard** creado.

Cree el nuevo experimento:

![](https://lh6.googleusercontent.com/bdESH1kjW7YCJy84aXA0yOPcMmQ5G7lj-jiIeeyuopMDwu2qJdGxnXefR6wDEMKlpBDIXN9cysUzUPGfcd55lAfWqHh7M8zp1SOzcVbQmiX6a3BnCXArh760dg9OA7Ve1QGXs2HG)

Edite el **dashboard** (¡guárdelo al final!):

![](https://lh6.googleusercontent.com/aovT5XLB5Bx05eXew-YGH967L-pmA1XVjdVxoyavlxiAI1uN_opcDKMrO6izrMbDxjfne0wgmNenIYRZsa-IG6VBm0cAc0yRSc3aRi1UaLxhglDdJuIIHE6bQX8zqgvE_XqiwUcA)

Para abordar la pregunta del problema original (cuántos meses de mercadeo necesito para que la base de clientes en los primeros seis meses sea mayor a 1 millón, variemos la **Taxa de contatos** de 1 até 6 meses y corre (tenga en cuenta que las simulaciones no se realizan en su computadora, sino en la nube de AnyLogic):

![](https://lh3.googleusercontent.com/IAE4hBmKZLhJjQN7nPd5_tHOiPohwblD1f83_x7MWTKPZ_2VkK4A-3ASEL1MU6FFXQkF1Nx0Va_THEG46lJG_0BQ-CJBErA1j82pJGyKPw_qAtT88vDLJVq7BckiHdT-HnxyciN-)

¡Tchan! ¡Tchan!

Se ejecutaron los 6 escenarios y AnyLogic aún devolvió una hermosa interfaz de salida interactiva que puede exportar a Excel (el botón en la esquina superior derecha al lado de la escala), compartir con amigos o incluso guardar para futuras consultas en la nube:

![](https://lh5.googleusercontent.com/BNOtuWeAAwZsgq-e94-9re3D0FUZ4f6fQpw7dTkpBeAWBc2M2a5h8FrwkDDpttA2XnfBzOr1BTKx8u0BL4wfDLFWWGN0M9Oom83I3mxTHliUFSq-jI5Zb6qbw2QcvobXNpP2GZKt)

¿Ha notado que AnyLogic Cloud almacena escenarios simulados? Si solicita la simulación de un determinado experimento que ya se ha realizado anteriormente, no volverá a simular el modelo, sino que buscará en su base de datos el resultado que ya está listo, ahorrando su tiempo (y el de él). ¿Quiere saber todo sobre AnyLogic Cloud de boca de los desarrolladores de AnyLogic? [Entonces mira este video](https://www.youtube.com/watch?v=_IWjzpr9DMA).

Puede compartir el enlace de la plantilla con ~~tu archienemigo~~ amigos, incorporen el modelo a su sitio web (o blog), haciendo que su página sea interactiva como [como en este tutorial,](https://www.anylogic.com/blog/conveyors-using-the-material-handling-library-part-1/) o hacer algo mucho más avanzado: un [interfaz de ejecución de modelo completo](https://cloud.anylogic.com/custom-ui-demo/index.html) utilizando la API de la herramienta.

Para aprender más sobre la **AnyLogic Cloud**, existe una [página](https://www.anylogic.com/features/cloud/) dedicada no site da AnyLogic.


# Corrección del problema del Startup

Propósito de este paso:

* Construya un modelo de simulación que permita identificar cómo se expandirá la aplicación en el mercado e identifique durante cuántos meses la **startup** debe invertir en marketing para que alcance al menos 1 millón de usuarios al sexto mes del lanzamiento de la aplicación.

Del siguiente gráfico (tomado del gráfico **Plot|Clientes** desde la nube), con 0 o 1 mes de solo marketing, la aplicación cae por debajo de 1 millón de clientes. Después de 2 meses, el número de clientes supera el objetivo y el problema está resuelto: solo 2 meses de inversión en marketing.

![](https://lh6.googleusercontent.com/QfdTArDkOtfPvsEsGSM-2TtihqKuzzIa6ngJAEkTUu8XhNixLr-TpHD6dc-Wn0CWpuUBV5DnpBM3zQ5GgljbJAqON3c6pa2DHUZ9OHtRoVt4HDqkllkGd88UXIFF6RAprUV5rfU6)

Tenga en cuenta que este resultado es compatible con la realidad de cualquier lanzamiento de producto, después de todo, el producto tiene un presupuesto de promoción limitado y se consume en los primeros meses de lanzamiento.

A La parte básica de este tutorial se encuentra al final.

Como es habitual, cuando los alumnos se enfrentan por primera vez a la práctica de la simulación de dinámica de sistemas, es natural ver ideas de posibles sistemas y situaciones cotidianas en las que se podría aplicar la técnica (y espero que este sea tu caso).

Si está interesado en el emprendimiento y está buscando temas interesantes para una monografía, por ejemplo, evolucione el modelo de Startup para considerar otros componentes relevantes del sistema, como: facturación, costos, necesidad de mano de obra a lo largo del tiempo, reputación de la aplicación, etc. La bibliografía sobre el tema es extensa, de buena calidad y, lo confieso, que la idea de este tutorial surgió desde [aquí](https://www.mdpi.com/2071-1050/12/10/4005/htm).


# Epílogo: cómo aprender AnyLogic desde aquí

Hemos llegado al final de nuestra actividad de presentarle AnyLogic para la simulación de dinámica de sistemas.

&#x20;El conocimiento sobre la simulación de sistemas dinámicos es increíblemente amplio, con libros, sitios web (visite el [The System Thinker](https://thesystemsthinker.com/)), trabajos (¡muchos!) y clases en YouTube, como de la maestra [Monella Meadows](https://www.youtube.com/watch?v=XL_lOoomRTA) o esto [Ted-Ed sobre los bucles de retroalimentación en la naturaleza](https://youtu.be/inVZoI1AkC8).&#x20;

La biblia sobre el tema es la [Business Dynamics](https://www.amazon.com.br/Business-Dynamics-Systems-Thinking-Modeling/dp/0071179895/ref=pd_lpo_14_t_0/136-6869167-5805313?_encoding=UTF8\&pd_rd_i=0071179895\&pd_rd_r=670cfd3b-50fe-4fb8-b945-f0456e42723a\&pd_rd_w=1159a\&pd_rd_wg=gUGwh\&pf_rd_p=e7e26e7d-6256-4aae-92f9-7ffa337ed626\&pf_rd_r=Q6Z7HWHTPGEDSJ5ZM9K0\&psc=1\&refRID=Q6Z7HWHTPGEDSJ5ZM9K0), ibro del Prof. Sterman, fácil de encontrar en bibliotecas.&#x20;

A partir de aquí, lo que puede hacer para avanzar en AnyLogic:

* Si ya posee o tiene la intención de comprar la versión Profesional hacer AnyLogic, el camino natural es hacer uno [entrenamientos mensual ofrecidos pela Genoa;](https://genoa.eventbrite.com.br/)&#x20;
* El [site da AnyLogic](https://www.anylogic.com/) proporciona una sección **Resources** con varios libros, videos y *white papers* gratis:
  * Para obtener una descripción general del software, incluidos los tres métodos de simulación que admite (Procesos, Agentes y Dinámica del sistema), un buen punto de partida es el libro gratuito: [AnyLogic in three days](https://www.anylogic.com/resources/books/free-simulation-book-and-modeling-tutorials/). También hay versiones pagas para [Kindle](https://www.amazon.com/AnyLogic-Three-Days-Simulation-Modeling-ebook/dp/B07FYP8Y3C);
  * Si te interesan las aplicaciones en Logística, Supply Chain, te sugiero que investigues otro software: [anyLogistx,](https://www.anylogistix.com/) el cual es un *spin-off* do AnyLogic hasta el área de Supply Chain y ya viene con CPLEX (paquete de optimización de IBM) embebido;
* Hay una sensacional [Sección de videos de](https://www.youtube.com/playlist?list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3) [“How-to” en YouTube](https://www.youtube.com/playlist?list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3). Sugiero algunos para empezar:
  * Importación de [ modelos do Vensim](https://youtu.be/YmhUnDjsEzc): el video es muy corto, ya que solo necesitas importar el archivo y listo. Recuerda que Vensim es un software de 1990 y muchos modelos que encontrarás para descargar estarán en este formato;
  * [Distribuciones de probabilidad personalizadas:](https://www.youtube.com/watch?v=YniPxHYfbrc\&list=PLUJJN9tmVTj1czFMt9IKi6wge9GnmMTN3\&index=10\&t=0s) aprenderá algunas técnicas que tiene AnyLogic para leer datos y convertirlos en distribuciones de probabilidad;
* Dudas: actualmente, el mejor lugar en Internet es [Stack Overflow](https://stackoverflow.com/questions/tagged/anylogic) que tiene un grupo muy activo de preguntas/respuestas. Si posee la licencia de **Profissional** ou **University Researcher**, *¡better call Saul!* ¡Llama a [Get Support!](https://www.anylogic.com/resources/support/)


# Table functions

**Table functions** (funciones tabuladas) son herramientas fundamentales en el arsenal de cualquier desarrollador serio de modelos de dinámica de sistemas. Representan tablas de valores conocidos, facilitando y dirigiendo la construcción del modelo.

Considere, por ejemplo, que Startup está preocupada por el nivel de compromiso de sus usuarios. En aplicaciones similares, el nivel de participación está determinado por el tiempo promedio que un usuario está activo. Para la aplicación desarrollada, se estima que el tiempo que el usuario está activo está definido por la cantidad de usuarios, es decir, cuanto mayor es el tamaño de la red del usuario, mayor es el tiempo promedio que el usuario permanece activo.&#x20;

Por lo tanto, el tiempo promedio de participación se estima mediante la siguiente tabla:

El diagrama de stock y flujo debe modificarse, como en la siguiente figura, para representar la pérdida por desinterés (flujo de "personas que abandonan la aplicación") y el número de clientes inactivos (stock de "clientes inactivos"). Estudie los cambios realizados en el diagrama de stock y flujo del problema y vea si puede comprenderlos.

![](https://lh6.googleusercontent.com/SD5yVq1nZHcX84qAhZjk6-2qU-vABOrLI9GpG5iwPgVQixJxZPOR2NU-NeDzL0RrMaOopVyC3MyzVo7FOyXG24GWczwiU22j_txy3vVBgwS33727zkSuI2lOsiX7r9PEl6hRMQCB)

Calcular el flujo de personas que abandonan los estudios es relativamente simple:

`Clientes / tiempo medio de interacción`&#x20;

Este valor representa la tasa por mes a la que los clientes abandonan la aplicación.

Comience agregando el nuevo stock de **ClientesInativos**, o **Link** entre **Clientes** y **ClientesInativos** y el **Loop**. El nuevo modelo debería verse así:

![](https://lh4.googleusercontent.com/3dhNGVb79B_7_fMwMUhOuJWxdTNnpH2MW3kSNMFriF0o6B4uFFCAIR8RsOq_sdCR90iiXSIqhYuckI5ryDZXYVLwAUITMhiniauV6oTudIcCjJVkxXZQ3HWf8uQ1VTu9Cwy8GV7x)

&#x20;El modelo ahora debería parecerse a la siguiente figura:

![](https://lh4.googleusercontent.com/NyP4dNC9SkWqwKZ-oyE6hRxCoudPdokcYtHGdxy9GW4500nxUzzam-smHZSKi6cFAu2oUrmRuP84paggEtq9t6Vb3GZ3_j9IhhxXYzC0ls8H97EPa3TtfdWlu_bDyGkg8JprZGaR)

El siguiente paso es crear el **Table Function** ara el tiempo promedio de participación del usuario. El elemento está disponible en la paleta de dinámica del sistema (**System Dynamics**) del AnyLogic:

![](https://lh3.googleusercontent.com/rnilSTsXWjHJpgvdXAGVkbdXa-H6HGEb8W8wzlGX7MLM_Jz9gkkhmvMj2kX5Os8CT3nOCuaYgATESA1rtuE8eRQCoVMEb1HEL_hMXssMv3wWduMWa4bfbYys4X4agXVBhKBeMoGa)

Para completar los valores, puede escribir uno por uno :cry: o usar Copy/Paste :sunglasses:, simplemente copie la tabla provista unos párrafos atrás en este tutorial y péguela en **Table data:**

![](https://lh5.googleusercontent.com/zYjb2I872gH8vmwYhEupOfdY7R_Dty5gxIscFJtuUCKDe23KKL-mkAQm-9EmOcyZNxFGfJhpPMLPgX42hO8V44q6lGOTtH2s_rclxgORnXgbGmtEFiKV8mPBg890btAxp70RSBWa)

Tenga en cuenta que debe eliminar la primera línea, ya que repite el valor inicial de 0 clientes (sin corrección, al intentar ejecutar el modelo, AnyLogic da un error de compilación).

Antes de continuar, dos cosas interesantes que debe saber a cerca de **Table funtions**:&#x20;

* En el campo **Interpolation** puede seleccionar la técnica de interpolación adoptada. En el caso del ejemplo, elija la opción **Linear**, que representa una interpolación lineal entre los puntos (las opciones se describen mejor en el Help);
* En el campo **Out of range** debe seleccionar la regla que se adoptará en caso de que el parámetro de entrada proporcionado por el usuario esté fuera de rango (**range**) de la mesa. Para nuestro caso, seleccione **Nearest**:

<img src="https://lh5.googleusercontent.com/TWN3RAjevtofV4YZJlApPzcPA4I5TECrssyjFCujDX6U6pZuza-9Oax4ejYiwGIGGWVk54BJPguxX5Ad0zNsCuhGSLT7QxnKAfHVppMhsUtHJRh_88_izxyprhdRxiv6qsakyN0b" alt="" width="563">

Ahora puede usar la función donde quiera en el modelo, en particular para igualar el flujo **taxaDeDesistencias**.&#x20;

![](https://lh3.googleusercontent.com/LoyMYlMEhXScz9Pp-boDqcje_C3HeHBGvr9OBd9HqeAmNbYRplf6X2iRRSy2XBAZ60wbRWTD9IOKTUvFGtGXAxt4ldwqxF2mabfd8rp6hlnMc2DhPO0KWjg8ppZ9Gu_XYkq0xgte)

¡Voila, simula!

<p align="center"><img src="https://images.unsplash.com/photo-1518364538800-6bae3c2ea0f2?crop=entropy&#x26;cs=srgb&#x26;fm=jpg&#x26;ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHw0fHxyb2NrZXR8ZW58MHx8fHwxNjM0NjQyODA3&#x26;ixlib=rb-1.2.1&#x26;q=85" alt="" data-size="original"></p>

{% hint style="info" %}
**Preguntas**

* Con los nuevos resultados, ¿cambiarías tu decisión de invertir solo 2 meses en marketing?
* ¿Puede explicar el nuevo comportamiento de la curva de boca a boca?
  {% endhint %}


# Experimento de variación de parámetros y recopilación de datos con conjunto de datos

Como en la nube, AnyLogic tiene un experimento de variación de parámetros, el **Parameter Variation**.

Antes de ponerse manos a la obra, una buena nota: AnyLogic ejecuta experimentos con replicaciones utilizando **processamento paralelo**, para que desencadene una replicación por centro disponible en la CPU de su computadora.&#x20;

¡Velocidad, amigos! :woman\_running: :man\_running:&#x20;

Crear nuevos experimentos es intuitivo y solo sigue la secuencia de comandos del menú desplegable **File > New > Experiment:**

![](https://lh4.googleusercontent.com/L1MQRjONaoNY3LqLqTv3j2P9aiMLwdt_S3kj0vY3wfDCCfcsfI4cP99RDPD8wjwlDHrdeaSge8YVgtx1h1Ir_GyYwqSCq4u-gKnw4NI0UYvCyhRGmtj7HUAtvXzQ0hwj7GKlen1S)

Aunque ya creamos varias salidas para el modelo, todas fueron creadas en el experimento **Simulation**. En el experimento recién creado **ParametersVariation: Main**, todavía no hay salida.&#x20;

El primer paso, por tanto, es crear elementos de recogida de datos (**Dataset, Statistics, Histogram data** etc.), de donde se pueden extraer las distribuciones de los parámetros de salida.&#x20;

Usaremos dos resultados en el análisis: la curva de tasa de conversión de boca en boca y otro valor muy específico, cuántos clientes se alcanzaron en 6 meses.&#x20;

## Curva de tasa de conversión de boca en boca

Si se hace clic con el segundo botón del mouse en los bloques y elementos de la pantalla, generalmente tienen opciones de recopilación de datos. Haga clic derecho en la secuencia **taxaDeConversão** y crea instantáneamente un **Data Set** on la opción **Create Data Set**:

![](https://lh5.googleusercontent.com/ciyz9rjV3zDXY4G_8aPszJjtNkERkEqYIvGT4KEfC7teKXfj_js-vRsZdSy0-6kjmz2E5G7z01u7Nek6wBIeBgdYUHOK5DCLmPoaEAXg1NHbEeg-5cbJoySyBVU39m2eVf_mpyR6)

Por defecto, el **Data Set** se crea sin la opción de actualización automática de datos (más adelante le mostraré cómo hacerlo). Para la hora, active la opción de recogida automática de datos y salga con la opción de recogida mensual de valores (el **Data Set** almacenará un número por mes):

![](https://lh6.googleusercontent.com/Ctc9uGJ5jU4jAREPhPTWRy3QDwN3WjZ0dfY09pmdlUTirIla_DrHZmWTaqdYM2VLLs6BBpDYEq3yYTetZSmbnFLTxfMY5AnID0cdqc_1N6Rqy7KESey3Y9lJ9RWCtcKYCswAiUx0)

## Número de clientes alcanzados en 6 mese**s**

Este es un poco más comp... ¡FÁCIL! La opción **Output** en la paleta **Analysis** nacida para ello. Haga clic y arrastre el elemento **Output** y nombrarlo **metaOutput**:

![](https://lh6.googleusercontent.com/zcZ8grRBYXN9a900ginIyq2pJsdMUPPKR8Xpd1Kt32UQLzM84jBKbIQZ1evkoAaHLhdlwe47IT67SbT1LTdWHmC1YEPrUrEe5ud9Pmuph8VmeavPGT8wO7gRkLiKds4x4BTAO3Du)

El bloque **Output** solo necesita dos datos: qué va a medir (en este caso, el número de Clientes) y cómo lo va a hacer (en este caso, recopilando datos después de un tiempo de simulación de seis meses):

![](https://lh4.googleusercontent.com/V9j58yrXhmx2Ulu9QIhZ3dUA4IRR7OT277KxuXWnvjSgBnjDGsbRlTIGWOpC76zNZ7E8clPwzTq-aVh0jrUIhQZMRews0JyPgUEcoE9Je75C6k_egw90CV7x0bsfhNHJTCGUOl_c)

¡Prueba el modelo, simula! :woman\_astronaut:&#x20;

![](https://lh6.googleusercontent.com/K5YLCuHCZmo2qsxgErSuyBstz9GDi7u1_LU88vL0FWdAFYK2EV4SIa71Y1oscieeFwQIs-slnAT_osOEEYEYzQJQ4ZPoOUpc2QfV36FqBWQ2-_oMO0OHJAXmj168egVh2ZuCd_9p)

## Poniendo todo junto en el **Parameter Variation**

Volver a la pestaña del experimento **ParametersVariation** y ve a la ventana **Properties**.

Inicialmente, cree una interfaz predeterminada haciendo clic en el botón **Create default UI**:

![](https://lh3.googleusercontent.com/pvuBYO5_TehAkAALhS8nxAD2Akw84BL90LQcdvVOvZ-bDxIda6-x6vPeGr7XcyQbQKWOsXxnBg_VCQl9mO2YFdiEwMoRrDTrtRPJIVgYl8MSmQjShUbPmxwn1XBgh4wb3gaUIKMq)

Ahora, mira cómo en la pestaña **Parameters** puedes variar los parámetros (como hiciste hace un tiempo, allá en la nube). Varíe el número de meses entre 0 y 10 meses modificando la columna **Type** del parámetro meses:

![](https://lh5.googleusercontent.com/NM2B8tEN9r7fxdrGA02s3hY9f7Vko-p4xMF1lAFEcZ8SGDCXHjXLEO41blINGZGaUJFFMISY5nWTf3-YJ543EStMDACpzdktiUKAH2XcaOPNnRbRSRsB4pem8mGauWiZZQ5Cmsou)

La región de la pantalla de **ParametersVariation** acepta comandos de análisis de datos (gráficos, histogramas, resultados, etc.), así que agreguemos un **Time Plot** presentar los resultados de la curva de tasa de conversión, para cada escenario simulado:

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

* Eliminar cualquier elemento de la pestaña **Data** (ya que los datos no se recopilarán automáticamente);
* Seleccione la opción **Do not update data automatically** y
* No olvides cambiar la opción **Time window** dela **Scale**, para **40**:

<img src="https://lh6.googleusercontent.com/ZSY2XHUbxDj7vhTzEXPGRWGQUovS1BjIDV4ce3_n5ZGAMJ1klB0ZIlz9KFrLadB0F_UZBMZVdN8qg3gzQ-aYRCPnIO-5VjLAgR1xW112eIBkR3Ku6fLjvf4j1mLS3oXzxwZ9vLC2" alt="" width="563">

A diferencia de todos los gráficos que hemos hecho hasta ahora, este es el tipo de gráfico que no recopila datos automáticamente, sino que recibirá un comando para agregar datos a cada ejecución de simulación.

Una tarea relativamente sencilla, dado que cada elemento de recopilación de datos (como el **Time Plot**) tiene un comando **addDataSet**.

Ubique, en la ventana **Properties**, la línea **After simulation run**, sin menú **Java actions**:

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

Esta línea de comando (que actualmente está vacía) siempre se ejecuta cuando AnyLogic termina de simular una replicación. Necesitamos agregar el resultado almacenado al final de cada simulación en el **Dataset taxaDeConversaoDS** no gráfico **taxasDeConversao**.

Con **CTRL + Espaço**, ingrese la línea de código (elija la segunda opción de **addDataSet**):

`plot.addDataSet(ds, title)`

<img src="https://lh5.googleusercontent.com/oLdWtpwwKSHJmkhuwhB2DK4cEBcNRStmN0X_gu6pl4utcllPfpl9lplnVQnYqIK75uuAy2mD9EV9djX3BGwUgc_nOBfGSNNzRMKtIoYYM3egR_lIJsrwx3xOGNaRfgdUpws-bh-k" alt="" width="563">

{% hint style="info" %}
**Importante**

* Hay 5 comandos **addDataSet** ¿en la lista? Bienvenido a la programación orientada a objetos. De ahora en adelante siempre será así: **CTRL + Espacio**, escriba algo y aparecerán todos los comandos disponibles dentro de eso objeto. No hay forma de memorizar estos comandos, ya que la cantidad de opciones va un poco más allá del infinito;&#x20;
* Acostúmbrate, como (espero) que te acostumbraste a andar en bicicleta y cuenta con Ayuda para comandos más difíciles. Como regla general, todo lo que haga haciendo clic, completando campos o conectándose se podrá construir con los comandos disponibles en el [API](https://pt.wikipedia.org/wiki/Interface_de_programa%C3%A7%C3%A3o_de_aplica%C3%A7%C3%B5es) del AnyLogic.
  {% endhint %}

La opción de **addDataSet** pide dos parámetros, el Conjunto de datos y tu título. Como el **dataset taxaDeConversaoDS** está no **Main**, necesitamos acceder a él desde el experimento actual.&#x20;

Pero hay un detalle más: si colocas el mouse sobre la lucecita amarilla en la línea **After simulation run**, recibirá la pista de la palabra **root**.

<img src="https://lh5.googleusercontent.com/6n-ykos6EI2ywRsjTiTI0WG2vCbNtfyQ0eyBNCUofQoynLiWnUtZTgff9cj2gyeF3Y5R_z7MW6OSDxSk1M0T11WoaiiqwXdXYWvhJw27QcT4OqwupHpoOotg4tR1Gu_AZ0xGQQyT" alt="" width="563">

Con el comando **root**, accede a cada replicación en ejecución o finalización. Complete el comando informó los dos parámetros de la función: el **Data Set** está en **String** indicando qué mes fue simulado (en cada punto escrito, **Ctrl+Espacio** y no olvides el punto y coma al final):

<img src="https://lh6.googleusercontent.com/wSk73-WXWpgk6Tmb2I7OMPMPxybP8p4uiVe1KBeSe9RvCOCV3nZQAC3rr7kQCgUTjgnie5IqVaoDFbTVb_fxEO1Ou8WVuca6ZQ1joCEuo-jris1o7u86qvdb0E88aHLBv1l_78ym" alt="" width="563">

¡Simular! :woman\_astronaut:&#x20;

(no olvides presionar el boton **Run**!)

<img src="https://images.unsplash.com/photo-1546546274-1703737efede?crop=entropy&#x26;cs=srgb&#x26;fm=jpg&#x26;ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHw5fHxyb2NrZXR8ZW58MHx8fHwxNjM0NjQyODA3&#x26;ixlib=rb-1.2.1&#x26;q=85" alt="" data-size="original">

![](https://lh3.googleusercontent.com/FB2Qr7ygiO4Unr1eEeiIuaMmqpo7fufcHAEa2aFvpfAGM4QzLUH3vpgXVmbHH7Ds99EjkoN13N4C-Z0aVfBVjZAXI7cQCvGbDCbYTpIL-O87MbmA0I8bvtynemdanr1Rt0r4IQXk)

Un poco rápido, ¿eh? ¡Bienvenido al procesamiento paralelo! Si su computadora tiene 8 núcleos como el mío, entonces AnyLogic procesó 8 escenarios en paralelo en la primera ejecución y luego 3 escenarios más, totalizando 11 simulaciones..

Disfruta del pack y crea un **Dataset** para almacenar el **metaOutput** que creamos en  **Main**. Vvolver a la línea **After simulation run** con la ayuda de **CTRL+Espaço**, busque el comando **add** adentro del **metaDS**:

![](https://lh5.googleusercontent.com/k5EOwPmukkYZTp-qwDNVuH_fYlEfeWbEY0Uawp3TPU1fv7D0G3xyuqZNk1ba0c9f7zbltOPlHNhioqqDYpxYaNlKMEhlkdTgzJ0b6AzVrAxBAuxO3KLk86gywt-t_kfBMuKbwNOs)

¿Por qué elegí un **Data Set**? Porque quiero almacenar los valores de cada escenario simulado.

Como en el caso del gráfico, necesitamos sumar el valor al final de cada simulación:

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

Con o **root**, llegamos fácilmente a los valores de simulación:

![](https://lh6.googleusercontent.com/601_bxhaaJI9oRzJu6G_RybXpA-NGIjlnzEt6cUkj1zk10MJDcmBuqJAn8gNh2FWpik4RGl6sL5IKoRxKKW12EM45zVTsGVMLS6kfoWoqdVVp6pcJoVMTcHlfUe_QgazuQ45d3Ng)

¡Simula! :woman\_astronaut:&#x20;

![](https://lh5.googleusercontent.com/bPxAns3I6kMcZoPxuSRqoimV9y1v2rFqEnsbJ0lJ7RJJloBeC40Fd6LohMvXGOsYYha71mrhVaMq0f1iOkEAgjFoWhzjMoZ-Ea0kXLEeRM-F9WQknsWotFhSIkvzSYclAW1ik95k)

Analizando los resultados del modelo, el período mínimo de inversión en marketing es de 6 meses.

Un breve resumen de lo que hemos hecho hasta ahora:

1. Creamos un bloque **Data Set** y un bloque de **Output** no agente **Main**;
2. En el experimento **ParametersVariation** creamos un **Time Plot** es un **Data Set**  para almacenar, respectivamente, cada **Data Set**(conjunto de datos) que representa la curva de conversión y cada **Output** (valor único) del número de clientes alcanzados en el 6º mes generado en cada simulación;
3. En las propiedades del experimento **ParametersVariation**,colocamos no campo **After simulation run** eso es todo **Java actions**, el comando:&#x20;

* `plot.addDataSet(root.taxaDeConversaoDS, "Meses = " + root.meses);`
* `metaDS.add(root.meses, root.metaOutput);`

{% hint style="success" %}
**Sugerencias**

* Los experimentos se almacenan junto con las plantillas y puede crear tantos como desee. Entonces, haga lo que hacen los profesionales: copie y pegue lo que ya ha hecho (gráficos, conjuntos de datos, código, etc.) de un modelo al siguiente.&#x20;
* Esté atento a los ejemplos (casi 400), que siempre tienen alguna idea en la que puede inspirarse.&#x20;
* ¿Quieres saber más sobre el experimento **Parameter Variation?**, ¿Cómo lidiar con las repeticiones, el tiempo de calentamiento, etc.? una manera es [esta sección del Volumen I](https://tutorial.anylogicbrasil.com.br/apendice-ou-coisas-que-deixariam-o-tutorial-ainda-maior/simulacao-com-replicacoes) en esta serie de tutoriales.
  {% endhint %}


# Creación de estructuras de datos con Arrays

**Arrays** son estructuras de datos que le permiten modelar vectores o matrices. Son particularmente útiles para el modelado, ya que pueden incorporar rápidamente nuevas dimensiones o categorías en el modelo, por ejemplo: los clientes de inicio se pueden dividir entre jóvenes y adultos, género, ingresos familiares, etc.&#x20;

Un problema clásico de la dinámica de sistemas es la predicción del crecimiento de la población. En su versión más simple, sólo considera la población actual, la tasa de fertilidad y la tasa de mortalidad. Una posible representación del diagrama de stock y flujo para el problema sería:

<figure><img src="/files/6AQSFQB5uXSxha6vQav9" alt=""><figcaption></figcaption></figure>

En 2007, por ejemplo, la población mundial era de 6.600 millones de personas, la tasa de natalidad era de 21 personas/1.000 habitantes y la tasa de mortalidad de 9 personas/habitante. La pregunta que surge es: y si ¿La tasa de mortalidad es diferente entre hombres y mujeres?

Para entender la estructura de **Array**, debemos ir más allá del modelo básico: considerar que las tasas de mortalidad son diferentes para cada género (masculino/femenino).

Crea un modelo en AnyLogic con el nombre **Populacao** y con unidad de tiempo **years**:

![](https://lh5.googleusercontent.com/Pdwp-BORZr2_ybUU67vIX9shTcR6HqflrOBAdxeQGgEGdoFhy3chgEZtPkIFkVh4bFIjs3BTJ3ualcd1tim4TCkF7lkveAd28nNgRoG1KqX_FD5IxhPz5QM_n0dbfaV-jr31W2yd)

Con lo que ya sabe sobre AnyLogic, construya el modelo básico, sin considerar el género todavía. Adoptar:

* Población =  **6600000** (Nota: 3 ceros más y AnyLogic arrojaría un error de tamaño de número entero. Para evitar este problema, encierre el número con el "punto" indicativo de punto flotante, es decir: 660000000&#x30;**.0**);
* Fertilidad = **0,021**;
* Mortalidad = **0,009**.

Construido en AnyLogic, el modelo debe verse como el de la figura:

![](https://lh4.googleusercontent.com/0-hhLkGFd9ddGSf0ijaQOxik2-5qIfUO8mY_fi-L4LBh9MUZcBDH0I8NmU3DkHDgE8ZEAeYTolCOCVX-15XcTONLZNMI2BTABVtY7uKv1l0BZrzxOgUPG4wa3m4-11BZFdxT5hiL)

Simule y compare con el siguiente resultado:

![](https://lh5.googleusercontent.com/cYPWZ1aHk6If30Yxfl1wEbPN6ZFJpOjtH99GU_Upf2LAFlrLM89QNjVN4Uj7Niad7F6RR-q4qoD0dYtO5RL4jdMHtdoBNOycMk-mY_JiDgH_nsDrEekaU6MQFKfXXhf3uxL-90wA)

Considere que la tasa de mortalidad es diferente cuando se captura por género, siendo 0.0085 para mujeres y 0.0095 para hombres, respectivamente 8.5 muertes/1000 habitantes y 9.5 muertes/1000 habitantes.

Para tratar con diferentes categorías (o índices) AnyLogic tiene el elemento **Dimension**, en la paleta de dinámica de sistemas. Crear una "dimensión" **Genero**, haciendo clic y arrastrando el elemento **Dimension** para la pantalla:

![](https://lh5.googleusercontent.com/589u1bQzyQJoNp30WLKozWvtTKPZBETdAxIu-ZU5EltzpeOq2zjniPDyFhSNn4mg13Vl-edrWnKzXs_mMz4wMVsMQ2-Lvbcv1-BnORMbDFZTDHeTZBLbJ4BIpxAf7-7b5Vy6hydU)

Modificar el parámetro **mortalidade** para reflejar la diferencia de género:

* Seleccione la opción **System dynamic array** el parámetro;
* Selecciona la **Dimension** deseado (**Genero** no caso);
* Actualice los valores predeterminados (si lo desea) usando el botón **Edit** o incluso escribiendo directamente el **Array** “{valor1, valor2}”.

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

Todas las ecuaciones deben reflejar la dimensión **Genero**. Empieza en **Stock Populacao**:

![](https://lh5.googleusercontent.com/0BW46CKGX-80L-buD6dKHzAPVQ4CcTbPZD8L1Hm03DO0DSswW8CEVs3_VJpa6ltJQe5D7kbrO2WwuY2-sv65PaAb46PjMQIUPBG01LAb_IkVmWzNSwv3a6MkB8sF0HANTsMgKEk8)

Con el **Stock Populacao** el parámetro **mortalidade** ya tiene la dimensión definida, ahora puede actualizar la ecuación en **Flow mortes**. En esta parte, AnyLogic es muy democrático en sus opciones, permitiéndote trabajar individualmente con cada categoría o genéricamente con ambas, simplemente usando el subíndice correcto - \[Masculino], \[Femenino] o \[Género].

En el flujo fallecidos, comienza seleccionando la opción Formación y estableciendo Dimensiones de la matriz por Género

![](https://lh3.googleusercontent.com/eFMfVxrsFt0eygnK-s6AFhreLztAJ2ubIDkAVjMy_Ji91Fb6UQtdtvbXoMfwU-Bg2RLII8Zg0Np-_GoggiXfflWqehOviSs7X94zQH9ikLI3cXYw7wkp7QsjN14zJLDxxw3EFPtF)

Ahora viene la mejor parte: define una ecuación para cada género, observa cómo AnyLogic facilita la elección de cada categoría:

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

Como resultado, las propiedades de flujo fallecidos debería verse así:

![](https://lh3.googleusercontent.com/Bqv_ww3PW3-TMsjHAnCG_2M5Nz5JipU-I3f4Q9Wu2gwB_IUfN9ZstVMMA0J2SWfrDhNRdKf-VncK68oS2UiOAvtAMCPaR-6mHOib9kvdNwO0Nv26HhpvOSf05e4z09aafnKGu19x)

Llegamos al último y definitivo paso: la ecuación del nacimiento. En este caso, la fecundidad es la misma para hombres y mujeres (50/50) y por tanto la ecuación sería la misma. Puede, como en el caso anterior, crear una ecuación para cada género o detenerse y usar el subíndice **\[Genero]** lo que equivale a aplicar la misma ecuación a ambas categorías:

![](https://lh5.googleusercontent.com/oIjA_D3Yfxu7VJGrqyU5P8a0Mu7ApQOSSprV-HEm_zn0sGPV3ctuC5oZ9epYOwp0y276JsYYq20YGy13nEtG7UsWPp73HrwYHbwethSRXnV4no8kxR0Yl3C-Kre74LMS-7QrEEFw)

Como resultado, el flujo nacimientos él es:

![](https://lh6.googleusercontent.com/5bMLmah4oQN8471pTM7xVBhJdBf2pYgRNuNMpBnFhExBK8KC9KPJwUBnIPMGGnSBngeqWJ2ImOR70Ni3JAXOxtNvdeYrcdP2zMBz-XJBfauRwbKGIBbKWuZqNNBVKHln2N2tuRwx)

¡Ahora puedes simular!

<figure><img src="https://images.unsplash.com/photo-1457364887197-9150188c107b?crop=entropy&#x26;cs=srgb&#x26;fm=jpg&#x26;ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHwxfHxyb2NrZXR8ZW58MHx8fHwxNjM0NjQyODA3&#x26;ixlib=rb-1.2.1&#x26;q=85" alt="" width="188"><figcaption></figcaption></figure>

![](https://lh5.googleusercontent.com/zoZ_zfQMIIBhNu82OQ6NQDymeCBpQJ5ksUyF0Q8peyQMurVAMn6ryT2raA1-FIp6NoNCwowbQHL0WYUH5nA8uIFXVu_hKKT8Yf6fevbJox6clG732Rss7o0ImeWJHgqr7HjaB8Xh)

Observe cómo dentro de cada bloque (**Stock**, **Flow** e **parameter**) los resultados ya están separados por género, siendo AnyLogic el encargado de componer toda la ecuación del modelo. Desde el punto de vista de la práctica del modelado, hay una consecuencia natural de esta característica en AnyLogic: centrarse, inicialmente, en el modelo, stocks y flujos. Con algo funcional en la mano, dedíquese a la eventual necesidad de usar índices para categorizar flujos específicos a través de **Arrays.**


# Comunicación con hojas de cálculo de Excel

Para la conexión a hojas de cálculo (tanto para datos de entrada como de salida), AnyLogic ofrece varias alternativas. Hay dos opciones para principiantes:

* Importe los datos de la hoja de cálculo a la base de datos de AnyLogic o
* Conecte directamente la hoja de trabajo como un objeto dentro de AnyLogic.

## **I**mportación de datos de Excel a la base de datos de AnyLogic

En este caso, los datos en su hoja de cálculo de Excel deben tener una "cara tabular", porque, en AnyLogic, cada carpeta de Excel se importará a su propia tabla de base de datos y \[¡importante!] La primera fila de la hoja de cálculo se utilizará como título de las columnas de la tabla. Por lo tanto, no use acentos ni celdillas en la primera línea de la hoja de trabajo.&#x20;

Por ejemplo, considere la siguiente hoja de cálculo de Excel:

![](https://lh3.googleusercontent.com/VFoqMjpnQhdKBSNkRhwG5vn2ISpTKc2iyIH2rZDyih3CBT_i9zWyXk3JOHYi8J3dNIBmUINHMbVIk-saIUCAVU1iTXvGp7RAv2WmEGjYUUl-2TROwOYZgw_hd3DRi_XucINYGvFj)

Para importar la hoja de cálculo a la base de datos, siga estos pasos::

* Haga clic con el segundo botón del mouse en el icono **Database**, en la pestaña de proyectos y seleccione la opción: **Import database tables**;
* Localice su archivo de Excel (o tabla de base de datos);
* Seleccione, si corresponde, las carpetas que desea importar y presione el botón **OK**.

![](https://lh6.googleusercontent.com/aSyU-frig7breFNh1Sr5ugQMmInkOXZNFVY7uB3NqKCWTU0JrIY2bb9eY31mdokMaLiN0k9UPCzDpr-kJiHkRzpxGEosu4qeEwxMF1nno0eFAShUZSR4YDqzfzoRR3GQPSTJOTp8)

En el ejemplo, la hoja de cálculo se importó como una tabla y, con dos clics en su icono, puede ver los datos almacenados:

![](https://lh6.googleusercontent.com/AyLN_LMjyel4OMyQLiUJ6MExnDg2NrGpcgLEidxRVnaTt90jpaGyKPZHqcUalUzpfwuq7-ngYjYRXSggM_NtfwJpKH-zZRSdFc3dAOXCtQV2gWRDU2l-9TGQJO3oGf-9xfSXQn8u)

El uso de los datos de la tabla se puede hacer directamente con el comando **Insert Database Query**.&#x20;

Por ejemplo, usemos la "Población total", almacenada en la base de datos, como valor de entrada para el parámetro **populacaoTotal**. En este caso necesitas:

* Seleccione el campo donde se rellenará el valor (en el caso **Default value**, en las propiedades del parámetro);
* Haga clic en el icono  **Insert Database Query** (tenga en cuenta que solo se activa cuando ingresa al campo **Default value**);
* Seleccione la tabla con los datos en **Table**;
* Cree una condición de búsqueda (observe cómo AnyLogic ayuda al proceso al abrir opciones automáticamente).

![](https://lh3.googleusercontent.com/OhB7pgVGpUsyQYkSJJMkBgGR6ERXl1TvyzfByQufd8sRDwWML5lrf9ZaAb4aKwMlJOd2aMPMSyef5pa4_-ULsIcZczgyaT4Xx3SRVuVbqIkui8_iIGD9q-P3ItnB4AzXpdtxU6Ju)

Si conoces el lenguaje **SQL**, la diversión puede ser aún mayor, porque el campo de **Default value** (y cualquier campo que acepte algún valor de la base de datos) acepta comandos SQL directamente. Observe la última opción en la ventana **Insert Database Query:**

![](https://lh6.googleusercontent.com/KGmo5wqMGqPxImJvO9KNE6IvthnXSYhWXsazRggmlyJL_GCXgOjVGoQ0YKCFoI7iaM_s5ZXIg4TenE6r9ksqhYcH5LqDPkxoRB_D4BAAel-kIZ2ie3Hb-RAWdP1ls-lI-vHlWMNN=s0)

## Conectar directamente a la hoja de Excel como un objeto dentro del modelo

En este caso, debe traer Excel al modelo, a través de la paleta **Connectivity**:

* Arrastra el bloque **Excel File** para el modelo;
* Seleccione la hoja de trabajo deseada en la ventana **Properties**.

![](https://lh6.googleusercontent.com/GRerymSmE8Nug-BS1-nJxYd5gakRpnVMMY4N3ySuQ5UPda_oa-jaATgfpnQfacTtBzseXXDm1W1ts9DS-tuPeeUdHPzQElwauqIp3P-cI9OFxJ8lcRyBZiDercIVJsAc-Hy8dckh)

Para importar/exportar valores entre la hoja de trabajo y el modelo, hay muchas funciones, pero las principales son:

* **getCellNumericValue**(String sheetName, int rowIndex, int columnIndex): sheetName es el nombre de la hoja (por ejemplo, "Inputs"), mientras que rowIndex y columnIndex son los índices de fila/columna de la celda contado desde uno;
* **getCellDateValue**(String sheetName, int rowIndex, int columnIndex): igual que arriba, pero para una fecha;
* **setCellValue**(value, String sheetName, int rowIndex, int columnIndex): Exporta un valor a Excel. Por ejemplo: excelFile.setCellValue(2.0, "Salidas", 10, 2); exporta el valor 2.0 a la celda de la fila 10 y la columna 2 de la hoja de trabajo "Salidas";;
* **writeDataSet**(DataSet dataset, String sheetName, int rowIndex, int columnIndex):igual que arriba, pero para un dataset completo.

Por ejemplo si desea importar el valor del número de meses, está en la carpeta Entradas, en la fila 4 y columna B. El comando sería:

`excelFile.getCellNumericValue("Inputs", 4, 2)`

Si eres *excelmaníaco*, el comando anterior también acepta el formato:

`excelFile.getCellNumericValue(“Inputs!B4”)`

Todos los comandos posibles con hojas de cálculo están bien documentados en el [Help](https://help.anylogic.com/index.jsp?topic=%2Fcom.anylogic.help%2Fhtml%2Fconnectivity%2Fexcel-file.html) y hay un modelo de ejemplo absolutamente completo en AnyLogic (busque “Reading and Writing Excel Files” no menú suspenso Help, opción "Example Models") o tu puedes [ejecutar en la nube aquí](https://cloud.anylogic.com/model/99d9f196-17e7-47c3-9b28-63a6f23b0dad?mode=SETTINGS).


# Leer/Escribir en archivos txt

En la paleta **Connectivity**, ambién es posible crear conexiones directas con archivos de texto (“.txt”):

* Arrastra el elemento **Text File** para el modelo;
* Configure sus parámetros de nombre/ubicación (¡incluso puede ser un archivo con dirección de Internet!), si será de lectura y/o escritura y, si es un archivo de lectura, indique el separador (línea, tabulador, punto y coma, coma o espacio);
* En el lugar donde desea leer/escribir algo en el archivo, use el nombre del archivo, seguido del punto y la función deseada (por ejemplo: **println**, **readln**, **printf**, **readString**() etc).

Por ejemplo, registramos los resultados de las réplicas para la ocupación de las mesas de servicio en un archivo. Vamos a crear un bloque **Text file** dentro del experimento **Parameters Variation**:

![](https://lh5.googleusercontent.com/N1IdCEAaBTUnFyNa4zaIRNAbG-EJmAMPPDW4AAE6fR_JjuZUgnq4TvqxqlBniarAqJaRcShdPAEnBxPG-_0CRFi5ODs4RgsAnvbzqksDgU8YqooGV8v2FOonRnQd-oCrSRTtrxZc)

Para eso, tenemos que ir a **Experimento Parameters Variation** y agregar a la opción **After simulation run** el comando escribir en archivo.

El uso es similar a Excel. Escriba el nombre del elemento, escriba el punto final ¡plaft! (haga clic en **CTRL+Espacio**):

<img src="https://lh6.googleusercontent.com/yvgvGg8djq1bRo1AttTTG_KgHBN9cflSJiNsUSWYhRZ9nPNcgC1usFd0PRl2QwKwd35ogSpabgmqDKp9dNkpq2qGabkKlRDOMKjuI8gSVmO50EX91o1uofFFqWHXn6Z_gNMMyFqI" alt="" width="563">

En el comando anterior AnyLogic enviará al archivo, para cada escenario simulado, una línea con el número de meses de inversión en marketing y el número de clientes alcanzados en el 6º mes, separados por punto y coma (o, precisamente, un archivo tipo ".CSV").

{% hint style="info" %}
Sugerencias:

* Si desea separar por espacio de tabulación, use “\t”);
* El site Medium hay una publicación con guía completa para formatear en java:
  {% endhint %}

{% embed url="<https://medium.com/better-programming/formatting-strings-with-java-2281d40accce>" %}


# Mezclando cosas: dinámica del sistema para eventos y agentes discretos

AnyLogic es un software de simulación único que permite la construcción de **modelos híbridos** que combinan las tres técnicas de simulación.

Con este recurso es posible, entre otros ejemplos:

* Modelo de previsión de ventas con dinámica de sistemas y distribución de productos como modelo de agente;
* Encapsule modelos de dinámica de sistemas dentro de los agentes (busque el ejemplo de Población, disponible en AnyLogic);
* Modele el comportamiento del fluido que fluye de un tanque a otro;
* Representar inventarios de productos (recuerde que los diferentes SKU pueden tratarse como un Array);
* Etc.

La mejor manera de conectar los métodos es a través del bloque **Event** desde la paleta de comandos **Agent**. Practiquemos esto de dos maneras, una muy simple y la otra simple:

* Considere, por ejemplo, que está infectado con un virus que se propaga en su cuerpo a razón de 240 unidades. por día (o 10,0 unidades/h);
* Cuando alcanzas una carga viral de al menos 800 unidades, te llevan a un hospital y ocupas una de sus camas;
* El hospital tiene solo 10 camas (y solo estás tú en el mundo).

Crea un modelo llamado **Infectado** on la unidad de tiempo en **horas**.

<img src="https://lh5.googleusercontent.com/N4WwUGoGq7TcMtfNag8n1NbNo4PsockftcF-U24PXXFA0eEKntK8TbCfg8bE80dIuXShOilXM2p5m0TgOJLPQKe-iK22DZ5umOMfZz9upIztwbxBjK-cO2uqRE0IrevCbx0mQ6VI" alt="" width="563">

El modelo propuesto es muy simple:

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

Ahora viene la parte del hospital. Para aquellos que no están familiarizados con los procesos de modelado (también conocidos como "eventos discretos") de AnyLogic, sugiero leer el [Volumen I tiene un tutorial](https://tutorial.anylogicbrasil.com.br/).&#x20;

El hospital estará representado por un flujo de entrada de pacientes, espera en fila por cama, ocupación de la cama, estancia (recuperación del paciente) y alta del paciente dado de alta.

En AnyLogic la representación involucra solo 3 bloques de la paleta de **Process Modelling**: **Source**, **Queue**, **Delay** e **Sink**:

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

En el bloque **Source**, tcambie la opción de llegadas de agentes, que actualmente está establecida en una tasa de llegadas (**Rate**), para la función **inject()** de AnyLogic, que inyecta un nuevo agente cada vez que se ejecuta:

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

En el bloque **Delay**, debe establecer la duración de la estancia en **15 días** y el número de camas para **10**:

<img src="https://lh3.googleusercontent.com/bntZRnwh55cMZ6voP74XyX2lin4W6x4YACjF8oeLWMmcVZ9xWoEr314DjAxm9KmkH26w9MRbCs3RVpQFxtRipcldYey6BV-JfYVa5cFeCt8zkZ-fqECWlFAdK6JAZsZWgjB-pswb" alt="" width="563">

Para concluir, simplemente conecte los dos modelos creando un evento que desencadene una llegada al bloque **Source** siempre que la carga viral exceda **800**. Para esto tenemos el bloque **Event** que desencadena **Events** basados ​​en criterios de tiempo, tasas o condiciones.&#x20;

Necesitamos disparar un evento siempre que la condición sea verdadera:

`cargaViral > = 800`

Arrastrar un bloque **Event** la paleta **Agent** en el modelo:

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

Modifica tu propiedad **Trigger type** para **condition**:

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

Cuando la condición anterior es verdadera, queremos que el **Event** ejecute una nueva: *inyectar a un paciente en la cola del hospital*. Utilice la función **inject()** contenida en el bloque **Source**:

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

Listo… ¡Simula!

<figure><img src="https://images.unsplash.com/photo-1614728263952-84ea256f9679?crop=entropy&#x26;cs=srgb&#x26;fm=jpg&#x26;ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHwxMHx8cm9ja2V0fGVufDB8fHx8MTYzNDY0MjgwNw&#x26;ixlib=rb-1.2.1&#x26;q=85" alt="" width="375"><figcaption></figcaption></figure>

El problema podría evolucionar para considerar no solo una persona infectada, sino varias personas o una población. El ejemplo **Epidemic and Clinic with Accumulating Concern**, disponible en la lista de ejemplos de AnyLogic, presenta un modelo que considera agentes, eventos discretos y dinámicas de sistemas para estudiar la ocupación de una clínica durante una pandemia.

Como ejercicio, estudie al agente **Patient** disponible en modelo:

* Tiene tres estados posibles (susceptible, infectado o recuperado, respectivamente, los recuadros amarillo, rojo y azul));
* Cuando el paciente está en el estado infectado, el flujo (**flow**) comienza a infectar al agente a un nivel de **100 por unidad de tiempo** (días, en este caso);
* Cuando el paciente supera el **nivel de 300**, debe ir al hospital. Tenga en cuenta que el evento de **DecisionToGoToClinic** se dispara (**Trigger type**) cuando la condición (**Condition**) indica que el valor actual de **Stock Concern** ha superado los **300**. En este caso, el evento desencadena un nuevo agente en el bloque de **RequestTreatment** por el comando **take** (que está en el **Main** y lleva al agente al hospital).&#x20;

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


# Otras funciones de simulación matemática y dinámica de sistemas

Las bibliotecas disponibles en AnyLogic son variadas y extensas (incluyendo que puede importar bibliotecas Java de terceros. Yo, por ejemplo, ya importé [esta biblioteca de programación lineal](https://github.com/quantego/clp-java) para un proyecto).&#x20;

La primera fuente de información es **Help** y en este [enlace se abre el catálogo](https://help.anylogic.com/nav/3_1) de funciones separadas por tipo (matemáticas, arrays, distribuciones probabilísticas, control de tiempo, dinámica del sistema e impresión).

Para la dinámica de sistemas, se deben destacar dos bibliotecas fundamentales:

* La biblioteca [Math](https://help.anylogic.com/nav/3_1), on su arsenal de funciones matemáticas;
* [Funciones específicas de dinámica de sistemas](https://help.anylogic.com/nav/3_1_4) (delay, delay1, delay3, delayInformation, delayMaterial, forecast, gammaLog, npv, npve, pulse, pulseTrain, ramp, smooth, smooth3, step e trend).

El uso de este arsenal está más allá del alcance de este tutorial. Pero si llega al punto de usarlos, a partir de ese momento cualquier buen libro de simulación de dinámica de sistemas lo guiará hasta el ¡infinito y más allá!

¡Buen viaje!

<figure><img src="https://images.unsplash.com/photo-1454789548928-9efd52dc4031?crop=entropy&#x26;cs=srgb&#x26;fm=jpg&#x26;ixid=MnwxOTcwMjR8MHwxfHNlYXJjaHwzfHxhc3Ryb25hdXR8ZW58MHx8fHwxNjM0NjU5NzI5&#x26;ixlib=rb-1.2.1&#x26;q=85" alt="" width="188"><figcaption></figcaption></figure>


