示例#1
0
def dijkstrasssp(s, inizio, g: Graph):
    d, p = initsssp(s, inizio, g)  # inizializzazione di: d, p
    # coda di priorità Q (heap binaria)
    # i valori sono coppie (peso, nodo) il cui ordine si basa sul primo valore
    Q = MyHeap(d, g.dict_of_nodes())
    # iterazione per ciascun elemento di Q
    while len(Q) > 0:
        u = Q.extract_min()  # estraggo nodo con tempo di arrivo minimo
        if d[u] == float("inf"):
            break
        # considero ciascun nodo adiacente al nodo di partenza u
        for v in g.graph[u].keys():
            # cerco l'arco che mi permette di arrivare prima possibile al successivo nodo v
            min_element = float("inf")
            for edge in g.graph[u][v]:
                # MA l'orario di partenza di una corsa presa non deve essere antecedente all'orario
                # di arrivo alla stazione di partenza u
                # Se alla stazione u arrivo un giorno successivo, ne tengo conto in time_arrival
                time_arrival = edge.time_arrival + (d[u] // 2400) * 2400
                # Se una corsa parte ad un'orario precedente, la si può prendere il giorno dopo
                if d[u] % 2400 > edge.time_departure:
                    time_arrival = time_arrival + 2400
                # time_arrival è l'orario in cui arrivo a v considerando anche il giorno
                if time_arrival < min_element:
                    min_element = time_arrival
                    best_edge = edge
            # se (min_element == float("inf")) => non c'è un arco ammissibile tra i due nodi
            if min_element < float("inf") and min_element < d[v]:
                # trovato un arco teso: min_element rappresenta il nuovo orario di arrivo alla stazione v
                relax(u, v, best_edge, d, p, min_element)
                Q.decrease_key(v, d[v])  # d[v] è stato aggiornato
    return d, p
示例#2
0
 def create_new_heap(self, max_size=float("inf")):
     self.heaps.append(MyHeap(max_size))
示例#3
0
 def test_empty_after_construction(self):
     a = MyHeap()
     self.assertTrue(a.empty())
示例#4
0
    def test_keeps_heap_property(self):
        a = MyHeap()
        a.add(4)
        a.add(2)
        a.add(7)
        a.add(3)
        a.add(5)

        self.assertEqual(a.remove(), 2)
        self.assertEqual(a.remove(), 3)
        self.assertEqual(a.remove(), 4)
        self.assertEqual(a.remove(), 5)
        self.assertEqual(a.remove(), 7)
示例#5
0
 def test_random_remove_works(self):
     a = MyHeap()
     a.add(4)
     a.add(6)
     a.add(2)
     a.add(7)
     a.add(3)
     self.assertEqual(a.remove(),2)
     a.add(5)
     self.assertEqual(a.remove(), 3)
     self.assertEqual(a.remove(), 4)
     self.assertEqual(a.remove(), 5)
     self.assertEqual(a.remove(), 6)
     self.assertEqual(a.remove(), 7)
示例#6
0
 def test_after_adding_two_unordered_returns_same_ordered(self):
     a = MyHeap()
     a.add(4)
     a.add(3)
     self.assertEqual(a.remove(), 3)
     self.assertEqual(a.remove(), 4)
示例#7
0
 def test_after_adding_one_returns_same(self):
     a = MyHeap()
     a.add(5)
     self.assertEqual(a.remove(), 5)
示例#8
0
 def test_is_empty_afer_removing_elements(self):
     a = MyHeap()
     a.add(10)
     a.remove()
     self.assertTrue(a.empty())
示例#9
0
 def test_size_one_after_adding_one_element(self):
     a = MyHeap()
     a.add(5)
     self.assertEqual(a.size(),1)
示例#10
0
 def test_not_empty_after_adding_one_element(self):
     a = MyHeap()
     a.add(5)
     self.assertFalse(a.empty())