Dijkstra’s algorithm Python implementation

Here is my implementation of Dijkstra’s algorithm (also known as the shortest path) in Python. I wrote it for a project at school and put it there for memory only.

Note:

  • I don’t test the graph.
  • Graph is oriented. If you want a non-oriented graph, you need to add vertices twice in your graph.
  • May be improved (time).

Here is the source (on Friendpaste):

def dijkstra(graph, start, end):
    """
    Dijkstra's algorithm Python implementation.

    Arguments:
        graph: Dictionnary of dictionnary (keys are vertices).
        start: Start vertex.
        end: End vertex.

    Output:
        List of vertices from the beggining to the end.

    Example:

    >>> graph = {
    ...     'A': {'B': 10, 'D': 4, 'F': 10},
    ...     'B': {'E': 5, 'J': 10, 'I': 17},
    ...     'C': {'A': 4, 'D': 10, 'E': 16},
    ...     'D': {'F': 12, 'G': 21},
    ...     'E': {'G': 4},
    ...     'F': {'H': 3},
    ...     'G': {'J': 3},
    ...     'H': {'G': 3, 'J': 5},
    ...     'I': {},
    ...     'J': {'I': 8},
    ... }    
    >>> dijkstra(graph, 'C', 'I')
    ['C', 'A', 'B', 'I']

    """

    D = {} # Final distances dict
    P = {} # Predecessor dict

    # Fill the dicts with default values
    for node in graph.keys():
        D[node] = -1 # Vertices are unreachable
        P[node] = "" # Vertices have no predecessors

    D[start] = 0 # The start vertex needs no move

    unseen_nodes = graph.keys() # All nodes are unseen

    while len(unseen_nodes) > 0:
        # Select the node with the lowest value in D (final distance)
        shortest = None
        node = ''
        for temp_node in unseen_nodes:
            if shortest == None:
                shortest = D[temp_node]
                node = temp_node
            elif D[temp_node] < shortest:
                shortest = D[temp_node]
                node = temp_node

        # Remove the selected node from unseen_nodes
        unseen_nodes.remove(node)

        # For each child (ie: connected vertex) of the current node
        for child_node, child_value in graph[node].items():
            if D[child_node] < D[node] + child_value:
                D[child_node] = D[node] + child_value
                # To go to child_node, you have to go through node
                P[child_node] = node

    # Set a clean path
    path = []

    # We begin from the end
    node = end
    # While we are not arrived at the beggining
    while not (node == start):
        path.insert(0, node) # Insert the predecessor of the current node
        node = P[node] # The current node becomes its predecessor

    path.insert(0, start) # Finally, insert the start vertex
    return path
Posted in None at February 15th, 2010. Comments.

Installer Sphinx sous Ubuntu

Voila la petite astuce pour installer sans encombre Sphinx (le générateur de documentation Python) sous Ubuntu. J’ai effectué cette manip’ avec la version 9.04 du système.

Avant tout, il faut installer les dépendances (python-dev) et ce qui va nous faciliter la vie (python-setuptools) :

$ sudo apt-get install python-dev python-setuptools

Une fois que c’est terminé, vous pouvez ensuite utiliser l’outil easy_install pour installer directement Sphinx :

$ sudo easy_install -U Sphinx

Et voila !

Posted in None at May 19th, 2009. Comments.

“Choisis Python”

Juste un petit message pour dire que je viens de tomber sur cette affiche en furetant un peu partout.

Après quelques recherche, je vois que c’est du déjà vu en fait :)

(ces problèmes de tags commencent à me les briser. Mais quand on a pas le temps …)

Posted in None at December 17th, 2008. Comments.

Django : Python, c’est plus fort que toi !

Aujourd’hui”hui, je vais vous présenter Django, “Le framework web pour les perfectionnistes sous pression” ! Avouez que c”est déjà pas mal comme slogan. Je vais parler ici de mon expérience personnelle d’amateur qui pratique l”informatique sur son temps libre. Donc tout ce que je peux raconter ici peut apparaître totalement FAUX à un expert en la matière, mais bon, faut bien se lancer un jour hein :) .

Les fondations

Comment creuser la base, ou la mise en place du framework dans un environnement Linux / Apache 2 / Mysql 5.

Pour ma part, je réalise tout mes essais sur mon serveur (enfin, c’est plutôt ronflant comme nom, il ne s’agit que d”un Pentium 2 avec 18Go de disque dur qui fait un bruit d”enfer hein) qui tourne sous Debian (Lenny). Pour l”installation, il m’a suffit d’installer le module Python pour Apache (facilement grâce à Aptitude). J’ai ensuite installé Django en lui même (ce qui se résume à télécharger la version en cours de développement puis créer 2-3 liens symboliques, du gâteau quoi), puis paramétrer mon httpd.conf (de même, processus très simple grâce à la très bonne documentation très bien traduite par David Larlet. Résultat, en partant de rien, un framework fonctionnel disponible en production en tout juste 5 petites minutes.

Le commencement

Où on s’assoit bien droit correctement sur sa chaise, qu’on retrousse ses manches, réajuste ses lunettes, ferme toutes les applications autres que le navigateur, et qu’on ferme la porte du bureau.

J’ai encore été agréablement surpris : la documentation est abondante. D’une part, la doc’ du site officiel qui couvre un très grosse partie et qui permet de bien dégrossir le travail. Ensuite, cette même documentation (et un peu plus) traduite sur Django-fr. Finalement, je suis tombé sur The Django Book (aussi disponible en livre papier). De toute façon, la communauté est loin d’être minime, et Google is your (only?) friend, donc pas de quoi s’inquiéter.

Au bout d”une quarantaine de minutes, on réalise une application de votes fonctionnelle (sobre, mais efficace), le tout avec très peu de code et le moteur proprement séparé de l’affichage. Que du bonheur !

Oui mais non !

“Un cri retentit dans la salle de bains…” (Tribulations, Chapitre 2, Verset XVI) Que du bonheur mais … sans compter un petit problème (que je n”ai pas réussit à résoudre, mais je cherche encore !) : la gestion des accents et de l’UTF-8 dans l”interface d”administration auto générée. En effet, Django vous génère une interface permettant l”administration de la base de donnée suivant les modèles que vous avez définit dans votre application, le tout de manière sobre et fonctionnelle. Pour ma part, un problème intervient au moment où je veux utiliser des accents dans du texte, là, il aime pas ! Mais je pense que le problème vient de moi de toute façon.

Au final

Pour le moment, je ne dispose pas encore d”assez d”éléments pour juger et émettre un point de vue plus approfondit sur Django, mais pour l’instant, voici mon bilan : Un gain de temps inimaginable : très peu de code, si les modèles de données sont bien pensés dès le départ, tout va tout seul. Des templates pratiques : Ils permettent d”étendre d’autres templates, de pouvoir émettre des valeurs par défaut et remplaçables avec des systèmes de blocs. Propreté : Le code généré est très propre, ainsi que la séparation entre les structures et l’interface. Seul point négatif pour le moment : ce problème d’accents.

Le mot de la fin : Je vais bientôt prendre un hébergement 60GP chez OVH. Mon but sera d”y développer mon espace perso (un blog surtout), en utilisant uniquement Django. Je vais tenir au courant de comment tout cela se passe.

Posted in None at November 21st, 2008. Comments.