learngraphtheory.org

Aprendizaje Interactivo de Teoría de Grafos

Guest User

Using app without sign in

Recursos de estudio
Lleva la teoría de grafos más allá de la pantalla
Descarga inmediata·Acceso de por vida
Selección de Algoritmo

Buscador de Camino Hamiltoniano

Buscador de caminos hamiltonianos

Halla un camino que visita cada vértice exactamente una vez

Tiempo: O(V^2 · 2^V)
Espacio: O(V · 2^V)
Caso de Uso: Planificación de rutas, ensamblaje de fragmentos, perforación de circuitos
Ejecución de Algoritmo

Selecciona un algoritmo y genera pasos para comenzar la visualización

Acerca de Camino Hamiltoniano

Un camino hamiltoniano visita cada vértice de un grafo exactamente una vez; un ciclo hamiltoniano además regresa al vértice inicial. Decidir si tal camino existe es NP-completo, en claro contraste con el camino euleriano, comprobable en tiempo lineal.

Cómo funciona

Los algoritmos exactos usan retroceso: extender un camino parcial un vértice a la vez, podando cuando el vértice actual no tiene vecino sin visitar. La programación dinámica sobre subconjuntos (la misma técnica de máscara de bits que Held-Karp) resuelve el problema en O(n al cuadrado por 2 elevado a n). Reglas de poda útiles son las comprobaciones de grado y las pruebas de conectividad del grafo restante. Para clases especiales de grafos, como torneos o grafos que cumplen condiciones de grado de Dirac u Ore, la existencia está garantizada y hay algoritmos constructivos.

Aplicaciones

Los caminos hamiltonianos aparecen en el ensamblaje de genomas, el diseño y prueba de circuitos, los juegos de rompecabezas como el recorrido del caballo y como núcleo estructural del TSP. En entrevistas, la solución de programación dinámica con máscara de bits es una pregunta difícil habitual, y el contraste con el camino euleriano evalúa la claridad conceptual.

Pseudocódigo

No se conoce ningún algoritmo polinómico, así que la formulación honesta es retroceso con poda. La poda es lo que lo hace utilizable en absoluto.

CaminoHamiltoniano(grafo):
    para cada vértice inicial s:
        si retroceder([s], {s}): devolver el camino
    devolver ninguno

retroceder(camino, visitados):
    si visitados contiene todos los vértices: devolver verdadero

    u = camino.último
    para cada vecino v de u no visitado:
        // Podas que se pagan solas:
        //  - algún vértice sin visitar ya inalcanzable -> fallar
        //  - dos o más vértices sin visitar de grado 1
        //    en el grafo restante -> fallar
        visitados.añadir(v)
        si retroceder(camino + [v], visitados): devolver verdadero
        visitados.quitar(v)     // deshacer y probar el siguiente

    devolver falso

La poda por alcanzabilidad es la que más importa. Tras elegir un camino parcial, ejecuta un recorrido rápido sobre los vértices sin visitar; si alguno queda ahora incomunicado del extremo actual, la rama está muerta y puede abandonarse de inmediato en lugar de tras explorar todo un subárbol. En grafos dispersos esto convierte una búsqueda intratable en una rápida, aunque el peor caso siga siendo exponencial.

Ejemplo resuelto, paso a paso

Busca un camino hamiltoniano desde A en un grafo de cinco vértices, y observa por qué ese mismo grafo no tiene ningún ciclo hamiltoniano.

Grafo de ejemplo: Aristas no dirigidas A-B, B-C, C-D, D-E, más las dos cuerdas A-C y B-D.

  1. Primero los grados. A tiene grado 2 (B y C), B tiene 3 (A, C, D), C tiene 3 (A, B, D), D tiene 3 (B, C, E) y E tiene grado 1, siendo D su único vecino. Un vértice de grado 1 tiene que ser un extremo de cualquier camino hamiltoniano, lo que ya nos dice que E es uno de los extremos.
  2. Probar A hacia B primero. Desde A toma B, luego desde B toma C, luego desde C el único vecino sin visitar es D, y desde D el único sin visitar es E. Eso completa A-B-C-D-E cubriendo los cinco vértices.
  3. Existe una segunda solución. Retrocediendo desde A por la otra rama se obtiene A-C-B-D-E, igualmente válido. Los caminos hamiltonianos con frecuencia no son únicos, y un algoritmo que devuelve el primero que encuentra responde a una pregunta de existencia, no de recuento.
  4. Ahora pide un ciclo. Un ciclo hamiltoniano tendría que volver desde el último vértice hasta A. Ambos caminos terminan en E, y E tiene grado 1 con su única arista hacia D. No existe arista E-A, así que no hay ningún ciclo hamiltoniano.

Existen dos caminos hamiltonianos, A-B-C-D-E y A-C-B-D-E, pero ningún ciclo hamiltoniano. El vértice E de grado 1 resuelve casi por sí solo ambas preguntas: se obliga a ser extremo del camino y descarta cualquier ciclo, ya que un ciclo exige que todo vértice tenga grado al menos 2. Comprobar los grados antes de buscar es barato y con frecuencia decisivo.

Complejidad y de dónde sale

Tiempo: O(V!) ingenuo, O(V^2·2^V) con PD · Espacio: O(V·2^V) con PD

El retroceso ingenuo explora permutaciones y es O(V factorial) en el peor caso, algo desesperado más allá de unos 12 vértices. La programación dinámica de Held-Karp sobre subconjuntos lo hace mucho mejor: el estado es un subconjunto de vértices visitados junto con el extremo actual, lo que da 2 elevado a V por V estados, y cada transición cuesta O(V), así que el total es O(V al cuadrado por 2 elevado a V) en tiempo y O(V por 2 elevado a V) en memoria. Eso es practicable hasta unos 20 vértices, donde 2 elevado a 20 por 20 son unos 20 millones de estados. El problema es NP-completo, así que no se espera que exista un algoritmo polinómico; el retroceso con poda a menudo termina rápido en grafos dispersos reales pese al peor caso exponencial.

Cuándo usar Camino Hamiltoniano y cuándo no

Confirma qué problema tienes en realidad antes de recurrir a maquinaria exponencial, porque dos de estos son fáciles.

AlternativaPrefiérela cuandoCoste
Camino eulerianoNecesitas cada ARISTA una vez en lugar de cada vértice. Tiempo lineal contando grados.O(V + E)
PD de Held-KarpMenos de unos 20 vértices y necesitas un sí o un no definitivo.O(V^2·2^V)
Heurísticas de TSPEl grafo es completo con pesos y quieres una buena gira en lugar de una prueba de existencia.O(n^2) por pasada de 2-opt
Condiciones suficientes de Dirac y OreSolo necesitas demostrar que existe un ciclo. Si todo grado es al menos V/2, existe, sin búsqueda alguna.O(V)
Ordenación topológicaEl grafo es un DAG. Existe camino hamiltoniano exactamente cuando los vértices consecutivos del orden topológico único son adyacentes.O(V + E)

Errores frecuentes

  • Confundirlo con el problema euleriano. Suenan parecidos y difieren enormemente. El euleriano cubre aristas y es lineal; el hamiltoniano cubre vértices y es NP-completo. Resolver el equivocado es el error más caro disponible aquí.
  • Buscar sin poda. El retroceso puro sin comprobación de alcanzabilidad explora enormes subárboles muertos. Comprobar que todos los vértices sin visitar siguen siendo alcanzables desde el extremo actual, y que a lo sumo dos tienen grado 1 en el grafo restante, suele recortar la búsqueda en órdenes de magnitud.
  • Suponer que un camino implica un ciclo. Puede existir un camino hamiltoniano sin que exista ningún ciclo hamiltoniano, exactamente como en el ejemplo anterior. El ciclo exige además una arista desde el último vértice de vuelta al primero, y cualquier vértice de grado 1 lo descarta por completo.
  • Aplicar la condición de Dirac al revés. Dirac dice que si todo vértice tiene grado al menos V/2 entonces existe un ciclo hamiltoniano. El recíproco es falso: muchos grafos con grados bajos tienen ciclos hamiltonianos, así que no cumplir la condición no demuestra nada.
  • Esperar que escale. Más allá de unos 20 o 25 vértices, una respuesta exacta puede quedar sencillamente fuera de alcance. Si el objetivo real es una buena ruta y no una demostración, modélalo como TSP y usa heurísticas.

Preguntas frecuentes

¿Qué es un camino hamiltoniano?
Un camino hamiltoniano es un camino que visita cada vértice de un grafo exactamente una vez. Si además regresa al vértice de partida es un ciclo hamiltoniano. A diferencia de un camino euleriano, no necesita usar todas las aristas, y no puede revisitar ningún vértice.
¿Por qué es difícil hallar un camino hamiltoniano?
Porque la propiedad no puede comprobarse localmente. Los caminos eulerianos son fáciles porque un simple recuento de grados en cada vértice decide la existencia, pero no hay ninguna prueba local comparable para visitar cada vértice una vez. El problema es NP-completo, así que no se conoce ningún algoritmo polinómico y encontrar uno resolvería P frente a NP.
¿Cuál es la diferencia entre caminos hamiltonianos y eulerianos?
Un camino hamiltoniano visita cada vértice exactamente una vez y puede ignorar aristas. Un camino euleriano usa cada arista exactamente una vez y puede revisitar vértices. La existencia euleriana se decide en O(V + E) contando vértices de grado impar; la hamiltoniana es NP-completa.
¿Cómo se halla un camino hamiltoniano?
Para grafos pequeños, retroceso desde cada inicio posible con poda fuerte: abandona una rama en cuanto algún vértice sin visitar quede inalcanzable, o en cuanto dos o más vértices sin visitar tengan grado 1 en el grafo restante. Hasta unos 20 vértices, la programación dinámica de Held-Karp sobre subconjuntos da una respuesta definitiva en O(V al cuadrado por 2 elevado a V).
¿Qué relación hay entre los caminos hamiltonianos y el TSP?
El problema del viajante es la versión de optimización con pesos: en lugar de preguntar si existe una gira que visite todos los vértices, pide la más barata en un grafo completo con pesos. Decidir la existencia de un ciclo hamiltoniano se reduce al TSP, y por eso el TSP también es NP-difícil.

Leer el artículo completo: Eulerian Paths and Circuits

Algoritmos relacionados: Camino Euleriano (No Dirigido), Problema del Viajante, Búsqueda en Profundidad

Controles Interactivos
Acciones Básicas
Doble Clic → Agregar Nodo
Arrastrar → Mover Nodos
Shift + Clic → Conectar Nodos
Clic Derecho → Menú Contextual
Avanzado
Ctrl + Clic → Multi-Selección
Tecla Suprimir → Eliminar Seleccionados
Doble Clic en Arista → Editar Peso
Ctrl + Arrastrar → Desplazar Vista

Zoom Controls

100%
Nodos: 4
Aristas: 4