Modèle de Schelling [Résolu]

Signaler
Messages postés
29
Date d'inscription
jeudi 20 mai 2021
Statut
Membre
Dernière intervention
25 mai 2021
-
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
-
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.

1 réponse

Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869
bonjour,
merci d'utiliser les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code