Modèle de Schelling

Résolu/Fermé
Cleabvt Messages postés 29 Date d'inscription jeudi 20 mai 2021 Statut Membre Dernière intervention 25 mai 2021 - 20 mai 2021 à 21:42
yg_be Messages postés 22778 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 mai 2024 - 20 mai 2021 à 22:32
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 22778 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 mai 2024 1 481
20 mai 2021 à 22:32
bonjour,
merci d'utiliser les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0