Vous êtes sur la page 1sur 4

Université de Rouen

L3 Informatique-Sciences des données


Algorithmique des graphes

Fiche de travaux pratiques n. 1

Prise en main rapide de Python. Notions utiles : listes, tuples, deques, dictionnaires,
fichiers, tableau numpy, slicing. Bibliothèques math, matplotlib, numpy. Program-
mation impérative de quelques algorithmes sur les graphes.

Le TP est à rendre sur la page universiTICE associée au cours, en util-


isant le fichier TP1-AlgoGraphes.py

1 Notions utiles
1. Un programme en Python est formé d’une suite d’instructions. Une instruction
simple est contenue dans une seule ligne. Pour une instruction plus longue,
le symbole \, en fin de ligne, permet de poursuivre l’écriture de l’instruction
sur la ligne suivante. Il ne doit rien y avoir derrière ce symbole, ni espace, ni
commentaires.

2. Le symbole dièse, ♯, permet d’ajouter des commentaires.

3. Python utilise l’indentation obligatoire du code. Indenter (décaler avec un


espace blanc) les lignes d’un script permet de définir une dépendance d’un
bloc de lignes par rapport à un autre. Toutes les instructions avec la même
distance vers la droite appartiennent au même bloc du script. Si un bloc doit
être imbriqué plus profondément par rapport à un autre, il est mis en retrait
plus à droite.

4. L’instruction print permet d’afficher n’importe quelle information. À partir


de la version 3, print est une fonction, tout ce qui doit être affiché doit l’être
entre parenthèses.

5. Contrairement à d’autres langages de programmation (C ou Java), une affec-


tation en Python est une association d’une variable avec un objet contenant
une valeur. L’affectation x = 15 a comme effet :
- la création d’un objet immuable de type int, dont la valeur est 15 à une
adresse mémoire
- la création d’une variable x
- l’association de la variable x avec l’objet de valeur 15.
L’instruction y = x affecte à y l’adresse mémoire associé à x. L’instruction
x = 20 crée un nouvel objet, dont la valeur est 20, et affecte son adresse
mémoire à la variable x. Ainsi, print(x) donne 20 et print(y) donne 15.
On retrouve les mêmes résultats pour toutes les variables de type immuable :
bool, int, float, complex, str et tuples.
Pour les variables de type muable (liste, dictionnaire, deque, tableau numpy
ou classe), Python donne la possibilité d’exécuter une copie profonde. La suite
d’instructions :
-L1 = [1, 2, 3]
-import copy
-L2 =copy.deepcopy(L1 )
exécute une copie profonde de L1 en réalisant la création d’une nouvelle liste
L2 et en copiant tous les éléments de L1 dans L2 (avec une nouvelle adresse
mémoire pour L2 ). Dans ce cas, L1 et L2 n’ont plus la même adresse mémoire.

6. Le mot clé import, permet d’importer (et donc d’utiliser) des bibliothèques
Python ou d’autres fichiers écrit en Python (modules).

7. Les arguments d’entrée d’une fonction en Python sont tous passés par
référence. On considère deux cas :
Objets muables : toute modification de cet objet dans la fonction est visible
en dehors de la fonction. C’est “l’effet de bord” puisque la fonction modifie
des données définies hors de sa portée locale.
Objets immuables : toute modification de cet objet dans la fonction n’est pas
visible en dehors de la fonction.

8. Un programme bien écrit en Python (comme dans tout autre langage de pro-
grammation) est composé de plusieurs modules courts (10-20 lignes) et com-
mentés, chacun avec un objectif clair.

Il est souvent utile de consulter de tutoriels pour obtenir des informations sur la
syntaxe de Python (surtout si vous ne l’avez jamais pratiqué). En voici quelqu’uns
(mais il y en beaucoup d’autres) :
Tutoriel officiel python :
https : //docs.python.org/f r/3/tutorial/index.html
Cours python :
https : //python.sdv.univ − paris − diderot.f r
http : //www.courspython.com
http : //www.normalesup.org/ doulcier/teaching/python/02 paradigmes.html

Pour une prise en main rapide des notions fondamentales de Python, lancez Pyzo
et ouvrez le fichier TP1Graphes.py.

2
2 Programmation impérative en Python
Exercice 1 Soit G le graphe orienté suivant, donné par sa matrice d’adjacence :
 
0 0 0 1 1
 1 0 0 0 1 
 
M=  1 0 0 0 0 
 0 0 1 0 0 
0 0 1 0 0

1. Écrivez la matrice M en utilisant un tableau numpy.

2. Écrivez la fonction successeurs, d’arguments une matrice d’adjacence M d’un


graphe orienté G et l’un des sommets i de G, renvoyant la liste des successeurs
de i. Testez votre fonction sur M.

3. Écrivez la fonction prédécesseurs, d’arguments une matrice d’adjacence M


d’un graphe orienté G et l’un des sommets i de G, renvoyant la liste des
prédécesseurs de i. Testez votre fonction sur M.

4. Écrivez la fonction estchemin, d’arguments une matrice d’adjacence M d’un


graphe orienté G et une liste de sommets L de G, renvoyant vrai si L cor-
respond à un chemin de G et faux sinon. Testez sur L1 = (2, 1, 5, 3, 1) et
L2 = (4, 3, 5, 1, 4).

5. Écrivez la fonction versionNO,qui prende en entrée la matrice d’adjacence M


d’un graphe orienté G et renvoye en sortie la matrice d’adjacence de la version
non orienté de G. Testez votre fonction sur M.

Exercice 2 Soit G un graphe non orienté orienté suivant, donné par ses listes de
voisins : (1 : 2, 3, 5), (2 : 1, 5, 9), (3 : 1, 4, 5, 7), (4 : 3, 7), (5 : 1, 2, 3, 6, 8, 9), (6 :
5, 8, 9), (7 : 3, 4, 8), (8 : 5, 6, 7, 9), (9 : 2, 5, 6, 8)
1. Définissez un dictionnaire dico répresentant le graphe G. Chaque clé est as-
sociée à un sommet i. La valeur de la clé associée à i est la liste des sommets
voisins de i.

2. Écrivez la function voisins, d’arguments un dictionnaire dico répresentant un


graphe non orienté G et l’un des sommets i de G, renvoyant la liste des suc-
cesseurs de i.

3. Écrivez la function degré, d’arguments un dictionnaire dico répresentant un


graphe non orienté G et l’un des sommets i de G, revoyant le nombre de
voisins de i.

4. Écrivez la fonction deMaTL, d’argument un tableau numpy M répresentant


un graphe non orienté G, renvoyant un dictionnaire dico répresentant le même
graphe G.

3
5. Écrivez la fonction deTLaM, d’argument un dictionnaire dico répresentant un
graphe non orienté G, renvoyant un tableau numpy M répresentant le même
graphe G.

Exercice 3 En utilisant les fichiers en Python, écrire la fonction graphematrix qui


permet de transformer un fichier texte contenant une matrice de booléens en un
tableau numpy et la fontion grapheadj qui permet de transformer un fichier texte
qui contient la liste des successeurs ou voisins d’un graphe en dictionnaire.

Exercice 4 En vous inspirant du code suivant :

import math
import matplotlib.pyplot as plt
import numpy as np
x=[1, 3, 4]
y=[3, 1, 5]
plt.axis([-1, 5, -1, 6])
plt.plot(x,y, color=’r’, linestyle=’-’, marker=’o’)
plt.show()

écrivez un module python qui permet de dessiner la version non orienté du graphe
de l’exercice 1.

Vous aimerez peut-être aussi