.. -- coding: utf-8 -- .. Copyright (C) Coelho e Hitoshi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with Invariant Sections being Forward, Prefaces, and Contributor List, no Front-Cover Texts, and no Back-Cover Texts. .. shortname:: EP11 .. description:: matplotlib Exercício Programa 11: Análise e Visualização do Modelo de Schelling ==================================================================== Introdução ---------- O objetivo desse exercício é continuar a estudar arrays e introduzir o módulo `matplotlib `__ que permite a visualização de gráficos 2D a partir de arrays. Essas ferramentas são particularmente úteis na análise de dados. Para explorar essas ferramentas, nesse EP vamos investigar como a simulação do modelo de segregação de Schelling se comporta quando modificamos o critério de felicidade para: - um agente está **infeliz** se possui 2 ou mais vizinhos diferentes dele. e vamos comparar visualmente o comportamento desse novo modelo com o modelo implementado no EP anterior, onde um agente está feliz se possui ao menos 2 vizinhos como ele. Para medir a "felicidade" do povo, vamos considerar a proporção de agentes infelizes e a proporção de agentes felizes usando a mesma entrada e vendo como essa proporção se modifica ao longo do tempo. Dado um mapa com uma certa configuração de agentes, o grau de felicidade :math:`\mathcal{F}` é definido como .. math:: \mathcal{F} = \frac{F}{(F + I)} Onde :math:`F` é o número de agentes felizes e :math:`I` é o número de agentes infelizes. O grau de infelicidade :math:`\mathcal{I}` pode ser calculado como :math:`\mathcal{I} = 1 - \mathcal{F} = I/(F+I)`. O que você deve fazer (entrega segunda-feira, 30/11) ---------------------------------------------------- Escreva um programa em Python que permita comparar visualmente a evolução do grau de felicidade e infelicidade dos agentes utilizando os seguintes critérios de felicidade: A) um agente está infeliz se possui menos que 2 vizinhos como ele (feito no EP10). Ele está feliz caso contrário. B) um agente está infeliz se possui mais que 2 vizinhos diferentes dele. Ele está feliz caso contrário. Inicialmente o seu programa deve ler do teclado os seguintes valores **inteiros**: - o valor da semente a ser utilizada para o gerador de números pseudo-aleatórios; - a dimensão ``s`` da cidade que será representada por um ``array`` (= objeto da classe ``numpy.ndarray``) quadrado de dimensão ``s x s``; - a porcentagem ``porc_A`` de agentes azuis; - a porcentagem ``porc_V`` de agentes vermelhos; - o número ``n`` de iterações a serem mostradas no gráfico. A soma das porcentagens de agentes azuis e vermelhos deve ser sempre menor que 100, para permitir a existência de casas vazias. Por exemplo, quando a porcentagem de azuis é 45 e a de vermelhos é 35, o restante 20% é de casas vazias. A partir dessas informações, o seu programa deve sortear uma certa distribuição de casas na cidade, que define a condição inicial, utilizando para isso a função ``sorteia_cidade()`` fornecida abaixo: .. literalinclude:: sorteia_cidade.py :language: python A seguir, o seu programa deve executar as ``n`` iterações da simulação para cada cidade, `A` e `B`, com a mesma configuração inicial (estude o exemplo de execução mais abaixo). Na cidade `A` o critério de felicidade A deve ser aplicado, e na cidade `B`, o critério B deve ser aplicado. A cada iteração da simulação, o seu programa deve simular o comportamento dos agentes na cidade `A` e depois dos agentes na cidade `B`. A simulação implica em identificar todos os agentes infelizes na cidade, **segundo o critério da cidade**. A seguir, cada um desses agentes se move, aleatoriamente para uma casa vazia **da mesma cidade**. Ao se mudar, sua própria casa fica vazia e disponível para o sorteio do próximo agente insatisfeito. Ao final de cada iteração o grau de felicidade de cada cidade deve ser calculado e **salvo em uma lista**. Assim, o seu programa deve criar 2 listas com os índices de felicidade em cada iteração e para cada cidade. Ao final das ``n`` iterações, o seu programa deve chamar a função ``gera_grafico_1()`` passando as 2 listas como argumentos para que você vilualizar o resultado da simulação e comparar os dois critérios. A função é fornecida abaixo: .. literalinclude:: gera_grafico_1.py :language: python Apenas para mostrar como é simples gerar gráficos sofisticados usando matplotlib, você pode também usar a função ``gera_grafico_2()`` abaixo ao invés da função anterior. .. literalinclude:: gera_grafico_2.py :language: python Veja o tópico `Visualização de gráficos 2D usando matplotlib `__ para saber mais sobre o matplotlib, que facilita a criação de gráficos 2D de alta qualidade em Python. Exemplo de execução =================== Veja o exemplo de execução abaixo. Implemente o seu programa de tal forma que tenha **exatamente** o mesmo comportamento do exemplo abaixo. Por comportamento queremos dizer as mensagens e gráficos, mas devido a natureza "aleatória" das mudanças, a evolução das cidades pode não ser a mesma. .. literalinclude:: exemplo_01.txt A visualização do resultado utilizando a função `gera_grafico_1()` é mostrada abaixo: .. figure:: figs/figure_1.png :alt: resultado do exemplo usando gera_grafico_1 A visualização do resultado utilizando a função `gera_grafico_2()` é mostrada abaixo: .. figure:: figs/figure_2.png :alt: resultado do exemplo usando gera_grafico_2 Dicas e Detalhes ================ . Não deixe o EP para a última hora. . Siga as `Instruções para entrega de EPs `__. . Para saber mais sobre números pseudo-aleatórios usando NumPy, visite a documentação disponível em `http://docs.scipy.org/doc/numpy/reference/routines.random.html `__. . Para saber mais sobre o matplotlib, veja o tópico `Visualização de gráficos 2D usando matplotlib `__. . Venha tirar as dúvidas nos plantões. . Venha tirar as dúvidas nos plantões. . Veja se suas dúvidas já foram respondidas no fórum de discussão . Coloque as suas dúvidas no fórum de discussão. . Responda as suas dúvidas dos seus colegas no fórum de discussão.