Beispiel #1
0
 def recorrido_anchura(grafo: "Graph<T>", v_inicial: "T",
                       inversa: "bool") -> "List<(T,T)>":
     aristas = []
     queue = Fifo()
     seen = set()
     queue.push((v_inicial, v_inicial))
     seen.add(v_inicial)
     matriz[0][0] = 0
     mInversa[0][0] = 0
     while len(queue) > 0:
         u, v = queue.pop()
         aristas.append((u, v))
         if (inversa):
             peso = mInversa[v[0]][v[1]]
         else:
             peso = matriz[v[0]][v[1]]
         for suc in grafo.succs(v):
             if suc not in seen:
                 if (inversa):
                     mInversa[suc[0]][suc[1]] = peso + 1
                     seen.add(suc)
                     queue.push((v, suc))
                 else:
                     matriz[suc[0]][suc[1]] = peso + 1
                     seen.add(suc)
                     queue.push((v, suc))
     return aristas
Beispiel #2
0
def kruskal_final(g, v_ini, aristas):
    q = Fifo()
    seen = set()
    vertices = []

    # q.push(v_ini)
    seen.add(v_ini)

    vertices.append(v_ini)
    # sucs = g.succs(v_ini)
    #
    # vecino1 = sucs.pop()
    # vecino2 = sucs.pop()
    vecino1 = min(g.succs(v_ini))
    # if aristas[(v_ini, vecino1)] < aristas[(v_ini, vecino2)]:
    #     vecino1 = vecino2
    q.push(vecino1)
    seen.add(vecino1)

    while len(vertices) != len(g.V):
        v = q.pop()
        vertices.append(v)

        for suc in g.succs(v):
            if suc not in seen:
                seen.add(suc)
                q.push(suc)

    return vertices
Beispiel #3
0
def BFS_wallbraker(g: UndirectedGraph, source: Vertex,
                   distances: dict) -> Edge:
    seen = set()
    min = float('infinity')
    wall = ((-1, -1), (-1, -1))
    queue = Fifo()
    queue.push((source, 0))
    seen.add(source)
    while len(queue) > 0:
        vertex, n = queue.pop()
        u, v = vertex

        # Comprobacion de vecinos tras los muros
        for x, y in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
            neigh = (u + x, v + y)
            if neigh not in g.succs((u, v)) and neigh in distances:
                tdistance = n + distances[neigh]
                if tdistance < min:
                    min = tdistance
                    wall = ((u, v), neigh)
        for suc in g.succs(vertex):
            if suc not in seen:
                seen.add(suc)
                queue.push((suc, n + 1))
    return wall
Beispiel #4
0
def matriz_saltos(grafo, num_rows, num_cols):
    m = []
    #Generar una matriz
    for r in range(num_rows):
        m.append([0] * num_cols)

    #deep_copy para copiar matrices o con un for

    #TODO
    #copiar el codigo del recorredor de aristas en anchura y
    # modificarlo para rellenar a la vez matriz m

    aristas = []
    queue = Fifo()
    seen = set()
    queue.push((0, 0))
    seen.add((0, 0))
    while len(queue) > 0:
        u, v = queue.pop()
        aristas.append((u, v))
        for suc in grafo.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))

    return m
Beispiel #5
0
def recorredor_anchura(g: UndirectedGraph, source: "T", r: int, c: int):
    #Crear e inicializar matriz
    distances = []
    for row in range(r):
        distances.append([0] * c)

    queue = Fifo()
    seen = set()

    #Añadir el punto inicial a la cola
    queue.push((source, source))
    seen.add(source)

    while len(queue) > 0:
        u, v = queue.pop()
        #Miramos los sucesores del elemento extraido de la cola
        for s in g.succs(v):
            #Si no lo hemos visitado ya lo añadimos a los visitados y anotamos en la matriz su distancia al origen
            if s not in seen:
                seen.add(s)
                distances[s[0]][s[1]] = distances[v[0]][
                    v[1]] + 1  #En la posición del sucesor el antecesor mas 1
                queue.push((v, s))

    return distances
Beispiel #6
0
class TestFifo(unittest.TestCase):
    def setUp(self):
        self.a = Fifo()
        self.b = Fifo([1, 2, 3])
        self.c = Fifo(createList=list)
        self.d = Fifo([1, 2, 3], createList=list)

    def test_ctor(self):
        self.assertEqual(len(self.a), 0)
        self.assertEqual(len(self.b), 3)
        self.assertEqual(len(self.c), 0)
        self.assertEqual(len(self.d), 3)

    def test_push(self):
        self.a.push(1)
        self.assertEqual(len(self.a), 1)
        self.a.push(2)
        self.assertEqual(len(self.a), 2)
        v = self.a.pop()
        self.assertEqual(v, 1)
        self.b.push(1)
        self.assertEqual(len(self.b), 4)
        self.c.push(1)
        self.assertEqual(len(self.c), 1)
        self.d.push(1)
        self.assertEqual(len(self.d), 4)

    def test_pop(self):
        self.assertRaises(IndexError, self.a.pop)
        i = 1
        while len(self.b) > 0:
            v = self.b.pop()
            self.assertEqual(v, i)
            i += 1
        self.assertRaises(IndexError, self.c.pop)
        i = 1
        while len(self.d) > 0:
            v = self.d.pop()
            self.assertEqual(v, i)
            i += 1

    def test_top(self):
        self.assertRaises(IndexError, self.a.top)
        self.assertEqual(self.b.top(), 1)

    def test_repr(self):
        self.assertEqual(list(self.b), list(eval(repr(self.b))))
Beispiel #7
0
def BFS(g, source):
    queue = Fifo()
    seen = set()
    queue.push((source, source))
    edges = []
    while len(queue) > 0:
        u, v = queue.pop()
        edges.append((u, v))
        seen.add(v)
        for suc in g.succs(v):
            if suc not in seen:
                queue.push((v, suc))
    return edges
Beispiel #8
0
def recorredor_aristas_anchura(g: UndirectedGraph, v_inicial: Vertex) -> List[Edge]:
    aristas = []
    queue = Fifo()
    seen = set()
    queue.push((v_inicial, v_inicial))
    seen.add(v_inicial)
    while len(queue) > 0:
        u, v = queue.pop()
        aristas.append((u, v))
        for suc in g.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return aristas
Beispiel #9
0
def busca_tesoro_primero_anchura (laberinto,v_inicio):
    seen=set()
    queue=Fifo()
    queue.push(v_inicio)
    seen.add(v_inicio)
    while len(queue)>0:
        v=queue.pop()
        if v==v_tesoro:
            return v
        for succ in laberinto.succs(v):
            if succ not in seen:
                seen.add(succ)
                queue.push(succ)
    return None
Beispiel #10
0
def recorredor_aristas_anchura(grafo,v_inicial):
    aredges]
    seen=set()
    queue=Fifo()
    seen.add(v_inicial)
    queue.push((v_inicial,v_inicial))
    while len(queue)>0:
        u,v=queue.pop()
        aredgesppend((u,v))
        for succ in grafo.succs(v):
            if succ not in seen:
                seen.add(succ)
                queue.push((v,succ))
    return aredges
Beispiel #11
0
def recorredor_vertices_anchura(grafo: "Graph<T>", v_inicial: "T") -> "List<T>":
    vertices = []
    queue =Fifo()
    seen = set()
    queue.push(v_inicial)
    seen.add(v_inicial)
    while len(queue)>0:
        v = queue.pop()
        vertices.append(v)
        for suc in grafo.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push(suc)
    return vertices
Beispiel #12
0
def min_distances(g: UndirectedGraph, ini: Vertex) -> Dict:
    distances = {}
    queue = Fifo()
    seen = set()
    queue.push((ini, ini, 0))
    seen.add(ini)
    while len(queue) > 0:
        u, v, n, = queue.pop()
        distances[v] = n
        for suc in g.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc, n + 1))
    return distances
Beispiel #13
0
def travel_vertex_width(grafo, v_inicial):
    edges = []
    queue = Fifo()
    seen = set()
    queue.push(v_inicial)
    seen.add(v_inicial)
    while len(queue) > 0:
        v = queue.pop()
        edges.append(v)
        for suc in grafo.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push(suc)
    return edges
Beispiel #14
0
def shortest_path(g: UndirectedGraph, source: Vertex, target: Vertex):
    aristas = []
    queue = Fifo()
    seen = set()
    queue.push((source, source))
    seen.add(source)
    while len(queue) > 0:
        u, v = queue.pop()
        aristas.append((u, v))
        for suc in g.succs():
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return recover_path(aristas, target)
Beispiel #15
0
def BFS_modified(g, source):
    n = int(sqrt(len(g.V)))
    matrix = [[0] * n for i in range(n)]
    queue = Fifo()
    seen = set()
    queue.push((source, 0))
    while len(queue) > 0:
        (x,y), level = queue.pop()
        matrix[x][y] = level
        seen.add((x,y))
        for suc in g.succs((x, y)):
            if suc not in seen:
                queue.push((suc, level + 1))
    return matrix
Beispiel #16
0
def anchura(g: UndirectedGraph, source: tuple) -> list:
    visitados = set()
    aristas = []
    queue = Fifo()
    queue.push((source, source))
    visitados.add(source)
    while len(queue) > 0:
        u, v = queue.pop()
        for suc in g.succs(v):
            if suc not in visitados:
                visitados.add(suc)
                aristas.append((v, suc))
                queue.push((v, suc))
    return aristas
def traveler_edges_width(graph, v_initial):
    edges = []
    queue = Fifo()
    seen = set()
    queue.push((v_initial, v_initial))
    seen.add(v_initial)
    while len(queue) > 0:
        u, v = queue.pop()
        edges.append((u, v))
        for suc in graph.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return edges
Beispiel #18
0
def recorre_aristas_anchura(grafo: Digraph, v_inical: Vertex) -> List[Edge]:
    aristas = []
    seen = set()
    queue = Fifo()
    queue.push((v_inical, v_inical))
    seen.add(v_inical)
    while len(queue) > 0:
        u, v = queue.pop()
        aristas.append((u, v))
        for suc in grafo.succs():
            if suc not in seen:
                seen.add(suc)
                queue.push((u, v))
    return aristas
Beispiel #19
0
def recorredor_vertices_anchura(lab, v_inicial):
    vertices = []
    queue = Fifo()
    seen = set()
    queue.push(v_inicial)
    seen.add(v_inicial)
    while len(queue) > 0:
        v = queue.pop()
        vertices.append(v)
        for suc in lab.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push(suc)
    return vertices
Beispiel #20
0
 def edges_withd_path(graph: "UndirectedGraph", initial_v: Tuple[int, int],
                      ma):
     queue = Fifo()
     seen = set()
     queue.push((initial_v, initial_v))
     seen.add(initial_v)
     ma[initial_v[0]][initial_v[1]] = -1
     while len(queue) > 0:
         u, v = queue.pop()
         ma[v[0]][v[1]] = ma[u[0]][u[1]] + 1
         for suc in graph.succs(v):
             if suc not in seen:
                 seen.add(suc)
                 queue.push((v, suc))
     return ma
Beispiel #21
0
def recorredor_aristas_anchura(grafo: "Graph<T>",
                               v_inicial: "T") -> "List<(T,T)>":
    aristas = []
    queue = Fifo()
    seen = set()
    queue.push((v_inicial, v_inicial))
    seen.add(v_inicial)
    while len(queue) > 0:
        u, v = queue.pop()
        aristas.append((u, v))
        for suc in grafo.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return aristas
Beispiel #22
0
 def recorredor_aristas_anchura(g, source):
     aristas = []
     seen = set()
     queue = Fifo()
     seen.add(source)
     queue.push((source, source))
     while len(queue) > 0:
         u, v = queue.pop()
         aristas.append((u, v))
         if v != target:
             for succ in g.succs(v):
                 if succ not in seen:
                     seen.add(succ)
                     queue.push((v, succ))
     return aristas
Beispiel #23
0
def mod_anchura(g: UndirectedGraph, source: tuple) -> list:
    visitados = set()
    n = int(sqrt(len(g.V)))
    matriz = [[0] * n for i in range(n)]
    queue = Fifo()
    queue.push((source, 0))
    visitados.add(source)
    while len(queue) > 0:
        u, n = queue.pop()
        for sucx, sucy in g.succs(u):
            if (sucx, sucy) not in visitados:
                visitados.add((sucx, sucy))
                matriz[sucx][sucy] = n + 1
                queue.push(((sucx, sucy), n + 1))
    return matriz
Beispiel #24
0
def recorredor_aristas_anchura(lab, v_inicial):
    aristas = []
    queue = Fifo()
    seen = set()

    queue.push((v_inicial, v_inicial))
    seen.add(v_inicial)

    while len(queue) > 0:
        u, v = queue.pop()
        aristas.append((u, v))
        for suc in lab.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return aristas
Beispiel #25
0
def shortest_path(grafo: UndirectedGraph, source: Vertex,
                  target: Vertex) -> List[Edge]:
    # sys.setrecursionlimit(10000) # en el caso de que el laberinto sea más grande, por lo tanto, la recursión más larga
    edges = []
    queue = Fifo()
    seen = set()
    queue.push((source, source))
    seen.add(source)
    while len(queue) > 0:
        u, v = queue.pop()
        edges.append((u, v))
        for suc in grafo.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return recover_path(edges, target)
Beispiel #26
0
def BFS(g: UndirectedGraph, source: Vertex, target: Vertex) -> List[Edge]:
    seen = set()
    edges = []
    queue = Fifo()
    edges.append((source, source))
    queue.push((source, source))
    seen.add(source)
    while len(queue) > 0:
        u, v = queue.pop()
        edges.append((u, v))
        if (u, v) == target:
            return edges
        for suc in g.succs(v):
            if suc not in seen:
                seen.add(suc)
                queue.push((v, suc))
    return edges
Beispiel #27
0
def marca_pasos_desde(g: "UndirectedGraph<T>", v_entrada: "T") -> "Dictionary[Cells]->Int":
    CuentaPasos = {}
    CuentaPasos[v_entrada]=0
    #Seguimos el modelo de recorre_vertices_anchura
    queue = Fifo()
    seen = set()
    queue.push(v_entrada)
    seen.add(v_entrada)
    while len(queue)>0:
        v=queue.pop()
        for suc in g.succs(v):
            if suc not in seen:
                queue.push(suc)
                seen.add(suc)
                #Los pasos de esa casilla son uno más que los de su padre
                CuentaPasos[suc]=CuentaPasos[v]+1
    return CuentaPasos
Beispiel #28
0
def width_edges(g, source,
                matrix):  #Recorre aristas y actualiza matriz de costes
    edges = []
    seen = set()
    queue = Fifo()
    seen.add(source)
    queue.push((source, source))
    matrix[source[0]][source[1]] = 0
    while len(queue) > 0:
        u, v = queue.pop()
        edges.append((u, v))
        for succ in g.succs(v):
            if succ not in seen:
                matrix[succ[0]][succ[1]] = matrix[v[0]][v[1]] + 1
                seen.add(succ)
                queue.push((v, succ))
    return (edges, matrix)
def jump_matrix(grafo, num_rows: int, num_cols: int, v_inicial):
    m = []
    for r in range(num_rows):
        m.append([0] * num_cols)
    vertices = []
    queue = Fifo()
    seen = set()
    queue.push(v_inicial)
    seen.add(v_inicial)
    while len(queue) > 0:
        v = queue.pop()
        vertices.append(v)
        for suc in grafo.succs(v):
            if suc not in seen:
                seen.add(suc)
                m[suc[0]][suc[1]] = m[v[0]][v[1]] + 1
                queue.push(suc)
    return m
def bfst(lab, v_ini, v_tes):
    q = Fifo()
    seen = set()

    q.push(v_ini)
    seen.add(v_ini)

    while len(q) > 0:
        at = q.pop()
        if v_tes == at:
            return at

        for suc in lab.succs(at):
            if suc not in seen:
                seen.add(suc)
                q.push(suc)

    return None