Threading - Python - Programmation
Marsh Posté le 17-03-2013 à 14:28:43
Pour ceux qui ont ou sont en train de lire/essayer de résoudre le problème, je viens de comprendre qu'il fallait faire start sur chaque fourmi, tout simplement, dans tout les cas merci à eux
Marsh Posté le 16-03-2013 à 18:26:36
Bonjour tout le monde!
J'ai quelques problèmes concernant les Threads, surement du au fait que je n'ai toujours pas compris comment animer de nombreux objets simultanément dans un canevas à l'aide des Threads...
L'objectif du programme est de tenter de créer une colonie de fourmis (pour les connaisseurs, ant colony optimisation), celles-ci doivent partir chercher de la nourriture, et une fois trouvée, doivent la rapporter au nid en laissant derrière elles des phéromones, de manière à ce que les autres suivent le chemin (ou plus précisément l'odeur des phéromones)
Je vous passe le code de la création des fourmis étape par étape, tout en sautant la partie lourde du canvas et des créations de moultes obstacles, et si quelqu'un veut bien m'expliquer comment réussir les Threads (car ici pour faire bouger toutes les fourmis, je les prend une par une moi même), je lui en serait infiniment reconnaissant
PS: Je tiens à m'excuser pour ma manière de coder, je débute un peu, surtout en Python =/
Et pour ceux qui en ont besoin, je peux leur fournir le reste du code, même si l'architecture de celui-ci est à vomir
#### Les fourmis sont créées sur la création du nid ici ####
def ajoutnid(nbfourmi, x, y) :
global can1, ID, fourmi
nid = can1.create_oval(x-15,y-15,x+15,y+15,fill='brown', tag="NID" )
print(nid)
can1.tag_raise(nid)
acc = nbfourmi
while(acc>0) :
ID = acc + nid
fourmi = creerfourmi(can1, x, y)
can1.fourmi=fourmi
acc = acc - 1
#### Et ici la partie thread des fourmis ####
class creerfourmi(threading.Thread) :
directions = [
('N', (0, -5)),
('E', (5, 0)),
('S', (0, 5)),
('W', (-5, 0)),
('NE', (5, -5)),
('NO', (-5, -5)),
('SW', (-5, 5)),
('SE', (5, 5))
]
def __init__(self, can1, x, y) : # virer l'id via des threads
self.posX, self.posY = x, y #coordonnées initiales OK, déplacement à revoir, thread mal engagé?
self.portnourriture = 0
self.endurance=50
self.vitesse=vitesse
self.couleur=couleur
self._stopevent=threading.Event( )
r1 = random.uniform(-20,20)
r2 = random.uniform(-20,20)
self.ID=can1.create_oval(x+r1-3,y+r2+1,x+r1+3,y+r2-1,fill=couleur, tag="fourmi" )
threading.Thread.__init__(self, target=self.move)
def move(self) : #à améliorer, de manière a utiliser le thread#
#=== déplacement de la fourmi ===#
while not self._stopevent.isSet():
self._stopevent.wait(0.05)
indice = self.ID
while(indice>1) :
if(self.endurance>0) :
ran = random.choice(self.directions)[1]
r1 = tuple(ran)
can1.move(indice, r1[0], r1[1])
can1.update()
indice=indice-1
else :
can1.move(indice, self.posX, self.posY)
self.endurance = 50
self.endurance = self.endurance-1
def stop(self) :
self._stopevent.set( )