Fonction python qui ne fonctionne pas

Bonjour,
J'ai une fonction python à faire pour aujourd'hui. Elle ne fonctionne pas . Le but est de faire une fonction avec pour arguments une proportion d'individus rouges (le reste est bleu), et un nombre de voisins de même couleur minimum. Avec un plot, à chaque tour, la fonction doit vérifier si chaque individu a son nombre de voisins, puis si ce n'est pas le cas, recalculer une position aléatoire (matrice de 100x100).
Mon programme est le suivant (uniquement la partie qui recalcule la position):
b=0
r=0
ini=1
while ini!=0:
for i in range(0,99):
for j in range(0,99):
if matpr[i,j]>voisins:
ini=0
else:
for i in range(0,99):
for j in range (0,99):
if mat[i,j]>0:
if matpr[i,j]<voisins:
if mat[i,j]==1:
mat[i,j]==0
b+=1
elif mat[i,j]==2:
mat[i,j]==0
r+=1

while b>0 or r>0 :
a=rd.randint(0,99)
d=rd.randint(0,99)
if mat[a,d]==0:
c=rd.randint(1,2)
if c==1 and b>0:
mat[a,d]=1
b=b-1
elif c==2 and r>0:
mat[a,d]=2
r=r-1

for i in range (0,100):
for j in range (0,100):
if mat[i,j]==1:
plt.plot(i,j,color="blue",marker=".")
plt.xlim(0,101)
plt.ylim(0,101)
elif mat[i,j]==2:
plt.plot(i,j,color="red",marker=".")
plt.xlim(0,101)
plt.ylim(0,101)
plt.pause(0.25)

mat c'est la matrice avec des 1 pour bleu et 2 pour rouge, matpr c'est une matrice avec la proportion de voisins pour la même position dans mat.

Configuration: Windows / Edge 102.0.1245.44

7 réponses

  1. Il y a déjà un point crucial que je n'avais pas compris, la grille n'est pas pleine, 4000 sur 10000.
    Ensuite le nombre de voisins d'un individu est de la même population (ou couleur) que lui et donc c'est un peu plus contraint (mais en soit plus logique).

    Par contre dans cette partie d'énoncé, je ne vois pas ce qui permet d'affirmer qu'il y a 8 voisins.
    Et il manque au moins une dernière information car la fonction doit avoir 3 paramètres et tu n'en cites que 2.

    1. "On suppose que l’espace est une surface carrée de 100 unités de côté et on dispose aléatoirement
      4000 individus (2000 de chaque population par exemple) dans cet espace, chaque individu occupant
      une unité de l’espace (deux individus ne peuvent pas se trouver sur la même unité). On observe
      ensuite la dynamique de la population en lui fixant une seule contrainte : chaque individu souhaite
      avoir au moins un certain pourcentage de ses voisins de la même population que lui (l’utilisateur
      choisira ce seuil). A chaque étape, on passe en revue chaque individu et on le déplace aléatoirement
      (à une place libre) si la contrainte individuelle n’est pas satisfaite. Les déplacements sont terminés
      lorsque tous les individus ont satisfait cette contrainte.
      Le programme sera une fonction (codée en Python) prenant en entrée trois paramètres : la proportion
      de la première population (celle de la seconde étant déduite), le pourcentage de voisins relatif à la
      contrainte individuelle. "
      Ca prend donc en compte les 8 voisins autour (comme un démineur)
      1. Je ne suis pas sûr de bien comprendre ton énoncé, et je n'ai pas analysé ton code, dès fois que ça m'induise en erreur.

        une proportion d'individus rouges (le reste est bleu)
        , là OK, par exemple, il doit y avoir 30% de rouges
        et un nombre de voisins de même couleur minimum
        , là déjà c'est moins clair. Déjà, pour ton exercice "voisin", c'est
        • (1) une "case" qui a un coté commun (dans ce cas à part en bordure de matrice, 4 voisins par case)
        • (2) un case qui a un coté ou un angle commun (dans ce cas à part en bordure de matrice, 8 voisins par case)
        • (3) autre, dans ce cas détaille.


        Ensuite l'idée de nombre minimum de voisins de même couleur, c'est étonnant non ? , supposons le cas (2),
        • Avec minimum de 1 voisin de même couleur, ça marchera tout le temps, il y aura toujours au moins un voisin rouge ou un voisin bleu.
        • Avec 2 mini, y'a de forte chances que ça marche tout très souvent, au moins 2 voisins rouges ou 2 voisins bleus, sur 8 voisins c'est assez facile.
        • Pour 3, on va y arriver, si la proportion n'est pas trop proche du 50/50.
        • Pour 4 ça va commencer à se compliquer surtout si on est à une proportion proche de 50%, ça voudrait dire se rapprocher aléatoirement du damier parfait ce qui n'est pas du tout aléatoire
        • Pour 5, ça ne peut fonctionner que si la proportion est déséquilibrée
        • Pour 6 encore plus de déséquilibre
        • Pour 7 et 8 encore, encore plus de déséquilibre.


        Quoiqu'il en soit à partir de 4 ça risque de pédaler longtemps avant de faire une grille qui marche.

        1. J'ai l'impression d'avoir fait trop complexe avec trop de boucle. Du coup mon programme est très lent, il avance mais est très lent.
          1. Voilà, désolée pour les tentatives ratées avant la bonne forme
            1. Ce n'est pas encore tout à fait ça, comme tu n'as pas forcé "Python", il n'y a ni ascenseurs ni couleur.
              Je vais corriger
          2.  #faire un nouveau plot selon la proportion
                    b=0
                    r=0
                    ini=1
                    while ini!=0:
                        for i in range(0,99):
                            for j in range(0,99):
                                if matpr[i,j]>voisins:
                                    ini=0
                                else:
                                    for i in range(0,99):
                                        for j in range (0,99):
                                            if mat[i,j]>0:
                                                if matpr[i,j]<voisins:                    
                                                    if mat[i,j]==1:
                                                        mat[i,j]==0
                                                        b+=1
                                                    elif mat[i,j]==2:
                                                        mat[i,j]==0
                                                        r+=1
                                            
                        while b>0 or r>0 :
                            a=rd.randint(0,99)
                            d=rd.randint(0,99)
                            if mat[a,d]==0:
                                c=rd.randint(1,2)
                                if c==1 and b>0:                
                                    mat[a,d]=1
                                    b=b-1
                                elif c==2 and r>0:    
                                    mat[a,d]=2
                                    r=r-1
                                    
                        for i in range (0,100):
                            for j in range (0,100):
                                if mat[i,j]==1:
                                    plt.plot(i,j,color="blue",marker=".")
                                    plt.xlim(0,101)
                                    plt.ylim(0,101)            
                                elif mat[i,j]==2:
                                    plt.plot(i,j,color="red",marker=".")
                                    plt.xlim(0,101)
                                    plt.ylim(0,101) 
                        plt.pause(0.25)