IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Python erreur dans mon programme


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Par défaut Python erreur dans mon programme
    Bonjour,

    Je suis en T°S spé ISN et j'ai un Dm à rendre pour dans deux semaines, le but étant d'améliorer l'algorithme de Dijkstra avec ce que l'on connais, voire un peu plus.

    Voici mon code :

    from tkinter import *



    Nvilles = 6 # On définit le nombre de ville par défault, ici 6.

    i=0 # Compteur pour la boucle
    u=0

    L0=[] # liste de base pour la matrice avec les distances entre les villes
    L1=[]
    L2=[]
    L3=[]
    L4=[]
    L5=[]

    while i<=6: # Remplissage des listes par l'utilisateur avec les distances qu'ils souhaitent sous forme de matrice
    i=i+1
    while u<6:
    nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville A."))
    L0.append (nombre)
    u=u+1
    i=i+1
    u=0
    while u<6:
    nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville B."))
    L2.append (nombre)
    u=u+1
    u=0
    i=i+1
    while u<6:
    nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville C."))
    L2.append (nombre)
    u=u+1
    u=0
    i=i+1
    while u<6:
    nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville D."))
    L3.append (nombre)
    u=u+1
    u=0
    i=i+1
    while u<6:
    nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville E."))
    L4.append (nombre)
    u=u+1
    u=0
    i=i+1
    while u<6:
    nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville F."))
    L5.append (nombre)
    u=u+1
    i=i+1

    m_adjac = [L0,L1,L2,L3,L4,L5]



    """ ALGROITME DE DIJKSTRA """
    DIJ=list()
    for i in range (Nvilles):
    DIJ.append([1000000,"X","N"])
    ville_select=0
    dist_interm=0
    while ville_select != Nvilles-1:
    minimum=1000000
    for n in range (1,Nvilles):
    if DIJ[n][2]=="N":
    dist=m_adjac[ville_select][n]
    dist_totale=dist_interm+dist
    if dist !=0 and dist_totale < DIJ[n][0]:
    DIJ[n][0]=dist_totale
    DIJ[n][1]=ville_select
    if DIJ[n][0]<minimum:
    minimum=DIJ[n][0]
    pville_select=n
    ville_select=pville_select
    DIJ[ville_select][2]="0"
    dist_interm=DIJ[ville_select][0]
    for i in range(1,Nvilles):
    print (DIJ[i])
    print ("\n")
    chemin=list()
    ville=Nvilles-1
    chemin.append(ville)
    while ville !=0:
    ville=DIJ[ville][1]
    chemin.append(ville)
    print ("plus court chemin, à lire à l'envers : ",chemin)
    print ("distance totale : ",DIJ[Nvilles-1][0])



    Mafenetre = Tk()
    Mafenetre.title('Alogrithme de Dijkstra')
    Mafenetre.geometry('300x300+300+300')
    Affichage = Label(Mafenetre, text="Le chemin le plus est (à lire à l'envert) est :")
    Affichage.pack()
    Affichage = Label(Mafenetre, text=(chemin))
    Affichage.pack()
    bouton=Button(Mafenetre,text='Quiter',command=Mafenetre.destroy)
    bouton.pack()
    Mafenetre.mainloop()




    Lorsque je lance l'algo tous va bien pour ma boucle de création de matrice, et des que j'ai finis il me met une erreure : "IndexError: list index out of range". Et je ne vois absolument pas d'où cela pourrait venir ...

    Merci de vos réponses !

    Guillaume (ps: l'incrémentation ne marche pas à cause du copier coller je pense)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Sans les indentations, votre programme est illisible.
    Essayez de le reposter en le mettant entre les balises code/code: jouez avec le "#" qui est dans le menu d’édition des messages.
    Il s'agit d'obtenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from tkinter import *
    Nvilles = 6 # On définit le nombre de ville par défault, ici 6.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Par défaut
    Oui pardon je ne savais pas comment faire, sa devrait être mieux la !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    from tkinter import *
     
     
     
    Nvilles = 6     # On définit le nombre de ville par défault, ici 6.
     
    i=0      # Compteur pour la boucle
    u=0
     
    L0=[]   # liste de base pour la matrice avec les distances entre les villes
    L1=[]
    L2=[]
    L3=[]
    L4=[]
    L5=[]
     
    while i<=6:          # Remplissage des listes par l'utilisateur avec les distances qu'ils souhaitent sous forme de matrice
        i=i+1
        while u<6:
            nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville A."))
            L0.append (nombre)
            u=u+1
        i=i+1
        u=0
        while u<6:
            nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville B."))
            L2.append (nombre)
            u=u+1
        u=0
        i=i+1
        while u<6:
            nombre=int(input("Entrer les 6 distances entre les villes en fonction de votre ville C."))
            L2.append (nombre)
            u=u+1
        u=0
        i=i+1
        while u<6:
            nombre=int(input("Entrer les 6 distances entre les villes en fonction  de votre ville D."))
            L3.append (nombre)
            u=u+1
        u=0
        i=i+1
        while u<6:
            nombre=int(input("Entrer les 6 distances entre les villes en fonction  de votre ville E."))
            L4.append (nombre)
            u=u+1
        u=0
        i=i+1
        while u<6:
            nombre=int(input("Entrer les 6 distances entre les villes en fonction  de votre ville F."))
            L5.append (nombre)
            u=u+1
        i=i+1
     
    m_adjac = [L0,L1,L2,L3,L4,L5]
     
     
     
    """ ALGROITME DE DIJKSTRA """
    DIJ=list()
    for i in range (Nvilles):
        DIJ.append([1000000,"X","N"])
    ville_select=0
    dist_interm=0
    while ville_select != Nvilles-1:
        minimum=1000000
        for n in range (1,Nvilles):
            if DIJ[n][2]=="N":
                dist=m_adjac[ville_select][n]
                dist_totale=dist_interm+dist
                if dist !=0 and dist_totale < DIJ[n][0]:
                        DIJ[n][0]=dist_totale
                        DIJ[n][1]=ville_select
                if DIJ[n][0]<minimum:
                        minimum=DIJ[n][0]
                        pville_select=n
        ville_select=pville_select
        DIJ[ville_select][2]="0"
        dist_interm=DIJ[ville_select][0]
        for i in range(1,Nvilles):
            print (DIJ[i])
        print ("\n")
    chemin=list()
    ville=Nvilles-1
    chemin.append(ville)
    while ville !=0:
        ville=DIJ[ville][1]
        chemin.append(ville)
    print ("plus court chemin, à lire à l'envers : ",chemin)
    print ("distance totale : ",DIJ[Nvilles-1][0])
     
     
     
    Mafenetre = Tk()
    Mafenetre.title('Alogrithme de Dijkstra')
    Mafenetre.geometry('300x300+300+300')
    Affichage = Label(Mafenetre, text="Le chemin le plus est (à lire à l'envert) est :")
    Affichage.pack()
    Affichage = Label(Mafenetre, text=(chemin))
    Affichage.pack()
    bouton=Button(Mafenetre,text='Quiter',command=Mafenetre.destroy)
    bouton.pack()
    Mafenetre.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Pas facile de s'assurer que votre code cohérent avec le pseudo-code présenté ici.

    En regardant ce qui est saisi, on dirait que toutes les villes sont reliées entre elles: a chaque "ville" saisie une distance vers les 5 autres est entrée.

    Vous voulez faire quoi exactement?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Par défaut
    De base notre prof nous a donné ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Nvilles=6
     
    L0=[0,3,1,0,0,0]  
    L1=[3,0,1,2,0,0]
    L2=[1,1,0,3,5,0]
    L3=[0,2,3,0,1,3]
    L4=[0,0,5,1,0,1]
    L5=[0,0,0,3,1,0]
     
    m_adjac=[L0,L1,L2,L3,L4,L5]
     
    DIJ=list()
    for i in range (Nvilles):
        DIJ.append([1000000,"X","N"])
    ville_select=0
    dist_interm=0
    while ville_select != Nvilles-1:
        minimum=1000000
        for n in range (1,Nvilles):
            if DIJ[n][2]=="N":
                dist=m_adjac[ville_select][n]
                dist_totale=dist_interm+dist
                if dist !=0 and dist_totale < DIJ[n][0]:
                        DIJ[n][0]=dist_totale
                        DIJ[n][1]=ville_select
                if DIJ[n][0]<minimum:
                        minimum=DIJ[n][0]
                        pville_select=n
        ville_select=pville_select
        DIJ[ville_select][2]="0"
        dist_interm=DIJ[ville_select][0]
        for i in range(1,Nvilles):
            print (DIJ[i])
        print ("\n")
    chemin=list()
    ville=Nvilles-1
    chemin.append(ville)
    while ville !=0:
        ville=DIJ[ville][1]
        chemin.append(ville)
     
    print ("plus court chemin, à lire à l'envers : ",chemin)
    print ("distance totale : ",DIJ[Nvilles-1][0])
    Le but du DM est de commenter le code, et d'en apporter une amélioration.
    Ce que je voulais faire, c'est que l'utilisateur puisse entrer lui même la matrice qu'il souhaite ( elle comporte la distance entre les villes)et ensuite afficher le plus court chemin dans une fenêtre Tkinter.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Dans ce cas, c'est que les variables avec lesquelles travaillent l'algo. ne sont pas construites comme attendu.
    A mon sens, la première amélioration a faire est de mettre le précieux boulot du prof dans une boite appelée fonction: on se concentre sur ce qui entre et ce qui sort sans trop s'occuper du détail.
    Ca donne un fonction plus_court_chemin a qui on balance une matrice d'adjacence et qui retourne les résultats affiches.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    # -*- coding: utf-8 -*-
    def plus_court_chemin(m_adjac):
        Nvilles = len(m_adjac)
        DIJ=list()
        for i in range (Nvilles):
            DIJ.append([1000000,"X","N"])
        ville_select=0
        dist_interm=0
        while ville_select != Nvilles-1:
            minimum=1000000
            for n in range (1,Nvilles):
                if DIJ[n][2]=="N":
                    dist=m_adjac[ville_select][n]
                    dist_totale=dist_interm+dist
                    if dist !=0 and dist_totale < DIJ[n][0]:
                        DIJ[n][0]=dist_totale
                        DIJ[n][1]=ville_select
                    if DIJ[n][0]<minimum:
                        minimum=DIJ[n][0]
                        pville_select=n
            ville_select=pville_select
            DIJ[ville_select][2]="0"
            dist_interm=DIJ[ville_select][0]
            ## for i in range(1,Nvilles):
            ##     print (DIJ[i])
            ## print ("\n")
        chemin=list()
        ville=Nvilles-1
        chemin.append(ville)
        while ville !=0:
            ville=DIJ[ville][1]
            chemin.append(ville)
        return chemin[::-1], DIJ[Nvilles-1][0]
     
    if __name__ == '__main__':
     
        Nvilles=6
     
        L0=[0,3,1,0,0,0]  
        L1=[3,0,1,2,0,0]
        L2=[1,1,0,3,5,0]
        L3=[0,2,3,0,1,3]
        L4=[0,0,5,1,0,1]
        L5=[0,0,0,3,1,0]
     
        m_adjac=[L0,L1,L2,L3,L4,L5]
        chemin, total_distance = plus_court_chemin(m_adjac)
     
        print ("plus court chemin: ",chemin)
        print ("distance totale : ", total_distance)
    Cela fait, peut importe comment seront saisies les villes ou affiche le résultat... pourvu que cela respecte ce qui est attendu par la fonction. (i.e. l'interface)

    - W
    edit: oops, j'ai remplace "chemin.reverse()" par chemin[::-1].

    PS: une amelioration a faire serait le choix du depart et de l'arrivee.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Erreur dans mon programme en Python
    Par florichoute dans le forum Général Python
    Réponses: 1
    Dernier message: 28/04/2009, 15h08
  2. Réponses: 1
    Dernier message: 18/04/2008, 04h33
  3. je ne trouve pas l'erreur dans mon programme
    Par Briska dans le forum Débuter
    Réponses: 19
    Dernier message: 04/04/2008, 09h21
  4. [Help] Erreurs dans mon programme
    Par Tacha dans le forum Langage
    Réponses: 13
    Dernier message: 02/10/2006, 13h57
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo