Programme python segegation de schelling
Bonjour,
L'objectif de ce programme est de réaliser une simulation du modèle de ségrégation de schelling. L'utilisateur entre un nombre de case, le pourcentage de places vides dans celui ci, le taux de cases d'une couleur et le pourcentage de similitudes (p)entre les cases.Les cases doivent se déplacer pour avoir plus de p% de cases similaire à elle autour d'elle.
Normalement, j'ai vérifié,la fonction simulation marche correctement mais dans le tkinter, les changements de couleur des cases ne correspondent pas à la fonction simulation.
Voici le code:
from tkinter import* from random import* #définition des paramètres variables n = int(input("taille population")) v = int(input("%vide")) rr = int(input("%rouge cases restantes")) s = int(input("%similaire")) d = n * n v = round((v / 100)*d) rr = round((rr / 100)*(d-v)) p = d - (v + rr) print(d, v, rr, p) # création de la liste constituant le tableau def liste(): global l l = [[0 for k in range(n)] for q in range(n)] return(l) # fonction répartissant aléatoirement les cases de chaque couleurs def aléatoire(r): a = 0 # part de cases noires b = 0 # part de cases rouges while a != rr: x = randint(0, n - 1) y = randint(0, n - 1) if r[x][y] != 1 and r[x][y] != 2: r[x][y] = 1 a = a + 1 while b != p: x = randint(0, n - 1) y = randint(0, n - 1) if r[x][y] != 1 and r[x][y] != 2: r[x][y] = 2 b = b + 1 return(r) #établit le pourcentage de similitudes c=couleur r=grille n=population def similaire(r, i, j, n, c): simil = 0 for x in range(i - 1, i + 2): for y in range(j - 1, j + 2): if x >= 0 and y >= 0 and x < n and y < n : if r[x][y] == c or r[x][y]==0: simil = simil + 1 return(simil) def lm(r, i, j): nb = 0 for k in range(i - 1, i + 2): for q in range(j - 1, j + 2): if k != i or q != j: if k>= 0 and q >= 0 and k < len(r) and q< len(r[0]): if r[k][q] == 0: nb = nb else: nb += 1 return(nb) def simulation(r): #déplacement des couleurs sim = 0 mécontents1 = 0 mécontents2 = 0 nb = 0 m = 0 o = 0 for i in range(n): for j in range(n): lo = i * 10 ha = j * 10 if r[i][j] == 1: sim = similaire(r, i, j, n, 1) nb = lm(r, i, j) if (sim / nb) * 100 < s: mécontents1 = mécontents1 + 1 r[i][j]=0 r[i][j] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='white' ) elif r[i][j] == 2: sim = similaire(r, i, j, n, 2) nb = lm(r, i, j) if (sim / nb) * 100 < s: mécontents2 = mécontents2 + 1 r[i][j] = 0 r[i][j] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='white' ) while m != mécontents1: x = randint(0, n - 1) y = randint(0, n - 1) lo = x * 10 ha = y * 10 if r[x][y] != 1 and r[x][y] != 2: r[x][y] = 1 m = m + 1 r[x][y] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='black' ) while o != mécontents2: x = randint(0, n - 1) y = randint(0, n - 1) if r[x][y] != 1 and r[x][y] != 2: r[x][y] = 2 o = o + 1 r[x][y] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='red' ) return(r) def départ(): global g global r g = simulation(r) r = liste() l = aléatoire(r) f = Tk() ca = Canvas(f, width="600", height="600", background="white") for i in range(n): for j in range(n): lo = i * 10 ha = j * 10 if r[i][j] == 0: r[i][j] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='white' ) elif r[i][j] == 1: r[i][j] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='black' ) elif r[i][j] == 2: r[i][j] = ca.create_rectangle( lo + 10, ha + 10, lo + 20, ha + 20, outline="black", fill='red' ) Button(f, text='start', command=départ).pack() ca.pack() f.mainloop()
Merci beaucoup!
Windows / Firefox 112.0
- Programme python segegation de schelling
- Citizen code python avis - Accueil - Outils
- Programme demarrage windows - Guide
- Message programmé iphone - Guide
- Mettre en veille un programme - Guide
- Programme word gratuit - Guide
1 réponse
Bonjour,
Avant de rentrer dans le vif du sujet
- évite les caractère accentués dans le code
- suis le style PEP8, notamment:
- espace après les virgules
- espace autour des opérateurs
- les noms de variables et de fonction sont sous la forme ma_fonction ou ma_variable
- lignes pas trop longue
- merci de mettre en forme ton code (sans oublier de choisir le langage)
- évite les lignes de code trop longue
Par rapport au python
- tu peux facilement factoriser ton code
- interdis-toi les variables globales : il n'y a pas jamais de "bonne" raison pour en utiliser et toujours moyen de s'en sortir sans. Et en particulier, tu n'en as pas besoin dans ta fonction.
- essaye d'être cohérent sur les guillemets/apostrophe pour les chaînes
- essaye d'être cohérent quand tu incrémentes une variable (normalement on écrit toujours : x += 1)
- tu peux factoriser le code. Par exemple entre les lignes 146 et 171, si tu créais une variable couleur dont la valeur dépend de r[i][j], tu pourrais fortement alléger le code.
Ensuite par rapport à ton problème, peux-tu clarifier, quitte à donner un exemple et une capture d'écran ?
Bonne chance