El vecindario racista


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.


In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import vecindario as vc

Supongamos que tenemos un vecindario. Este vecindario es una matriz o casillero, en el que cada vecino puede ocupar una casilla.


In [ ]:
mundo, colores = vc.crear_mundo()
vc.vecin_print(mundo, colores,  10, 0)

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


In [ ]:
n = vc.step_mudanza(mundo, colores, 1, 10)

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.


In [ ]:
n = vc.step_multiple(mundo, colores, n, 10)

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.


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

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?


In [ ]:
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.

In [ ]:
#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)

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

¡Sorpresa! ¿Esperabas esto?

También podemos observar cómo han ido evolucionando:


In [ ]:
vc.evolucion(historia_felicidad, historia_segregacion)

¿Qué crees que pasará en un vecindario igual pero más concienciado?


In [ ]:
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.

In [ ]:
#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)

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

In [ ]:
vc.evolucion(historia_felicidad, historia_segregacion)

Al ser un requisito más restrictivo ahora, comprobamos que el porcentaje de vecinos satisfechos aumenta más lentamente, pero sin embargo, el impacto en la segregación es muy notable.

Ahora queda a tu criterio experimentar con los valores. ¡Investiga qué patrones forman las diferentes combinaciones de parámetros!

Más sobre patrones emergentes: los Patrones de Turing

Si te ha gustado cómo se pueden formar patrones como propiedad emergente de un sistema complejo, probablemente te interese investigar sobre los Patrones de Turing. Este tema también está relacionado con el anterior a traves de la importancia de la tolerancia y el respeto en la sociedad, ya que fue el último trabajo que Turing publicó antes de "suicidarse" tras ser condenado a castración química por su homosexualidad.

En sus últimos años de vida, el gran matemático Alan Turing planteó la cuestión de la teoría de la morfogénesis, es decir, cómo un ser vivo cuyas células tienen todas el mismo código genético es capaz de desarrollar una forma compleja, como extremidades, dedos, etc.

En el caso concreto de los patrones del color de la piel, estudió la posibilidad de que diferentes concentraciones de elementos químicos que reaccionan entre sí según fórmulas sencillas pudieran producirlos, y los resultados fueron sorprendentes.

Puedes encontrar una introducción al tema en estos artículos cortos:

http://francis.naukas.com/2010/09/24/alan-turing-el-genio-matematico-que-creo-la-teoria-de-la-morfogenesis-poco-antes-de-suicidarse/

http://nadaesgratis.es/anxo-sanchez/turing-y-sus-patrones-el-pionero-de-la-biologia-matematica

Imagen extraída de: http://francis.naukas.com/2009/08/08/generacion-de-patrones-espaciotemporales-en-nuevos-tipos-de-reacciones-quimicas/

Te toca trabajar

Hemos visto cómo funciona la formación de patrones cuando todos los individuos tienen las mismas características, pero... ¿Cómo se formarían si no las tuvieran?

Ve al código de la carpeta 'vecindario' y modifícalo de manera que cuando se crea la población, los individuos reciban una diferencia aletoria de magnitud controlada en sus niveles de intolerancia. ¡Observa cómo afecta este parámetro en la población!

Estas funciones pueden serte de ayuda:

np.random.rand() 
np.random.randn()

In [ ]:

Siro Moreno, Aeropython, 28 de Octubre de 2015

Basado en el ejercicio 'Segregation' del paquete Evolife del profesor Jean Louis Dessalles


In [ ]: