Menu iconMenu icon
Introducción a los Algoritmos

Capítulo 7: Algoritmos de Grafos

7.6 Problemas Prácticos

Sumergámonos en algunos problemas prácticos que pueden ayudarnos a entender mejor estos algoritmos de gráficos.

Problema 1: DFS en la Resolución de Laberintos

Comencemos con un problema fácil de resolver un laberinto usando DFS. En este problema, se nos da una cuadrícula (matriz 2D), y tenemos que encontrar un camino desde la posición de inicio hasta la posición objetivo. Podemos movernos hacia arriba, abajo, izquierda y derecha, pero no en diagonal.

Aquí tienes una implementación simple en Python usando DFS:

def dfs(maze, start, goal):
    stack = [(start, [start])]
    visited = set()

    while stack:
        (vertex, path) = stack.pop()
        if vertex not in visited:
            if vertex == goal:
                return path
            visited.add(vertex)
            for neighbor in get_neighbors(maze, vertex):
                stack.append((neighbor, path + [neighbor]))

def get_neighbors(maze, position):
    # Returns the valid neighbors of a position in the maze
    # We assume the maze to be a list of lists in Python

    i, j = position
    neighbors = [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]
    valid_neighbors = []

    for x, y in neighbors:
        if 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] == 0: # 0 signifies a path, 1 is a wall
            valid_neighbors.append((x, y))

    return valid_neighbors

Puedes probar esto con un laberinto simple (una lista de listas donde 0 significa un camino y 1 es una pared).

Problema 2: Camino Más Corto en una Cuadrícula con BFS

Un ejemplo típico de BFS es encontrar el camino más corto en una cuadrícula (por ejemplo, desde la esquina superior izquierda hasta la esquina inferior derecha). Esto se debe a que BFS es un recorrido por niveles y visita todos los vértices en el mismo nivel antes de profundizar en el grafo. Intentemos resolver un problema usando BFS. La declaración del problema es similar al problema anterior, pero en lugar de DFS, usamos BFS para encontrar el camino más corto.

Adoptaremos un enfoque simple en Python para demostrar:

from collections import deque

def bfs(grid, start, goal):
    queue = deque([([start], 0)])  # [(path, cost)]
    seen = {start: 0}

    while queue:
        path, cost = queue.popleft()
        current = path[-1]

        if current == goal:
            return path, cost

        for neighbor in get_neighbors(grid, current):
            if neighbor not in seen or cost + 1 < seen[neighbor]:
                seen[neighbor] = cost + 1
                queue.append((path + [neighbor], cost + 1))

    return None  # No path found

# get_neighbors is same as in the previous example

Puedes probar esto con una cuadrícula simple para entender cómo funciona BFS.

Nota: Para resolver los problemas anteriores utilizando la búsqueda A*, el Algoritmo de Dijkstra u otros algoritmos de grafos, solo necesitamos modificar la forma en que exploramos los vecinos y posiblemente agregar una cola de prioridad.

¡Inténtalo con estos problemas y feliz resolución de problemas!

7.6 Problemas Prácticos

Sumergámonos en algunos problemas prácticos que pueden ayudarnos a entender mejor estos algoritmos de gráficos.

Problema 1: DFS en la Resolución de Laberintos

Comencemos con un problema fácil de resolver un laberinto usando DFS. En este problema, se nos da una cuadrícula (matriz 2D), y tenemos que encontrar un camino desde la posición de inicio hasta la posición objetivo. Podemos movernos hacia arriba, abajo, izquierda y derecha, pero no en diagonal.

Aquí tienes una implementación simple en Python usando DFS:

def dfs(maze, start, goal):
    stack = [(start, [start])]
    visited = set()

    while stack:
        (vertex, path) = stack.pop()
        if vertex not in visited:
            if vertex == goal:
                return path
            visited.add(vertex)
            for neighbor in get_neighbors(maze, vertex):
                stack.append((neighbor, path + [neighbor]))

def get_neighbors(maze, position):
    # Returns the valid neighbors of a position in the maze
    # We assume the maze to be a list of lists in Python

    i, j = position
    neighbors = [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]
    valid_neighbors = []

    for x, y in neighbors:
        if 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] == 0: # 0 signifies a path, 1 is a wall
            valid_neighbors.append((x, y))

    return valid_neighbors

Puedes probar esto con un laberinto simple (una lista de listas donde 0 significa un camino y 1 es una pared).

Problema 2: Camino Más Corto en una Cuadrícula con BFS

Un ejemplo típico de BFS es encontrar el camino más corto en una cuadrícula (por ejemplo, desde la esquina superior izquierda hasta la esquina inferior derecha). Esto se debe a que BFS es un recorrido por niveles y visita todos los vértices en el mismo nivel antes de profundizar en el grafo. Intentemos resolver un problema usando BFS. La declaración del problema es similar al problema anterior, pero en lugar de DFS, usamos BFS para encontrar el camino más corto.

Adoptaremos un enfoque simple en Python para demostrar:

from collections import deque

def bfs(grid, start, goal):
    queue = deque([([start], 0)])  # [(path, cost)]
    seen = {start: 0}

    while queue:
        path, cost = queue.popleft()
        current = path[-1]

        if current == goal:
            return path, cost

        for neighbor in get_neighbors(grid, current):
            if neighbor not in seen or cost + 1 < seen[neighbor]:
                seen[neighbor] = cost + 1
                queue.append((path + [neighbor], cost + 1))

    return None  # No path found

# get_neighbors is same as in the previous example

Puedes probar esto con una cuadrícula simple para entender cómo funciona BFS.

Nota: Para resolver los problemas anteriores utilizando la búsqueda A*, el Algoritmo de Dijkstra u otros algoritmos de grafos, solo necesitamos modificar la forma en que exploramos los vecinos y posiblemente agregar una cola de prioridad.

¡Inténtalo con estos problemas y feliz resolución de problemas!

7.6 Problemas Prácticos

Sumergámonos en algunos problemas prácticos que pueden ayudarnos a entender mejor estos algoritmos de gráficos.

Problema 1: DFS en la Resolución de Laberintos

Comencemos con un problema fácil de resolver un laberinto usando DFS. En este problema, se nos da una cuadrícula (matriz 2D), y tenemos que encontrar un camino desde la posición de inicio hasta la posición objetivo. Podemos movernos hacia arriba, abajo, izquierda y derecha, pero no en diagonal.

Aquí tienes una implementación simple en Python usando DFS:

def dfs(maze, start, goal):
    stack = [(start, [start])]
    visited = set()

    while stack:
        (vertex, path) = stack.pop()
        if vertex not in visited:
            if vertex == goal:
                return path
            visited.add(vertex)
            for neighbor in get_neighbors(maze, vertex):
                stack.append((neighbor, path + [neighbor]))

def get_neighbors(maze, position):
    # Returns the valid neighbors of a position in the maze
    # We assume the maze to be a list of lists in Python

    i, j = position
    neighbors = [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]
    valid_neighbors = []

    for x, y in neighbors:
        if 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] == 0: # 0 signifies a path, 1 is a wall
            valid_neighbors.append((x, y))

    return valid_neighbors

Puedes probar esto con un laberinto simple (una lista de listas donde 0 significa un camino y 1 es una pared).

Problema 2: Camino Más Corto en una Cuadrícula con BFS

Un ejemplo típico de BFS es encontrar el camino más corto en una cuadrícula (por ejemplo, desde la esquina superior izquierda hasta la esquina inferior derecha). Esto se debe a que BFS es un recorrido por niveles y visita todos los vértices en el mismo nivel antes de profundizar en el grafo. Intentemos resolver un problema usando BFS. La declaración del problema es similar al problema anterior, pero en lugar de DFS, usamos BFS para encontrar el camino más corto.

Adoptaremos un enfoque simple en Python para demostrar:

from collections import deque

def bfs(grid, start, goal):
    queue = deque([([start], 0)])  # [(path, cost)]
    seen = {start: 0}

    while queue:
        path, cost = queue.popleft()
        current = path[-1]

        if current == goal:
            return path, cost

        for neighbor in get_neighbors(grid, current):
            if neighbor not in seen or cost + 1 < seen[neighbor]:
                seen[neighbor] = cost + 1
                queue.append((path + [neighbor], cost + 1))

    return None  # No path found

# get_neighbors is same as in the previous example

Puedes probar esto con una cuadrícula simple para entender cómo funciona BFS.

Nota: Para resolver los problemas anteriores utilizando la búsqueda A*, el Algoritmo de Dijkstra u otros algoritmos de grafos, solo necesitamos modificar la forma en que exploramos los vecinos y posiblemente agregar una cola de prioridad.

¡Inténtalo con estos problemas y feliz resolución de problemas!

7.6 Problemas Prácticos

Sumergámonos en algunos problemas prácticos que pueden ayudarnos a entender mejor estos algoritmos de gráficos.

Problema 1: DFS en la Resolución de Laberintos

Comencemos con un problema fácil de resolver un laberinto usando DFS. En este problema, se nos da una cuadrícula (matriz 2D), y tenemos que encontrar un camino desde la posición de inicio hasta la posición objetivo. Podemos movernos hacia arriba, abajo, izquierda y derecha, pero no en diagonal.

Aquí tienes una implementación simple en Python usando DFS:

def dfs(maze, start, goal):
    stack = [(start, [start])]
    visited = set()

    while stack:
        (vertex, path) = stack.pop()
        if vertex not in visited:
            if vertex == goal:
                return path
            visited.add(vertex)
            for neighbor in get_neighbors(maze, vertex):
                stack.append((neighbor, path + [neighbor]))

def get_neighbors(maze, position):
    # Returns the valid neighbors of a position in the maze
    # We assume the maze to be a list of lists in Python

    i, j = position
    neighbors = [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]
    valid_neighbors = []

    for x, y in neighbors:
        if 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] == 0: # 0 signifies a path, 1 is a wall
            valid_neighbors.append((x, y))

    return valid_neighbors

Puedes probar esto con un laberinto simple (una lista de listas donde 0 significa un camino y 1 es una pared).

Problema 2: Camino Más Corto en una Cuadrícula con BFS

Un ejemplo típico de BFS es encontrar el camino más corto en una cuadrícula (por ejemplo, desde la esquina superior izquierda hasta la esquina inferior derecha). Esto se debe a que BFS es un recorrido por niveles y visita todos los vértices en el mismo nivel antes de profundizar en el grafo. Intentemos resolver un problema usando BFS. La declaración del problema es similar al problema anterior, pero en lugar de DFS, usamos BFS para encontrar el camino más corto.

Adoptaremos un enfoque simple en Python para demostrar:

from collections import deque

def bfs(grid, start, goal):
    queue = deque([([start], 0)])  # [(path, cost)]
    seen = {start: 0}

    while queue:
        path, cost = queue.popleft()
        current = path[-1]

        if current == goal:
            return path, cost

        for neighbor in get_neighbors(grid, current):
            if neighbor not in seen or cost + 1 < seen[neighbor]:
                seen[neighbor] = cost + 1
                queue.append((path + [neighbor], cost + 1))

    return None  # No path found

# get_neighbors is same as in the previous example

Puedes probar esto con una cuadrícula simple para entender cómo funciona BFS.

Nota: Para resolver los problemas anteriores utilizando la búsqueda A*, el Algoritmo de Dijkstra u otros algoritmos de grafos, solo necesitamos modificar la forma en que exploramos los vecinos y posiblemente agregar una cola de prioridad.

¡Inténtalo con estos problemas y feliz resolución de problemas!