Le TPE sera réalisé en Python, en se basant sur :
In [1]:
from igraph import *
import igraph
import pandas as pd
print igraph.__version__
La matrice préalablement préparée au format CSV, avec des points-virgules en tant que séparateur, est chargé avec la libraire Pandas. On indique à Pandas :
In [2]:
#Chargement de la matrice
matrice = pd.read_csv('matrice.csv', header=0, index_col=0, sep=';')
#Affichage de la matrice sous forme de tableau
print matrice
In [3]:
# Get the values as np.array, it's more convenenient.
valeurs = matrice.values
# Create graph, A.astype(bool).tolist() or (A / A).tolist() can also be used.
graphe = igraph.Graph.Adjacency((valeurs > 0).tolist())
# Add edge weights and node labels.
graphe.es['weight'] = valeurs[valeurs.nonzero()]
graphe.vs['label'] = matrice.index # or a.index/a.columns
graphe.vs['name'] = graphe.vs['label']
graphe.es['width'] = valeurs[valeurs.nonzero()]
print graphe
Dessinons le graphe pour le rendre plus intelligible. La verison actuelle d'igraph ne supporte pas encore l'affichage des poids des arcs. Pour compenser, les arcs seront plus épais selon leur poids.
In [4]:
layout = graphe.layout('kk')
visual_style = {}
visual_style["vertex_size"] = 20
visual_style["vertex_label"] = graphe.vs["name"]
visual_style["layout"] = layout
visual_style["vertex_color"] = 'blue'
visual_style["margin"] = 20
visual_style["vertex_label_size"] = 12
visual_style["vertex_label_dist"] = 1
visual_style["margin"] = 75
plot(graphe, **visual_style)
Out[4]:
In [60]:
res = Graph.shortest_paths(graphe, source='Charlotte',target='Sophia', mode='OUT', weights = graphe.es['weight'])
print res[0][0]
In [64]:
path = graphe.get_shortest_paths(graphe.vs.select(name='Charlotte')[0], to = 'Sophia', weights = graphe.es['weight'], mode='OUT', output = 'vpath')
print "Le chemin le plus court (durée %i) est le suivant : " %res[0][0]
for step in path[0] :
print graphe.vs[step].attributes()['name']