Modèle de Schelling

Résolu
Cleabvt Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Dans le cadre d'un projet en informatique nous devons nous inspirer du modèle de ségrégation de Schelling pour modéliser l'évolution d'une population (dans notre cas il s'agit d'une population de gnous et de zèbres). Cependant, lors de notre modélisation nous ne comprenons pas pourquoi des individus restent insatisfaits alors qu'ils pourraient bouger sur des cases où ils deviendraient satisfaits. Voici notre code:

import random as rd
import matplotlib.pyplot as pl
import numpy as np

Nous avons crée une matrice aléatoire:

def savaneground(x1,x2,n):
g=x1/1200000#pourcentage de gnous
z=x2/1200000#pourcentage de zèbres
nvg = int(g*n*n)
nvz = int(z*n*n)
nv0 = n*n - nvg - nvz
L = nvg*[1] + nvz*[2] + nv0*[0]#nombre de 0, 1 et 2 dans la matrice
rd.shuffle(L)#on mélange la liste
return np.reshape(np.array(L, dtype=int), (n,n))

Etudié les voisins de chaque case (nombre de cases voisines, d'individus de type 1 ou 2). Au final nous retournons une matrice de liste à 3 valeurs:

def voisins(M, x, y,n):
V = [0, 0, 0]
for Dx in (-1, 0, 1):
for Dy in (-1, 0, 1):
if (Dx, Dy) != (0,0):
xx = x + Dx
yy = y + Dy
if (xx >= 0) and (xx < n) and (yy >= 0) and (yy < n):
V[0] = V[0] + 1
a = M[xx,yy]
if a != 0 :
V[a] = V[a] + 1
return V

def NbVoisins(M,n):
R = np.zeros((n,n,3), dtype=int)
for x in range(n):
for y in range(n):
for tp in (0,1, 2):
R[x, y, tp] = voisins(M, x, y, n)[tp]
return R

Puis nous regardons de taux de similaires:

def TauxSimilaires(M,n):
R = np.zeros((n,n))
NbV = NbVoisins(M,n)
for x in range(n):
for y in range(n):
if M[x,y]!=0:
tp = M[x,y]
if (NbV[x,y,1]+NbV[x,y,2])!=0:
R[x,y] = NbV[x,y,tp]/(NbV[x,y,1]+NbV[x,y,2])
else:
R[x,y]=0
else:
R[x,y]=0
return R

Si ce taux est inférieur à un seuil, l'individu bouge sur la matrice:

def Evolution (M,seuil,n):
TS = TauxSimilaires(M,n)
for x in range(n):
for y in range(n):
a = M[x,y]
if a != 0 and TS[x,y] < seuil:
Nx = rd.randint(0,n-1)
Ny = rd.randint(0,n-1)
if M[Nx, Ny] == 0 & (Nx!=x or Ny!=y):
lv = voisins(M, Nx, Ny,n)
if (lv[1]+lv[2])!=0:
pv = lv[a]/(lv[1]+lv[2])
if pv>seuil :
M[x,y] = 0
M[Nx,Ny] = a
else:
pv=0
M[x,y] = 0
M[Nx,Ny] = a
return M

Puis nous compilons nos fonctions pour modéliser l'évolution:

def CouleursIni(M,n):
sol=(1,0.8,0.3)
gnous=(0.8,0.4,0)
zèbres=(0.5, 0.5, 0.5)
Aff = np.zeros((n,n),dtype=int)
for x in range(n):
for y in range(n):
if M[x,y] == 0: # rien
Aff[x,y,:] = sol
if M[x,y] == 1:
Aff[x,y,:] = zèbres
if M[x,y] == 2:
Aff[x,y,:] = gnous
return Aff

def Couleurs(M, TS,n,seuil):
Aff = np.zeros((n,n,3),dtype=np.uint8)
for x in range(n):
for y in range(n):
if M[x,y] == 0:
Aff[x,y,:] = (220,215,80)
else:
if TS[x,y]>seuil:
if M[x,y]==1:
Aff[x,y,:] = (167,110,20)
elif M[x,y]==2:
Aff[x,y,:] = (200,200,200)
else:
Aff[x,y,:] = (128,128,128)
return Aff

def compilation(n,x1,x2,seuil,ite):
M=savaneground(x1,x2,n)
TS=TauxSimilaires(M,n)
pl.ion()
pl.figure(1)
image = pl.imshow(Couleurs(M,TS,n,seuil))
pl.show()
pl.pause(0.01)
i=0
while pl.fignum_exists(1) and i<ite:
M =Evolution(M,seuil,n)
image.set_data(Couleurs(M,TS,n,seuil))
image.changed()
pl.draw()
pl.pause(0.01)
i=i+1
pl.ioff()
pl.show()

print(compilation(50,200000,200000,0.2,70))

Nous pensons que notre erreur provient de la dernière fonction Evolution. En tout si quelqu'un voit où est notre problème nous serons ravi de communiquer avec lui. Merci d'avance pour votre aide. Très cordialement.
A voir également:

1 réponse

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 583
 
bonjour,
merci d'utiliser les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0