%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import vecindario as vc

"""
Explanation: El vecindario racista: el modelo de segregación de Schelling
La segregación racial es un problema en muchas partes del mundo desde hace mucho tiempo. A pesar de que ciertos colectivos han realizado un gran esfuerzo por solucionarlo, muchos países continúan segregados por razones étnicas, de credo, sexo, riqueza, etc. ¿Por qué es un problema tan complicado de resolver?
En 1971, el economista americano Thomas Schelling creó un modelo basado en agentes que podría ayudar a explicar por qué la segregación es un problema tan complicado de combatir. Su modelo de segregación mostraba que individuos o "agentes" que no eran especialmente rigurosos respecto a su entorno tendían aún así a segregarse con el tiempo. A pesar de que el modelo es especialmente simple, permite una interesante perspectiva sobre cómo los individuos pueden tender a segregarse, a pesar de no tener un especial deseo por hacerlo.
(Traducción de http://nifty.stanford.edu/2014/mccown-schelling-model-segregation/ )
(Enlace al paper original de Schelling para Harvard: http://www.stat.berkeley.edu/~aldous/157/Papers/Schelling_Seg_Models.pdf )
Planteamiento
Para este ejercicio usaremos numpy, matplotlib y el código que está en la carpeta vecindario.
End of explanation
"""


mundo, colores = vc.crear_mundo()
vc.vecin_print(mundo, colores,  10, 0)

"""
Explanation: Supongamos que tenemos un vecindario. Este vecindario es una matriz o casillero, en el que cada vecino puede ocupar una casilla.
End of explanation
"""


n = vc.step_mudanza(mundo, colores, 1, 10)

"""
Explanation: Aquí podemos ver un pequeño vecindario, con vecinos azules y rojos. También hay espacios libres que no están ocupados por nadie.
Cada vecino se ve afectado por las 8 casillas que tiene a su alrededor. En principio, no le molesta la presencia de vecinos de un color diferente, pero si la proporción de vecinos de su mismo color es de sólo 1/3 o menos, se sentirá incomodado y deseará marcharse.
En el gráfico superior, los vecinos incomodados tienen unas esquinas grises, mientras que los vecinos confortables no.
Estos vecinos que se sienten incómodos se mudarán en cuanto puedan. Para representar esto, repasaremos la lista de vecinos, detectando a los que quieren mudarse, y cambiarán de sitio a una casilla nueva aleatoria que esté vacía.
Esto representa un 'step'.
End of explanation
"""


n = vc.step_multiple(mundo, colores, n, 10)

"""
Explanation: Podemos comprobar que aunque los individuos no prefieren ningún tipo de segregación, y su única condición es que al menos 1/3 de sus vecinos sean del mismo color que ellos, al cabo de unos pocos steps la segregación en grupos homogéneos ha aparecido como propiedad emergente.
End of explanation
"""


mundo, colores = vc.crear_mundo(intom = 90)
n = vc.step_multiple(mundo, colores, 0, 10, numsteps=100)

"""
Explanation: Cómo podemos evitar esta situación?
Existe una sencilla manera de evitarlo: que los individuos activamente trabajen para evitar la segregación. La manera de implementar esto es muy sencilla: basta con que también se sientan incómodos si más del 90% de sus vecinos son iguales a ellos para obtener cambios sustanciales en la segregación del grupo.
End of explanation
"""


dim = 50 #Tamaño del lado de la matriz
vacios = 10 #Porcentaje de huecos
colors = 3 #Número de colores
prop = [0.33, 0.33]
n = 0
intolerance = 33 #Porcentaje mínimo de vecinos iguales
intom = 100 #Porcentaje máximo de vecinos iguales
rad = 1 # Radio en el que el color de los vecinos se comprueba 
historia_felicidad = [] # Aquí vamos a almacenar la felicidad del grupo en cada step
historia_segregacion = []# Y aquí, el valor de la segregación.

#Veamos cómo comienza la simulación, con los vecinos repartidos aleatoriamente.
par, datacolor = vc.crear_mundo(dim, colors= colors, prop= prop, vacios = vacios,
                             intolerance=intolerance, intom= intom, rad = rad,
                            h_fel = historia_felicidad, h_seg = historia_segregacion)

vc.vecin_print(par, datacolor, dim, n)

#Qué pasará dentro de 50 steps?
n = vc.step_multiple(par, datacolor, n, dim,
           historia_felicidad, historia_segregacion, 50)

"""
Explanation: Extendiendo el algoritmo
Ahora que ya hemos visto cómo trabaja este modelo, vamos a jugar un poco con sus parámetros. ¿Te atreves a predecir cómo influirán estos números en un vecindario de tres colores?
End of explanation
"""


vc.evolucion(historia_felicidad, historia_segregacion)

"""
Explanation: ¡Sorpresa! ¿Esperabas esto?
También podemos observar cómo han ido evolucionando:
End of explanation
"""


intom = 90 #Porcentaje máximo de vecinos iguales
n = 0 #Vamos a comenzar de 0
historia_felicidad = [] # Aquí vamos a almacenar la felicidad del grupo en cada step
historia_segregacion = []# Y aquí, el valor de la segregación.

#Veamos cómo comienza la simulación, con los vecinos repartidos aleatoriamente.
par, datacolor = vc.crear_mundo(dim, colors= colors, prop= prop, vacios = vacios,
                             intolerance=intolerance, intom= intom, rad = rad,
                            h_fel = historia_felicidad, h_seg = historia_segregacion)

vc.vecin_print(par, datacolor, dim, n)

#Qué pasará dentro de 50 steps?
n = vc.step_multiple(par, datacolor, n, dim,
           historia_felicidad, historia_segregacion, 50)

vc.evolucion(historia_felicidad, historia_segregacion)

"""
Explanation: ¿Qué crees que pasará en un vecindario igual pero más concienciado?
End of explanation
"""


