def scan(graph, search, vertex): """ Args: search: La estructura de busqueda vertex: El vertice destino Returns: El costo total para llegar de source a vertex. Infinito si no existe camino Raises: Exception """ try: map.put(search['marked'], vertex, True) edges = g.adjacentEdges(graph, vertex) for edge in lt.iterator(edges): w = e.other(edge, vertex) if (not map.get(search['marked'], w)['value']): if (e.weight(edge) < map.get(search['distTo'], w)['value']): map.put(search['distTo'], w, e.weight(edge)) map.put(search['edgeTo'], w, edge) if (pq.contains(search['pq'], w)): pq.decreaseKey(search['pq'], w, map.get(search['distTo'], w)['value']) else: pq.insert(search['pq'], w, map.get(search['distTo'], w)['value']) return search except Exception as exp: error.reraise(exp, 'bellman:disto')
def relax(search, edge): """ Relaja el peso de los arcos del grafo con la nueva de un nuevo arco Args: search: La estructura de busqueda edge: El nuevo arco Returns: El grafo con los arcos relajados Raises: Exception """ try: v = e.either(edge) w = e.other(edge, v) visited_v = map.get(search['visited'], v)['value'] visited_w = map.get(search['visited'], w)['value'] distw = visited_w['distTo'] distv = visited_v['distTo'] + e.weight(edge)[0] if (visited_w is None) or (distw > distv): distow = visited_v['distTo'] + e.weight(edge)[0] map.put(search['visited'], w, { 'marked': True, 'edgeTo': edge, 'distTo': distow }) if iminpq.contains(search['iminpq'], w): iminpq.decreaseKey(search['iminpq'], w, distow) else: iminpq.insert(search['iminpq'], w, distow) return search except Exception as exp: error.reraise(exp, 'dks:relax')
def test_insert(iminpq): iminpq = pq.decreaseKey(iminpq, 'A', 1) key = pq.min(iminpq) assert key == 'A' iminpq = pq.increaseKey(iminpq, 'A', 12) key = pq.min(iminpq) assert key == 'D'
def addConnection(bikes, origin, destination, duration): edge = gr.getEdge(bikes["grafo"], origin, destination) if edge is None: gr.addEdge(bikes["grafo"], origin, destination, duration) else: initial = edge["weight"] edge["weight"] = ((int(initial) + int(duration)) / 2) llegada = gr.indegree(bikes["grafo"], destination) salida = gr.outdegree(bikes["grafo"], origin) llegadad = gr.indegree(bikes["grafo"], destination) salidad = salida = gr.outdegree(bikes["grafo"], origin) oruse = salida + llegadad desuse = llegada + salidad llegadainv = 1 / llegada salidainv = 1 / salida iminpq.increaseKey(bikes["topuso"], destination, desuse) iminpq.increaseKey(bikes["topuso"], origin, oruse) iminpq.decreaseKey(bikes["topllegada"], destination, llegadainv) iminpq.decreaseKey(bikes["topsalida"], origin, salidainv) return bikes