Bonjour c urgent !!
Dans le cadre de mon PFE je suis entrain de développer un plugin pour Qgis qui devrait calculer le chemin optimale entre des sites
pour le moment mon script d'algorithme dijkstra permet de me rendre le chemin le plus court entre un site et une liste de site mais moi je veux qu'il me rend les chemin le plus court entre deux liste des site) càd liste des sites de départ et liste des sites d'arrivés!!? j'ai tester de boucler sur les deux liste mais me donne un résultat qui se répète de l'aide SVP !!

mon script:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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]))
cordialement