1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
import sys
import struct
#from PyQt4.QtCore import *
#from PyQt4.QtGui import *
#from qgis.core import *
#from qgis.gui import *
#from qgis.networkanalysis import *
class Vertex:
def __init__(self, node):
self.id = node
self.adjacent = {}
# Set distance to infinity for all nodes
self.distance = sys.maxsize
# Mark all nodes unvisited
self.visited = False
# Predecessor
self.previous = None
def add_neighbor(self, neighbor, weight=0):
self.adjacent[neighbor] = weight
def get_connections(self):
return self.adjacent.keys()
def get_id(self):
return self.id
def get_weight(self, neighbor):
return self.adjacent[neighbor]
def set_distance(self, dist):
self.distance = dist
def get_distance(self):
return self.distance
def set_previous(self, prev):
self.previous = prev
def set_visited(self):
self.visited = True
def __str__(self):
return str(self.id) + ' adjacent: ' + str([x.id for x in self.adjacent])
class Graph:
def __init__(self):
self.vert_dict = {}
self.num_vertices = 0
def __iter__(self):
return iter(self.vert_dict.values())
def add_vertex(self, node):
self.num_vertices = self.num_vertices + 1
new_vertex = Vertex(node)
self.vert_dict[node] = new_vertex
return new_vertex
def get_vertex(self, n):
if n in self.vert_dict:
return self.vert_dict[n]
else:
return None
def add_edge(self, frm, to, cost = 0):
if frm not in self.vert_dict:
self.add_vertex(frm)
if to not in self.vert_dict:
self.add_vertex(to)
self.vert_dict[frm].add_neighbor(self.vert_dict[to], cost)
self.vert_dict[to].add_neighbor(self.vert_dict[frm], cost)
def get_vertices(self):
return self.vert_dict.keys()
def set_previous(self, current):
self.previous = current
def get_previous(self, current):
return self.previous
def shortest(v, path):
''' make shortest path from v.previous'''
if v.previous:
path.append(v.previous.get_id())
shortest(v.previous, path)
return
import heapq
def dijkstra(aGraph, start, target):
print ("Le chemain plus courte par Dijkstra")
# Set the distance for the start node to zero
start.set_distance(0)
# Put tuple pair into the priority queue
unvisited_queue = [(v.get_distance(),v) for v in aGraph]
heapq.heapify(unvisited_queue)
while len(unvisited_queue):
# Pops a vertex with the smallest distance
uv = heapq.heappop(unvisited_queue)
current = uv[1]
current.set_visited()
#for next in v.adjacent:
for next in current.adjacent:
# if visited, skip
if next.visited:
continue
new_dist = current.get_distance() + current.get_weight(next)
if new_dist < next.get_distance():
next.set_distance(new_dist)
next.set_previous(current)
print('chemain le plus court : de = %s vers = %s avec une distance = %s ') \
%(current.get_id(), next.get_id(), next.get_distance())
else:
print ('chenmain pas court : de = %s vers = %s car il existe un chemain court = %s ') \
%(current.get_id(), next.get_id(), next.get_distance())
# Rebuild heap
# 1. Pop every item
while len(unvisited_queue):
heapq.heappop(unvisited_queue)
# 2. Put all vertices not visited into the queue
unvisited_queue = [(v.get_distance(),v) for v in aGraph if not v.visited]
heapq.heapify(unvisited_queue)
if __name__ == '__main__':
g = Graph()
g.add_vertex('a')
g.add_vertex('b')
g.add_vertex('c')
g.add_vertex('d')
g.add_vertex('e')
g.add_vertex('f')
g.add_vertex('i')
g.add_vertex('g')
g.add_vertex('k')
g.add_vertex('l')
g.add_vertex('h')
g.add_edge('a', 'b', 7)
g.add_edge('a', 'f', 9)
g.add_edge('f', 'b', 9)
g.add_edge('f', 'i', 14)
g.add_edge('a', 'i', 5)
g.add_edge('f', 'e', 3)
g.add_edge('b', 'e', 10)
g.add_edge('i', 'g', 15)
g.add_edge('g', 'e', 11)
g.add_edge('g', 'l', 2)
g.add_edge('l', 'k', 6)
g.add_edge('k', 'h', 9)
g.add_edge('h', 'e', 1)
g.add_edge('h', 'd', 9)
g.add_edge('d', 'c', 5)
g.add_edge('d', 'e', 1)
g.add_edge('k', 'h', 7)
print ('Graph data:')
for v in g:
for w in v.get_connections():
vid = v.get_id()
wid = w.get_id()
print ('%s , %s, %3d' % ( vid, wid, v.get_weight(w)))
site_depart=['a','b','c',]
site_arriver=['g','l','k']
for i in range((len(site_depart))):
for j in range(len(site_arriver)):
dijkstra(g, g.get_vertex(site_depart[i]), g.get_vertex(site_arriver[j]))
target = g.get_vertex(site_arriver[i])
path = [target.get_id()]
shortest(target, path)
print ('Le chemin optimale %s : %s' %(site_arriver[j], path[::-1])) |
Partager