Programme python segegation de schelling

Fermé
Potoschnick - Modifié le 21 avril 2023 à 21:14
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 21 avril 2023 à 21:24

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

1 réponse

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
21 avril 2023 à 21:24

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

0