Fonction python qui ne fonctionne pas

Fermé
Audrey - 17 juin 2022 à 15:48
 Utilisateur anonyme - 17 juin 2022 à 18:59
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
A voir également:

7 réponses

Utilisateur anonyme
17 juin 2022 à 15:51
Bonjour
En Python, l’indentation est primordiale, or par défaut le site ne la conserve pas.
Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
On pourra commencer à essayer de t’aider quand tu auras reposté correctement ton code.
1
 #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)           
0
Voilà, désolée pour les tentatives ratées avant la bonne forme
0
Utilisateur anonyme
17 juin 2022 à 16:22
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
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
17 juin 2022 à 18:24
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.

0
"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)
0
Utilisateur anonyme
17 juin 2022 à 18:59
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.

0