Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/05/2008, à 11:39

baboo

A moi les programmeurs Python !!!

Bonjour à tous !

Je suis élève en classes préparatoires et je dois réaliser un TIPE (sorte d'exposé que que je présenterai lors des oraux).
Mon sujet est (roulement de tambours) : " Optimisation d'un virus à l'aide d'un algorithme cellulaire évolutif".

Pour ceux qui connaissent les TIPE, je les entends déjà crier que je suis méga en retard.
En réalité j'ai déjà en tête tous mon dossier, il ne me reste plus que la partie programmation.

Donc mon problème actuel est de réaliser:

-mon algorithme cellulaire (déjà fait, je mettrai mon code en fin d'article)

-inclure celui ci dans un programme supérieur qui ferait tourner l'algorithme cellulaire avec différents paramètres, comparerait les résultats (le but étant de faire tomber malade le plus de cellule possible, sans pour autant les faire mourir... je passe les détails pour l'instant), et afficherait au bout de plusieurs tests les paramètres optimum.

-trouver un moyen de présenter les résultats sous formes exploitables....

Voici pour commencer le premier algorithme cellulaire que j'ai réaliser. En publiant un truc pareil je vais sûrement m'attirer les foudres des puristes (rien ou presque n'est documenter et à mon avis la simplicité et l'efficacité est loin d'être le point fort de cette réalisation, mais sachez tout de même que c'est ma toute première réalisation !!! Et quelque soit le langage : j'ai commencé Python il y a quelques semaines seulement et c'est le premier langage que j'apprends. Il m'a parut être le plus simple pour commencer et l'interface graphique facilement réalisable tait rassurante.

#-*- coding : Latin-1 -*-



###################################################################
#Programme Python libre
#Auteur : Thibault HENRY
#
#
#
###################################################################



###################################################################
#Importation des modules necessaires

from math import *
from Tkinter import *
from random import *


###################################################################
#Définition de classes

class Cellule:
    "Representant d'un élément du damier"
    def __init__(self):
        "Constructeur d'une cellule"
        self.case=[damier.create_rectangle(x,y,x+3,y+3,fill='white',outline='white',width=0)]
        self.malade = 0
        self.etat_suivant = 0
        self.x = x
        self.y = y
        self.compteur = 0
        self.immunise = 0
        self.temps_immunisation = randrange(1,30)
        self.resistance = randrange (1,6)


    def transition(self):
        if self.immunise==0:
            if self.malade==1:
                if self.compteur<self.temps_immunisation:
                    self.compteur+=1
                elif self.compteur>=self.temps_immunisation:
                    self.immunise=1
                    self.malade=0
            elif self.malade==0:
                if self.etat_suivant==1:
                    self.malade=1
                elif self.etat_suivant==0:
                    self.malade=0
        elif self.immunise==1:
            self.malade=0


##################################################################
#Definition de la boucle

def evolution():
    for i in range(1,199):
        for j in range(1,199):
            if population[i,j].immunise!=1:
                s=population[i-1,j-1].malade + population[i,j-1].malade + \
                   population[i+1,j-1].malade + population[i-1,j].malade + \
                   population[i+1,j].malade + population[i-1,j+1].malade + \
                   population[i,j+1].malade + population[i+1,j+1].malade
                if s>=population[i,j].resistance:
                    population[i,j].etat_suivant=1

    if population[0,0].immunise!=1:
        s00=population[0,1].malade + population[1,0].malade + \
             population[1,1].malade
        if s00>=population[0,0].resistance:
            population[0,0].etat_suivant=1

    if population[0,199].immunise!=1:
        s01=population[0,198].malade + population[1,198].malade + \
             population[1,198].malade
        if s01>=population[0,199].resistance:
            population[0,199].etat_suivant=1

    if population[199,0].immunise!=1:
        sh0=population[198,0].malade + population[198,1].malade + \
             population[199,1].malade
        if sh0>=population[199,0].resistance:
            population[199,0].etat_suivant=1

    if population[199,199].immunise!=1:
        shl=population[198,199].malade + population[198,198].malade + \
             population[199,198].malade
        if shl>=population[199,199].resistance:
            population[199,199].etat_suivant=1

    for k in range(1,199):
        sh=population[0,k-1].malade + population[0,k+1].malade + \
            population[1,k-1].malade + population[1,k+1].malade + \
            population[1,k].malade

        sb=population[199,k-1].malade + population[199,k+1].malade + \
            population[198,k-1].malade + population[198,k+1].malade + \
            population[198,k].malade

        sg=population[k-1,0].malade + population[k+1,0].malade + \
            population[k-1,1].malade + population[k,1].malade + \
            population[k+1,1].malade

        sd=population[k-1,199].malade + population[k+1,199].malade + \
            population[k-1,198].malade + population[k+1,198].malade + \
            population[k,198].malade

        if sh>=population[0,k].resistance:
            population[0,k].etat_suivant=1

        if sb>=population[199,k].resistance:
            population[199,k].etat_suivant=1

        if sg>=population[k,0].resistance:
            population[k,0].etat_suivant=1

        if sd>=population[k,199].resistance:
            population[k,199].etat_suivant=1


#############################################################################
#Programmation des fonctions gestionnaires d'evenements
#############################################################################


#############################################################################
#Fonctions en charge de la matrice et de son évolution

def generate_matrix():
    "Creation de la matrice de cellule"
    global x, y, population
    population={}
    for i in range (200):
        for j in range (200):
            x=i*3
            y=j*3
            population[i,j] = Cellule()

def creation_fichier():
    obFichier=open('FirstGen','w')
    for i in range(200):
        for j in range(200):
            a=randrange(200)
            if a == 0:
                obFichier.write(str(1))
            else:
                obFichier.write(str(0))
        obFichier.write('\n')
    obFichier.close()

def generation_aleatoire():
    creation_fichier()
    obFichier=open('FirstGen','r')
    for i in range(200):
        valeurs = obFichier.readline()
        for j in range(200):
            population[i,j].malade=int(valeurs[j])
    obFichier.close()

def evolution_graphique():
    for i in range(200):
        for j in range(200):
            if population[i,j].immunise==1:
                damier.itemconfigure(population[i,j].case,fill='blue',outline='blue')
            elif population[i,j].malade==0:
                damier.itemconfigure(population[i,j].case,fill='white',outline='white')
            elif population[i,j].malade==1:
                damier.itemconfigure(population[i,j].case,fill='black',outline='black')

def evolution_interne():
    for i in range(200):
        for j in range(200):
            population[i,j].transition()

def distrib():
    generation_aleatoire()
    evolution_graphique()
    evolution_interne()

def evoluer_matrice():
    evolution()
    evolution_graphique()
    evolution_interne()


############################################################################
#Fontions en charge du trace du graphe

def somme_malade():
    somme = 0
    for i in range(200):
        for j in range(200):
            somme = somme + population[i,j].malade
    return somme

def somme_immunise():
    somme = 0
    for i in range(200):
        for j in range(200):
            somme = somme + population[i,j].immunise
    return somme

def evoluer_graphique():
    sm = somme_malade()
    si = somme_immunise()
    ss = 40000-sm-si
    graph.create_rectangle( (int(compteur) *4) +1, 600-((int(sm)*3)/200) ,(int(compteur) *4) +2 , 600-((int(sm)*3)/200) +1,\
                 fill='black', outline='black',width=4)
    graph.create_rectangle( (int(compteur) *4) +1, 600-((int(si)*3)/200) ,(int(compteur) *4) +2 , 600-((int(si)*3)/200) +1,\
                 fill='blue', outline='blue',width=4)
    graph.create_rectangle( (int(compteur) *4) +1, 600-((int(ss)*3)/200) ,(int(compteur) *4) +2 , 600-((int(ss)*3)/200) +1,\
                 fill='green', outline='green',width=4)

###############################################################################
#Fontions en charge de l'évolution commune

def distribuer():
    distrib()
    evoluer_graphique()

def evoluer_commun():
    global compteur
    evoluer_matrice()
    evoluer_graphique()
    compteur+=1
    if flag>0:
        fen.after(10,evoluer_commun)

def evoluer_commun_continu():
    global flag
    if flag==0:
        flag=1
        evoluer_commun()

def stop():
    global flag
    flag=0

###########################################################################
#----------------Programme principal-------------------------------------
###########################################################################


###########################################################################
#Les varaibles suivantes seront utilisées de manière globale

flag=0
h=600
l=600
compteur=0

###########################################################################
#Creation du widget principal

fen=Tk()
fen.title('Modelisation epidomiologique')

###########################################################################
#Creation des widgets esclaves

damier = Canvas(fen,bg='white',height=h,width=l)
damier.grid(row=1,column=1)
graph = Canvas(fen, bg='white',height=h,width=l)
graph.grid(row=1,column=3)

Button(fen,text='Clear',command=generate_matrix).grid(row=3,column=1)
Button(fen,text='Distribuer',command=distribuer).grid(row=2,column=1)
generate_matrix()

Button(fen,text='Evoluer',command=evoluer_commun).grid(row=2,column=3)

Button(fen,text='Start',command=evoluer_commun_continu).grid(row=2,column=2)
Button(fen,text='Stop',command=stop).grid(row=3,column=2)

Button(fen,text='Quitter', command=fen.quit).grid(row=3,column=3)

fen.mainloop()

fen.destroy()

Je vais éditer ce post dès maintenant pour documenter le code et peut être commencer quelques modifications. Ensuite j'exposerai mes problèmes au fur et à mesure.

Si pour commencer vous pouvez suivre un minimum mon sujet et me donner des conseils pour améliorer ce premier code ce serait sympa.

Merci d'avance pour toute réponse, et surtout poser des questions dès qu'elles vous passent par la tête, d'une façon ou d'une autre elles pourront peut être m'aider.

Dernière modification par baboo (Le 15/05/2008, à 22:25)

Hors ligne