Pouknouki

Graphes

Nov 11th, 2016
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: utf-8 -*-
  2.  
  3. from support import *
  4.  
  5. # EXERCICE 1
  6.  
  7. G = {
  8.     "A" : { "F" : 35, "C" : 5 },
  9.     "F" : { "G" : 13 },
  10.     "G" : { },
  11.     "E" : { "G" : 14 },
  12.     "B" : { "E" : 15, "C" : 9 },
  13.     "D" : { "A" : 3, "B" : 12 },
  14.     "C" : { "F" : 8, "E" : 10 }
  15.     }
  16.  
  17. # [v for v in G["A"]] represente l'ensemble des sommets relies à A.
  18. print(str([v for v in G["A"]]))
  19.  
  20. # EXERCICE 2
  21.  
  22. infini = float("inf")
  23.  
  24. def BFS(G, r, distance = False):
  25.     global infini
  26.     Couleur, Pere, Dist = dict(), dict(), dict()
  27.     F = creer_file()
  28.     for u in G:
  29.         Couleur[u] = "Blanc"
  30.         Pere[u] = None
  31.         Dist[u] = infini
  32.     enfiler(F, r)
  33.     Couleur[r] = "Gris"
  34.     Dist[r] = 0
  35.     while not est_vide(F):
  36.         u = tete(F)
  37.         for v in G[u]:
  38.             if Couleur[v] == "Blanc":
  39.                 Couleur[v] = "Gris"
  40.                 Dist[v] = Dist[u] + 1 * (1 - distance) + G[u][v] * distance
  41.                 Pere[v] = u
  42.                 enfiler(F, v)
  43.         defiler(F)
  44.         Couleur[u] = "Noir"
  45.     return Dist
  46.  
  47. # Sans utiliser la vraie distance (distance en arcs)
  48. print(str(BFS(G, "A")))
  49. print(str(BFS(G, "D")))
  50. # L'algorithme ne donnera plus la vraie distance la plus courte :
  51. print(str(BFS(G, "D", True)))
  52.  
  53. # EXERCICE 3
  54.  
  55. def DFS(G, r):
  56.     P = creer_pile()
  57.     marque = {}
  58.     parcours = []
  59.     for u in G:
  60.         marque[u] = False
  61.     empiler(P, r)
  62.     while not est_vide(P):
  63.         u = sommet(P)
  64.         desempiler(P)
  65.         if not marque[u]:
  66.             marque[u] = True
  67.             parcours.append(u)
  68.             for v in G[u]:
  69.                 if not marque[v]:
  70.                     empiler(P, v)
  71.     return parcours
  72.  
  73. # Affichage du parcours en profondeur
  74. print(str(DFS(G, "A")))
  75. print(str(DFS(G, "D")))
  76.  
  77. # EXERCICE 4
  78.  
  79. def creerMatrice(G):
  80.     import numpy as np
  81.     liste = []
  82.     for i in range(len(G.keys())):
  83.         temp = []
  84.         for j in range(len(G.keys())):
  85.             temp.append(infini)
  86.         liste.append(temp)
  87.     sortedKeys = list(G.keys())
  88.     sortedKeys.sort()
  89.     for i, e in enumerate(sortedKeys):
  90.         liste[i][i] = 0
  91.         for j, v in enumerate(sortedKeys):
  92.             if G[e].get(v, -1) != -1:
  93.                 liste[i][j] = G[e][v]
  94.     return np.array(liste)
  95.  
  96. import numpy as np
  97.  
  98. def init_distances_min(n):
  99.     global infini
  100.     liste = [[0 if i == j else infini for j in range(n)] for i in range(n)]
  101.     return np.array(liste)
  102.  
  103. def iterations(distances, distances_min):
  104.     retourne = []
  105.     global infini
  106.     for i in range(len(distances)):
  107.         temp = []
  108.         for j in range(len(distances)):
  109.             temp.append(infini)
  110.         retourne.append(temp)
  111.  
  112.     for i in range(len(distances)):
  113.         for j in range(len(distances)):
  114.             retourne[i][j] = min(distances_min[i][j], min([distances[i][t] + distances_min[t][j] for t in range(len(G))]))
  115.  
  116.     return np.array(retourne)
  117.  
  118. def utiliserIterations(G):
  119.     distances = creerMatrice(G)
  120.     t = init_distances_min(len(G))
  121.     for i in range(len(G)):
  122.         t = iterations(distances, t)
  123.     return t
  124.  
  125. def itineraire_min(G, A, B):
  126.     carte = utiliserIterations(G)
Add Comment
Please, Sign In to add comment