Page 1 sur 1

[..] Dijkstra(encore)

Posté : ven. 26 juin 2015 20:54
par sozary
Bonsoir à tous!

Alors voilà, j'ai réessayé de faire un algorithme dijkstra comme sur le site http://openclassrooms.com/courses/le-pa ... c-dijkstra.
La dernière fois, j'avais eu recourt à votre aide, mais là je suis dans un cas que je ne comprends pas.
Mon algorithme est défaillant, mais je ne sais pas où, et croyez moi j'ai cherché!
► Afficher le texte


Bon alors je sais que le code est loin d'être clean, mais pourriez vous me dire d'où viens l'erreur svp?

P-S: Mikell, ne t’inquiète pas je bosse sur la traduction aussi :o !

Re: [..] Dijkstra(encore)

Posté : jeu. 25 janv. 2018 21:02
par MdParadis
Bonjour,
Une simple erreur dans le nom de la ville d'arrivée
Global $VilleDepart = "Bordeaux", $VilleArrivee = "Strasbourgs"

Cordialement

Re: [..] Dijkstra(encore)

Posté : dim. 28 janv. 2018 13:55
par jchd
sozary était en apnée, en attente de la solution depuis fin juin 2015. Merci d'avoir enfin fourni la réponse à son squelette.

Re: [..] Dijkstra(encore)

Posté : dim. 28 janv. 2018 20:29
par walkson
jchd, vos réponses me font souvent rire !
Mais je crains pour MdParadis ou pour sozary que la solution ne soit pas trouvée !
Si la correction de MdParadis permet d'obtenir le même résultat que Openclassrooms, si on change $VilleDepart = "Bordeaux" en une autre ville, BUG !!!
Il y a donc un problème à résoudre que je laisse à MdParadis :P ou, peut être à jchd :mrgreen:

Re: [..] Dijkstra(encore)

Posté : dim. 28 janv. 2018 20:43
par jchd
Merci mais j'ai malencontreusement d'autres graphes à fouetter tâches qui "crient famine".

Re: [..] Dijkstra(encore)

Posté : ven. 02 févr. 2018 11:08
par A2Energie
Vachement instructif cette méthode.
Merci pour le partage,

$Index = Min($Parkour, 1)
Min renvoi la valeur -1 ce qui est impossible dans le tableau : $Parkour[$Index][0]

La solution peut être de vérifier les valeurs avant de lancer le programme :
#include <array.au3>

#Region variables
Global $aVilles = [ _
        "Arras", _
        "Bordeaux", _
        "Brest", _
        "Lyon", _
        "Marseille", _
        "Montpellier", _
        "Nantes", _
        "Paris", _
        "Poitier", _
        "Strasbourg" _
        ]
_ArraySort($aVilles)

Global $aDistance = [ _             ; départ, cible, distance
        [_ArrayBinarySearch($aVilles, "Arras"), _ArrayBinarySearch($aVilles, "Nantes"), 561], _
        [_ArrayBinarySearch($aVilles, "Arras"), _ArrayBinarySearch($aVilles, "Paris"), 185], _
        [_ArrayBinarySearch($aVilles, "Arras"), _ArrayBinarySearch($aVilles, "Strasbourg"), 522], _
        [_ArrayBinarySearch($aVilles, "Bordeaux"), _ArrayBinarySearch($aVilles, "Nantes"), 334], _
        [_ArrayBinarySearch($aVilles, "Bordeaux"), _ArrayBinarySearch($aVilles, "Poitier"), 237], _
        [_ArrayBinarySearch($aVilles, "Brest"), _ArrayBinarySearch($aVilles, "Nantes"), 298], _
        [_ArrayBinarySearch($aVilles, "Brest"), _ArrayBinarySearch($aVilles, "Paris"), 593], _
        [_ArrayBinarySearch($aVilles, "Lyon"), _ArrayBinarySearch($aVilles, "Marseille"), 315], _
        [_ArrayBinarySearch($aVilles, "Lyon"), _ArrayBinarySearch($aVilles, "Montpellier"), 303], _
        [_ArrayBinarySearch($aVilles, "Lyon"), _ArrayBinarySearch($aVilles, "Paris"), 465], _
        [_ArrayBinarySearch($aVilles, "Lyon"), _ArrayBinarySearch($aVilles, "Strasbourg"), 494], _
        [_ArrayBinarySearch($aVilles, "Marseille"), _ArrayBinarySearch($aVilles, "Montpellier"), 171], _
        [_ArrayBinarySearch($aVilles, "Marseille"), _ArrayBinarySearch($aVilles, "Strasbourg"), 809], _
        [_ArrayBinarySearch($aVilles, "Montpellier"), _ArrayBinarySearch($aVilles, "Poitier"), 557], _
        [_ArrayBinarySearch($aVilles, "Montpellier"), _ArrayBinarySearch($aVilles, "Strasbourg"), 797], _
        [_ArrayBinarySearch($aVilles, "Nantes"), _ArrayBinarySearch($aVilles, "Paris"), 386], _
        [_ArrayBinarySearch($aVilles, "Paris"), _ArrayBinarySearch($aVilles, "Poitier"), 338] _
        ]

Global $Antecedants = [ _
        ["Arras", "Aucun"], _
        ["Bordeaux", "Aucun"], _
        ["Poitier", "Aucun"], _
        ["Strasbourg", "Aucun"], _
        ["Brest", "Aucun"], _
        ["Lyon", "Aucun"], _
        ["Marseille", "Aucun"], _
        ["Montpellier", "Aucun"], _
        ["Nantes", "Aucun"], _
        ["Paris", "Aucun"] _
        ]
Global $Parkour = [ _
        ["Arras", -1, "non"], _
        ["Bordeaux", -1, "non"], _
        ["Brest", -1, "non"], _
        ["Poitier", -1, "non"], _
        ["Strasbourg", -1, "non"], _
        ["Lyon", -1, "non"], _
        ["Marseille", -1, "non"], _
        ["Montpellier", -1, "non"], _
        ["Nantes", -1, "non"], _
        ["Paris", -1, "non"] _
        ]

Global $VilleDepart = "Bordeaux", $VilleArrivee = "Strasbourgs", $VilleCourante = $VilleDepart, $chemin = ""
Global $anciens[0]
#EndRegion variables

If _Arraysearch($Parkour, $VilleArrivee) = -1 Or _ArraySearch($Parkour, $VilleDepart) = -1 Then
   If _Arraysearch($Parkour, $VilleArrivee) = -1 Then MsgBox(0, "Veuillez vérifier et redéfinir la ville", "Ville définie incorrecte :" & @CRLF & "Ville d'arrivée : " & $VilleArrivee)
   If _Arraysearch($Parkour, $VilleCourante) = -1 Then MsgBox(0, "Veuillez vérifier et redéfinir la ville", "Ville définie incorrecte :" & @CRLF & "Ville de départ : " & $VilleCourante)
   Exit
EndIf

$Parkour[_ArraySearch($Parkour, $VilleDepart)][1] = 0
$Parkour[_Arraysearch($Parkour, $VilleDepart)][2] = "oui"

While 1
    If $VilleCourante = $VilleArrivee Then ExitLoop

    For $i = 0 To UBound($aDistance) - 1
        Switch $VilleCourante
            Case $aVilles[$aDistance[$i][0]]
                $VilleFille = $aVilles[$aDistance[$i][1]]

                If $Parkour[_ArraySearch($Parkour, $VilleFille)][2] = "non" Then

                    If $Parkour[_ArraySearch($Parkour, $VilleFille)][1] > $Parkour[_ArraySearch($Parkour, $VilleCourante)][1] + $aDistance[$i][2] Or $Parkour[_ArraySearch($Parkour, $VilleFille)][1] = -1 Then
                        $Parkour[_ArraySearch($Parkour, $VilleFille)][1] = $Parkour[_ArraySearch($Parkour, $VilleCourante)][1] + $aDistance[$i][2]
                        $Antecedants[_ArraySearch($Antecedants, $VilleFille)][1] = $VilleCourante
                        _ArrayAdd($anciens, $VilleFille)

                    EndIf
                EndIf

            Case $aVilles[$aDistance[$i][1]]
                $VilleFille = $aVilles[$aDistance[$i][0]]
                If $Parkour[_ArraySearch($Parkour, $VilleFille)][2] = "non" Then
                    If $Parkour[_ArraySearch($Parkour, $VilleFille)][1] > $Parkour[_ArraySearch($Parkour, $VilleCourante)][1] + $aDistance[$i][2] Or $Parkour[_ArraySearch($Parkour, $VilleFille)][1] = -1 Then
                        $Parkour[_ArraySearch($Parkour, $VilleFille)][1] = $Parkour[_ArraySearch($Parkour, $VilleCourante)][1] + $aDistance[$i][2]
                        $Antecedants[_ArraySearch($Antecedants, $VilleFille)][1] = $VilleCourante
                        _ArrayAdd($anciens, $VilleFille)
                    EndIf
                EndIf
        EndSwitch

    Next
;~     _ArrayDisplay($Parkour)
    $Index = Min($Parkour, 1)
    $VilleCourante = $Parkour[$Index][0]
    ReactualliseAncien($anciens)
WEnd

$chemin = ReformeChemin($Antecedants)
MsgBox(0, "", $chemin)

Func ReformeChemin($Tab)
    Local $VilleCourante = $VilleArrivee, $VilleFille = "", $path = ""

    While 1
        If $VilleCourante = $VilleDepart Then ExitLoop
        $path = $VilleCourante & ", " & $path
        $VilleCourante = $Antecedants[_ArraySearch($Antecedants, $VilleCourante)][1]
    WEnd
    Return StringTrimRight($path, 2) & " (" & $Parkour[_ArraySearch($Parkour, $VilleArrivee)][1] & " kilomètres)."

EndFunc   ;==>ReformeChemin

Func ReactualliseAncien($anciens)
    For $i = 0 To UBound($anciens) - 1
        $Parkour[_ArraySearch($Parkour, $anciens[$i])][2] = "oui"
    Next
    ReDim $anciens[0]

EndFunc   ;==>ReactualliseAncien

Func Min($array, $col)
    $min = 1e9
    For $i = 0 To UBound($array) - 1
        If $array[$i][$col] <= $min And $array[$i][$col] >= 0 And $array[$i][$col + 1] = "non" Then $min = $array[$i][$col]

    Next
    Return _ArraySearch($array, $min, 0, 0, 0, 0, 0, $col)
EndFunc   ;==>Min