graphes et python

publicité
Graphes et
Python
2016-2017
Prof : Simon
Plouffe, IUT
Corrigé du DS
Question 1
Il s’agissait de trouver le développement en f.c. de 2.
Comme vu en classe, le développement est [2,2,2,2,…] qui
correspond aux fractions successives suivantes.
Qu’on peut trouver à la main en remarquant que les termes du
numérateur et dénominateurs satisfont à la récurrence
𝑥𝑛+1 = 2𝑥𝑛 + 𝑥𝑛−1 ou se servir de la calculatrice pour obtenir les
premiers termes.
Ce qui correspond aux formats A0, A2, A4.
Corrigé du DS
Question 2
Développer un algorithme n’utilisant que l’addition pour avoir le
développement en f.c.
En Maple on a :
Ou en Python
Question 3 : trouver une façon de détecter une période dans une liste
(limitée à 1000 termes), sachant que le développement d’une f.c. d’un
irrationnel quadratique est toujours périodique.
Maple :
mil := proc(s)
local v, nn, cand, ll, k, pos, som, nb, m;
v := s;
nn := nops(s);
ll := [];
for pos from 1/2*nn by -1 to 1 do
nb := floor((nn - 1)/pos);
som := sum(v[n*pos + 1], n = 0 .. nb);
if som = v[1]*(nb + 1) then ll := [op(ll), pos]
end if
end do;
return min(ll)
end;
En Python
import math
import numpy
def mil (s):
v=s
nn = len(s)
ll = []
for pos in numpy.arange(nn / 2, 0, -1):
nb = math.floor((nn - 1) / pos)
r=0
for n in numpy.arange(0, nb + 0.10e1, 0.10e1):
r = r + v[n * pos + 1]
som = r
if som == v[0] * (nb + 1):
ll = [tuple(ll),pos]
return(min(ll))
La théorie des graphes
Initiée par Euler en 1736.
La question à l'origine de la théorie des graphes est due à
Euler, en 1736 : dans cette partie de la ville de
Königsberg.
Peut‐on, lors d'une promenade, revenir à notre point de
départ en empruntant une, et une seule fois, chaque pont ?
Pour y répondre, Euler a introduit le graphe suivant, les
arcs symbolisent les ponts ; les sommets, les quatre zones
terrestres.
Tous les sommets sont impairs (nombre de liens) et pour
avoir un circuit fermé il faut que les sommets soient
pairs.
D’où la définition :
On appelle une chaîne eulérienne une chaîne contenant une et une seule fois toutes les
arêtes du graphe.
On appelle un circuit eulérien un circuit contenant une et une seule fois toutes les
arêtes du graphe.
Ou dit autrement : Un graphe connexe est eulérien si et seulement si chacun de ses
sommets est incident à un nombre pair d'arêtes.
Donc, on ne peut pas parcourir les 7 ponts en 1 seule marche.
L'essentiel de la notion de graphe
Lorsqu'on passe d'un sommet a un autre en se deplacant le long d'arêtes et
de sommets, on dit que l'on définit un chemin dans le graphe. On peut par
exemple définir le chemin g, 3, a, 2, h, 5, b, 7, f dans le graphe ci-dessus.
Exemples de situations modélisées par un graphe
Représentation informatique d'un graphe
Exemple de codage : utilisation d'un dictionnaire python
Matrice d’adjacence ?
Le graphe suivant a donc cette matrice
La matrice d'incidence d'un graphe est une matrice qui décrit le graphe en indiquant
quels liens arrivent sur quels sommets.
Cas du graphe non orienté
Cas du graphe orienté
La notion de pile et de file
Les notions de pile et de file sont deux structures de données abstraites
importantes en informatique.
On limite ci-dessous la présentation de ces notions aux besoins des
parcours de graphes envisages ci-après.
Parcours en largeur : principe de l'algorithme
Parcours sur un graphe
Algorithme de Dijkstra (1959)
C’est l’algorithme du plus court chemin dans un graphe
On veut se rendre de a à e par le chemin le plus économique (temps, distance, cout).
Il est de complexité polynomiale.
Le principe
L'algorithme prend en entrée un graphe orienté pondéré par des réels positifs et un
sommet source. Il s'agit de construire progressivement un sous-graphe dans lequel
sont classés les différents sommets par ordre croissant de leur distance minimale au
sommet de départ. La distance correspond à la somme des poids des arcs empruntées.
Au départ, on considère que les distances de chaque sommet au sommet de départ sont
infinies sauf pour le sommet de départ pour lequel la distance est de 0. Le sous-graphe
de départ est l'ensemble vide.
Au cours de chaque itération, on choisit en dehors du sous-graphe un sommet de
distance minimale et on l'ajoute au sous-graphe. Ensuite, on met à jour les distances des
sommets voisins de celui ajouté. La mise à jour s'opère comme suit : la nouvelle distance
du sommet voisin est le minimum entre la distance existante et celle obtenue en
ajoutant le poids de l'arc entre sommet voisin et sommet ajouté à la distance du sommet
ajouté.
On continue ainsi jusqu'à épuisement des sommets (ou jusqu'à sélection du sommet
d'arrivée).
Exemple sur un graphe (non orienté) : on veut aller de A à J.
On peut aussi résumer l'exécution de l'algorithme de Dijkstra avec un tableau. Chaque
étape correspond à une ligne. Une ligne donne les distances courantes des sommets
depuis le sommet de départ.
Une colonne donne l'évolution des distances d'un sommet donné depuis le sommet de
départ au cours de l'algorithme. La distance d'un sommet choisi (car minimale) est
soulignée. Les distances mises à jour sont barrées si elles sont supérieures à des
distances déjà calculées.
Le tableau donne la distance et le chemin : J – H – C – A.
Le calcul du chemin le plus court peut se faire de plusieurs façons
Avec des bulles de savon on peut résoudre le problème :
steiner tree soap dans google image
Schéma d'algorithme
initialisation
Fonction principale
Il existe une bonne variété d’algorithmes implantés en Python qu’on peut
trouver sur internet. Parmi la masse, certains utilisent des ‘dict’ simples, d’autres
des structures faisant appel à des modules extérieurs.
1- Trouver une bonne implémentation de l’algorithme en Python utilisant une structure
simple (def --- return) , dict.
2- Se familiariser avec ‘dict’ et la lecture de listes d’éléments d’un dictionnaire (graphe).
3- Coder un graphe et résoudre un exemple.

Lectures de chevet et ouvrages à
consulter
Matrice d’adjacence:
https://fr.wikipedia.org/wiki/Matrice_d%27adjacence

Le problème du postier chinois :
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_postier_chinoi
s

Le voyageur de commerce :
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_voyageur_de_co
mmerce

Graphe hamiltonien :
https://fr.wikipedia.org/wiki/Graphe_hamiltonien

La théorie des graphes :
https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes

Larges extraits de la présentation : Jean-Manuel Meny du IREM de
LYON

Algorithme de Dijkstra sur wikipedia :
https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra

Video expliquant la méthode : https://www.youtube.com/watch?v=rHylCtXtdNs

Algorithme en Python : http://stackoverflow.com/questions/22897209/dijkstrasalgorithm-in-python
Téléchargement