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