Académique Documents
Professionnel Documents
Culture Documents
TP Recherche
Opérati onnelle
2022 - 2023
Exercice 1 :
Partie I :
( )
0 5 3 2 ∞ ∞ ∞ ∞
5 0 1 ∞ 2 2 ∞ ∞
3 1 0 1 ∞ ∞ ∞ ∞
2 ∞ 1 0 3 ∞ 2 ∞
1. la matrice d’adjacence A du graphe : A=
∞ 2 ∞ 3 0 4 4 ∞
∞ 2 ∞ ∞ 4 0 1 7
∞ ∞ ∞ 2 4 1 0 6
∞ ∞ ∞ ∞ ∞ 7 6 0
import numpy as np
0
[3, 1, 0, 1, np.inf, np.inf, np.inf, np.inf],
> print(A)
[[0, 5, 3, 2, inf, inf, inf, inf], [5, 0, 1, inf, 2, 2, inf, inf], [3, 1, 0, 1, inf, inf, inf, inf], [2, inf, 1, 0, 3, inf, 2, inf], [inf, 2, inf, 3, 0, 4, 4,
inf], [inf, 2, inf, inf, 4, 0, 1, 7], [inf, inf, inf, 2, 4, 1, 0, 6], [inf, inf, inf, inf, inf, 7, 6, 0]]
3. La fonction degres(M) qui prends en argument la matrice d’adjacence M d’un graphe et qui
retourne les degrés de ses sommets :
import numpy as np
def degres(M):
for i in range(V):
degre = sum([1 for j in range(V) if M[i][j] != 0 and M[i][j] != np.inf ]) # on prend 1 pour chaque éléments
dans la ligne ou il est n’est nulle et diffèrent de l’infinie
1
return degres_des_sommes
> degres(A)
[3, 4, 3, 4, 4, 4, 4, 2]
4. La fonction eulerien(M) qui prends en argument la matrice d’adjacence M d’un graphe et qui
permet de détecter si le graphe est eulérien, semi-eulérien ou non. On appelons la fonction
degres(M)
def eulerien(M):
degrés = degres(M) # on appelle la fonction précédente (degres(M) pour travailler sur chaque degré du sommet
if nb_sommets_pairs == len(M):
return "eulérien"
return "semi-eulérien"
else:
2
return "non eulérien"
> eulerien(A)
'semi-eulérien'
Partie II :
5. la fonction Dijkstra(S, M) permettant de déterminer les plus courts chemin du sommet S vers
le reste des sommets du graphe de matrice d’adjacence M.
import numpy as np
n = len(M)
for v in Q:
u=v
3
Q.remove(u) # retirer u de l'ensemble des sommets non encore visités
return D
> S=0
> Dijkstra(S,A)
[0, 4, 3, 2, 5, 5, 4, 10]
7. Modification sur la fonction précédente pour afficher l’arborescence des plus courts chemins
issus du sommet S.
n = len(M)
4
for v in Q:
u=v
pred[v] = u
for v in range(n):
if v != S:
path = [v]
v = pred[v]
path.append(v)
print("Le plus court chemin de", S, "à", path[0], "passe par les sommets", list(reversed(path)))
# Voilà le résultat obtenu par l’exécution de cette fonction sur le graphe précédent
> S=0
> Dijkstra(S,A)
5
8. une présentation claire de l’algorithme Floyd-Warshall.
def FloydWarshall(M):
n = len(M)
#la fonction vérifie si le chemin de i à j
F = M.copy() en passant par le sommet k est plus
court que le chemin actuel de i à j. Si
for k in range(n):
c'est le cas, la distance de i à j dans la
matrice F est mise à jour avec la
for i in range(n):
distance du nouveau chemin.
for j in range(n):
6
return F
> FloydWarshall(A)
Exercice 2 :
Pour traiter ce problème on va utiliser le logarithme est une fonction mathématique qui
permet de transformer des multiplications en additions, et puisque le graphe contient des arcs de
poids négatifs et positifs, ça ne guide à utiliser l'algorithme de Bellman-Ford pour trouver le plus
longs chemin.
Pour utiliser l'algorithme de Bellman-Ford pour trouver le plus long chemin au lieu du plus
court chemin, simplement on inverse les poids de tous les arcs du graphe. Cela signifie que les arcs
qui avaient un poids positif auront maintenant un poids négatif, et vice versa.
Log100
07
Implémentation de la matrice d’adjacence A de ce graphe sur Python :
import numpy as np
import math as ma
import numpy as np
import math as ma
8
[-np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf]]