CAPITULO I
3. Introducción a los grafos
3.1. Conceptos básicos
Un grafo es una representación gráfica que consta de un conjunto de nodos o vértices,
los cuales están conectados entre sí mediante aristas, que son las líneas que unen a los
vértices. Esta estructura permite analizar cómo se relacionan entre sí los diferentes
elementos de un sistema o conjunto. Los gráficos se utilizan en diversas áreas como la
informática, las redes sociales, la biología, entre otras, para modelar relaciones y
procesos complejos. El concepto de grafo comenzó a tomar forma en el siglo XVIII,
cuando el matemático y físico suizo Leonhard Euler publicó, en 1736, un trabajo
fundamental sobre la teoría de grafos. En su investigación, Euler abordó el famoso
problema de los puentes de la ciudad de Kaliningrado, que consistía en encontrar una
ruta para cruzar todos los puentes sin pasar dos veces por el mismo. A través de su
análisis, Euler introdujo una de las ideas clave de la teoría de gráficos, demostrando que
no es posible regresar al vértice inicial sin recorrer alguna de las aristas más de una vez.
Este trabajo marcó el inicio formal del estudio de los gráficos y sentó las bases para el
desarrollo de la teoría matemática que aún hoy se aplica en diversas disciplinas (Porto
& Merino, 2023).
3.1.1 Clasificación según sus propiedades
Los gráficos pueden clasificarse de diversas maneras según sus características. Los
grafos simples son aquellos en los que cada par de vértices está conectado por una única
arista, lo que significa que no hay más de una arista entre dos vértices. En contraste, los
gráficos complejos presentan más de una arista conectando los mismos vértices, lo que
permite representar relaciones más complicadas. Un grafo se considera conexo si existe
un camino entre cualquier par de vértices, lo que implica que, para un par de vértices (p,
r), debe haber una ruta que permita ir de uno a otro, sin importar cuántos vértices
intermedios haya. Por otro lado, un grafo está fuertemente conectado si, además de
existir al menos un camino entre cualquier par de vértices, hay al menos dos caminos
diferentes que los conectan, lo que refuerza la conectividad del grafo. Un grafo simple
también puede ser completo, lo que significa que todas las posibles aristas que podrían
conectar los vértices están presentes en el grafo, asegurando que cada vértice está
vinculado con todos los demás. Finalmente, un grafo es bipartito si sus vértices pueden
ser divididos en dos conjuntos disjuntos de tal forma que no existan aristas dentro de
cada conjunto, pero sí entre los vértices de los dos conjuntos, cumpliendo con ciertas
condiciones de conexión. (Porto & Merino, 2023)
3.2. Elementos
3.2.1. Nodos
Los vértices son los nodos fundamentales en un gráfico, representando los puntos de
conexión para las aristas. Cada vértice puede tener un número determinado de aristas
que lo conectan con otros vértices, y este número se conoce como el grado del vértice.
El grado de un vértice refleja cuántas conexiones o relaciones tiene con otros vértices
del gráfico. Un vértice puede clasificarse en función de su grado en distintas categorías
(Discretas, 2017).
Vértices adyacentes: dos vértices U y V se consideran adyacentes si existe una
arista que los conecta directamente. En este caso, U sería el vértice inicial y V
sería el vértice adyacente. La relación de adyacencia implica que los vértices
están directamente conectados entre sí, y esta propiedad es fundamental para la
estructura de caminos dentro de un grafo.
Vértice aislado: un vértice aislado es aquel que no tiene ninguna arista que lo
conecte con otros vértices. Es decir, su grado es cero, lo que significa que no
participa en ninguna relación o conexión dentro del grafo. Los vértices aislados
no afectan la conectividad del gráfico, ya que no intervienen en ningún camino
entre otros vértices.
Vértice terminal: un vértice terminal es un vértice que tiene exactamente una
arista conectada a él, es decir, su grado es uno. Estos vértices son puntos de
terminación en un grafo, ya que no tienen otras conexiones que los extiendan a
otros vértices. En muchos casos, los vértices terminales son útiles para
representar puntos finales de una ruta o camino dentro de un grafo.
3.2.2. Aristas o arcos
Las aristas son los elementos que unen a los vértices en un grafo, formando las
conexiones que permiten definir rutas o caminos entre los diferentes nodos. Una arista
es representada por un par de vértices, los cuales denominamos sus extremos. Si la
arista no tiene una dirección específica (como en el caso de los gráficos no dirigidos), la
arista se denota de manera indeterminada como { a,b }, donde a y b son los vértices
conectados. En este contexto, no importa el orden de los vértices, ya que la relación es
simétrica (Discretas, 2017).
Existen varios tipos de aristas, los cuales tienen propiedades particulares:
Aristas adyacentes: dos aristas se consideran adyacentes si comparten un vértice
común, es decir, si ambas aristas convergen en un mismo vértice. En otras
palabras, si hay un arista entre a y b, y otro entre b y d, las artistas { a, b } y { b,
c }son adyacentes, ya que comparten el vértice b.
Aristas paralelas: se dice que dos aristas son paralelos cuando conectan los
mismos dos vértices. Es decir, tienen los mismos extremos. Este tipo de aristas,
si existen en un grafo, no agrega información nueva sobre la estructura del grafo
en cuanto a las conexiones entre los vértices.
Aristas cíclicas: una arista cíclica es aquella que conecta un vértice consigo
mismo. En otras palabras, se trata de una arista que tiene como extremo el
mismo vértice en ambos lados de la conexión, lo que forma un bucle en el grafo.
Cruce de aristas: ocurre cuando dos aristas se intersectan en un punto específico.
Aunque este cruce no altera la estructura del gráfico en términos de
conectividad, puede ser un factor importante en representaciones gráficas del
mismo, donde las aristas cruzadas pueden hacer que la visualización sea más
compleja.
3.3. Tipos de Grafos
3.3.1. Grafo simple
Un grafo simple se define como una estructura compuesta por un conjunto de vértices
conectados entre sí mediante aristas, donde no se permiten conexiones múltiples entre
los mismos nodos ni enlaces que conecten un vértice consigo mismo. Esto significa que
cada relación representada por una arista es única y no ambigua. Este tipo de gráfico se
emplea para modelar relaciones directas y exclusivas entre elementos, como redes
sociales básicas o conexiones directas en sistemas de comunicación. Al ser la forma más
básica dentro de la teoría de gráficos, los gráficos simples son el punto de partida para
comprender estructuras más complejas (Everywhere, 2020).
3.3.2 Multígrafo
El multígrafo es una variación del gráfico simple que permite la existencia de múltiples
conexiones entre los mismos vértices. En este tipo de estructura, dos nodos pueden estar
conectados por más de una arista, conocidas como aristas paralelas, y también se
permite la presencia de lazos, es decir, aristas que conectan un vértice consigo mismo.
Este modelo es útil en contextos donde es necesario representar relaciones múltiples o
redundantes, como en redes de transporte donde puede haber varias rutas entre dos
puntos, o en sistemas eléctricos con conexiones alternativas. Su capacidad para
representar interacciones más complejas lo convierte en una herramienta útil en diversas
áreas de análisis (Everywhere, 2020).
3.3.3 Grafo Dirigido
Un gráfico dirigido, también llamado dígrafo, es una estructura en la que las conexiones
entre los nodos tienen un sentido definido. Las aristas están orientadas, lo que significa
que conectan un nodo de origen con un nodo de destino. Esto permite representar
relaciones unidireccionales, como flujos de datos, procesos jerárquicos o rutas de
tráfico. Si se permite más de una arista orientada en el mismo sentido entre dos nodos,
se denomina multígrafo dirigido. Este tipo de gráfico es especialmente útil en sistemas
donde el orden o la dirección de las relaciones es fundamental, como en diagramas de
procesos industriales o en la gestión de redes logísticas (Everywhere, 2020).
3.3.4 Grafos No Dirigidos
En un grafo no dirigido, las aristas no tienen dirección, lo que implica que las relaciones
entre los nodos son bidireccionales. Si existe una arista entre los nodos A y B, significa
que A está conectado con B y B está igualmente conectado con A. Las aristas se
representan mediante un par no ordenado de nodos {A,B}, sin especificar cuál es el
nodo de origen o de destino (Everywhere, 2020).
Este tipo de grafo se utiliza en situaciones donde las relaciones entre los nodos son
simétricas. Ejemplos comunes incluyen redes de amistad en plataformas sociales como
Facebook, donde si A es amigo de B, entonces B es amigo de A, o redes de transporte
donde las rutas permiten el paso en ambas direcciones, como en las carreteras o líneas
de metro.
3.3.4.1. Características de los Grafos No Dirigidos
Las principales características de un grafo no dirigido son:
Sin dirección en las aristas: Las aristas no tienen una dirección definida, lo que
implica que la relación entre los nodos es simétrica.
Notación: Las aristas se representan como un par no ordenado de nodos {u,v}, lo
que significa que la relación entre los nodos es recíproca.
Ejemplo: Si tenemos los nodos A, B y C, y las aristas {A,B}; {B,C};{A,C},
significa que A está conectado con B, B con C, y A con C, y todas estas
conexiones son bidireccionales.
3.3.4.2 Aplicaciones de los Grafos No Dirigidos
Los grafos no dirigidos son más adecuados cuando la relación entre los nodos es
bidireccional. Algunas de sus aplicaciones incluyen:
Redes sociales: en plataformas como Facebook, donde la relación de amistad es
recíproca; si A es amigo de B, entonces B también es amigo de A.
Redes de transporte: en sistemas de carreteras o rutas de metro que permiten el
paso en ambas direcciones, como es el caso de muchas autopistas y líneas
ferroviarias.
Redes de colaboración: en ámbitos académicos o laborales, donde si una persona
colabora con otra, la relación es mutua.
3.3.5 Gráfico completo
Un grafo completo es aquel en el que todos los vértices están directamente conectados
entre sí mediante una única arista. Esta estructura está completamente interconectada,
ya que cada par de nodos tiene una relación directa. Los gráficos completos son
comunes en escenarios donde se evalúan necesidades de todas las posibles conexiones
entre elementos, como en estudios de redes totalmente conectadas o en problemas de
optimización de rutas. Además, son útiles para analizar caminos dentro de sistemas
altamente interrelacionados, ya que permiten examinar todas las posibles combinaciones
de enlaces y nodos.
3.3.6 Grafo Conexo
Un grafo conexo es aquel donde cualquier par de nodos está relacionado mediante al
menos un camino, garantizando que no existan nodos aislados. Este tipo de grafo es
clave para representar sistemas donde la conectividad entre elementos es esencial, como
en redes de transporte, sistemas eléctricos o redes de comunicación. Una variante
importante de los gráficos conectados es el árbol, una estructura que no contiene ciclos
y que permite la conexión única entre cada par de nodos. Los árboles se utilizan con
frecuencia en algoritmos, diseño de redes jerárquicas y estructuras de datos, debido a su
simplicidad y eficiencia para conectar nodos de manera única (Everywhere, 2020).
3.3.7 Gráficos etiquetados
Un gráfico de etiquetado se caracteriza por incluir información adicional en sus aristas,
como valores numéricos o etiquetas descriptivas. Estas etiquetas pueden representar
pesos, costos, distancias u otros datos relevantes, permitiendo analizar las relaciones
entre los nodos de forma más detallada. Cuando las etiquetas indican pesos o
longitudes, el gráfico se denomina ponderado, y es ampliamente empleado en
problemas de optimización, como encontrar rutas más cortas o minimizar costos de
transporte. Este tipo de gráfico es fundamental en aplicaciones como mapas de
carreteras, redes de distribución y sistemas de análisis de datos, ya que permite modelar
y resolver problemas complejos con múltiples variables (Everywhere, 2020).
CAPITULO II
4.1. Definición de Ruta
La palabra “Ruta” tiene diferentes significados según el ámbito en que se aplique. En su
esencia, y según la Real Academia Española (RAE), se define ruta como “Camino o
dirección que se toma para llegar a un lugar o para realizar un propósito” (RAE, 2023).
Algunas definiciones de ruta según el ámbito en donde se encuentren son:
En el ámbito informático, el concepto de "ruta" tiene un sentido distinto, refiriéndose a
la dirección que lleva a un archivo o directorio dentro de un sistema de almacenamiento
digital. Esto es crucial para organizar y acceder a la información dentro de la estructura
de un sistema de archivos.
En el ámbito de la geografía y el transporte, las rutas son caminos pavimentados, como
carreteras o autopistas, que permiten el tránsito de vehículos, siendo esenciales para la
logística y la movilidad en general.
En áreas como la gestión logística, una "Ruta" se entiende como el itinerario planeado
para alcanzar un destino de manera eficiente, minimizando el tiempo o los costos
asociados. Este concepto es fundamental tanto en el transporte terrestre como aéreo, y
se emplea ampliamente en la optimización de trayectos.
Por último, en un sentido más metafórico, el término "ruta" también puede hacer
referencia a las decisiones y pasos que una persona elige seguir en su vida para alcanzar
metas personales, similar a lo que se denomina una "hoja de ruta".
4.2. Ruta más corta
La ruta más corta, como sugiere el sentido común, se refiere al “camino más corto”,
“rumbo más directo” o “itinerario reducido” que conecta un punto de inicio con un
destino. Este concepto tiene un significado técnico más específico en la teoría de grafos,
donde se define como el trayecto que minimiza un determinado costo, ya sea distancia,
tiempo o esfuerzo, entre dos nodos en una red. (QUINTANA, 2005)
Algunos autores definen la ruta más corta como el camino más eficiente entre dos nodos
en un grafo, donde la eficiencia se mide por la longitud total del camino. (Yungán,
Salazar, & Villacrés, 2022). Estos autores mencionan que el problema de encontrar la
ruta más corta ha existido desde la antigüedad, y que su solución ha evolucionado a lo
largo del tiempo, pasando de métodos simples a métodos matriciales más complejos. El
autor destaca el algoritmo de Bellman-Ford como un método simple y efectivo para
encontrar la ruta más corta, especialmente porque puede manejar arcos negativos y tiene
un tiempo de ejecución menor que otros algoritmos.
Por otro lado, en 1959, Edsger Dijkstra, un influyente científico de la computación,
introdujo el algoritmo que lleva su nombre, conocido como el algoritmo de Dijkstra.
Este algoritmo aborda el problema de la ruta más corta, que consiste en determinar el
camino más corto desde un nodo fuente a todos los demás nodos en un grafo ponderado,
este problema resulta fundamental en el campo de la teoría de grafos y tiene
aplicaciones prácticas en diversas áreas, como la planificación de rutas, la optimización
de redes y la navegación. El algoritmo de Dijkstra es especialmente valorado por su
eficiencia y simplicidad, lo que lo convierte en una herramienta esencial para resolver
problemas de optimización en grafos.
4.2.1 Explicación general sobre los problemas de optimización de rutas
Los problemas de optimización de rutas surgen de la necesidad de encontrar las
trayectorias más eficientes para realizar tareas como entregas, transporte de personas o
bienes, y gestión de flotas, todo ello mientras se enfrentan limitaciones como tiempo,
costos y capacidad logística. Este tipo de problemas son comunes en sectores como la
logística, el transporte público, la distribución de mercancías, etc.
Un ejemplo básico de estos problemas es el problema del viajante (TSP, por sus siglas
en inglés), donde se busca la ruta más corta que permita visitar un conjunto de puntos
(ciudades, clientes, etc.) y regresar al punto de origen. Este problema se complica
cuando se agregan restricciones como horarios específicos, capacidades limitadas de los
vehículos, y condiciones dinámicas como el tráfico o cambios en la demanda.
4.3. Importancia
La búsqueda de la ruta más corta no es solo un ejercicio matemático, es un principio
fundamental que se incorpora en nuestra vida diaria y que se aplica en diversos ámbitos,
como, por ejemplo, la investigación de operaciones, la ingeniería y la informática.
Algunas razones son:
En el sector del transporte y la logística, resulta esencial mejorar las rutas para
mantener la competitividad. Mediante el uso de algoritmos avanzados que
determinan los trayectos más efectivos, se logran reducir los tiempos de
desplazamiento, disminuir el gasto de combustible, organizar mejor las rutas de
entrega y optimizar las cadenas de suministro. Estas mejoras se reflejan en un
uso más eficiente de los recursos, incrementos en la rentabilidad y niveles más
altos de satisfacción para los clientes.
En el ámbito industrial, identificar trayectorias óptimas es clave para
perfeccionar los procesos productivos. La aplicación de algoritmos
especializados permite mejorar la organización en las líneas de producción,
acortar los tiempos de inactividad, optimizar la asignación de recursos y agilizar
la distribución de materiales. Con esto se logra que las industrias generen mayor
eficiencia operativa, menores costos y una mejora significativa en la calidad de
los productos finales.
En el sector salud, la mejora de rutas resulta indispensable para brindar una
atención eficiente, ya que se logra una asignación más eficaz de los recursos, se
agiliza la respuesta en situaciones de emergencia, se facilita el acceso a servicios
médicos en zonas apartadas y se optimiza la logística de entrega de
medicamentos y equipos médicos. El resultado es un sistema sanitario más
eficiente, con un mejor acceso a los servicios de salud y mayor satisfacción para
los pacientes.
En el campo tecnológico, la optimización de trayectorias constituye un elemento
clave para crear soluciones innovadoras mejorando el rendimiento de las redes
de comunicación, aumenta la velocidad en la transmisión de datos, permite
diseñar sistemas de inteligencia artificial más eficientes, optimiza el manejo de
la información y fortalece las estrategias de ciberseguridad. Estas aplicaciones
conducen a un entorno digital más avanzado, interconectado y seguro.
Por último, en la investigación científica, la búsqueda de trayectorias óptimas se
utiliza para modelar sistemas complejos, analizar redes neuronales, optimizar
algoritmos genéticos y desarrollar nuevas tecnologías. La implementación de
estas herramientas facilita una comprensión más profunda de sistemas
complejos, impulsa la creación de soluciones innovadoras y contribuye
significativamente al progreso del conocimiento científico.
La gran variedad de aplicaciones prácticas de este concepto, resulta especialmente
valioso en distintas áreas, además, estas soluciones no solo benefician a las empresas al
mejorar su competitividad, sino que también contribuyen al bienestar de los usuarios al
ofrecerles servicios más accesibles y de mayor calidad.
3.4 Tipos de Rutas
3.4.1 Rutas Óptimas
Las rutas óptimas son aquellas trayectorias que, dentro de un conjunto de posibles
caminos, ofrecen la mejor solución en cuanto a algún criterio específico, como tiempo,
distancia o costo. El concepto de "óptimo" se refiere a la minimización o maximización
de un parámetro determinado, lo que las convierte en soluciones ideales para diversos
problemas de optimización en diferentes ámbitos. (Rocha, Gómez, & Sánchez, 2013)
Entre sus características más destacadas está la capacidad de adaptarse a diversas
restricciones, como limitaciones de capacidad, tiempos de espera, o condiciones de
tráfico. Una ruta óptima no solo busca la eficiencia en un solo aspecto, sino que tiene en
cuenta el equilibrio de varias variables, lo que la hace aplicable a una amplia variedad
de contextos. A continuación, se destacan algunas de sus aplicaciones más relevantes:
Transporte: En el ámbito del transporte, las rutas óptimas se utilizan para
encontrar el camino más corto o más rápido entre dos o más puntos,
minimizando el tiempo de viaje o la distancia recorrida. Este concepto es
esencial en la planificación de rutas para vehículos de carga, automóviles, o
transporte público, especialmente cuando se enfrentan a factores como el tráfico
o condiciones climáticas variables.
Redes de comunicación: En el campo de las redes, como Internet o las
telecomunicaciones, las rutas óptimas se refieren a las trayectorias más
eficientes para la transmisión de datos entre nodos. Aquí, se considera no solo la
distancia, sino también el ancho de banda, la latencia, y el costo de los recursos
de la red, con el fin de garantizar una comunicación rápida y efectiva.
Logística y distribución: Las empresas de logística emplean rutas óptimas para
gestionar las rutas de entrega de productos, buscando reducir los costos
operativos, el tiempo de transporte y el consumo de combustible. Esto se aplica
tanto a la distribución de mercancías como a la optimización de los almacenes y
las rutas internas dentro de grandes instalaciones.
Industria y manufactura: En la industria, las rutas óptimas pueden ser
utilizadas para el diseño de procesos productivos, donde los materiales o
productos deben seguir una secuencia de etapas en la planta de producción de la
manera más eficiente posible. Esto incluye la optimización de las rutas de
materiales en el suelo, la distribución de tareas y la gestión de recursos.
Sistemas de energía: En las redes eléctricas, las rutas óptimas ayudan a
distribuir la energía de manera eficiente, buscando minimizar las pérdidas en el
camino desde las plantas generadoras hasta los consumidores. Este tipo de
optimización es crucial para mantener la estabilidad y eficiencia de las redes de
energía.
3.4.2. Rutas Eficientes
Las rutas eficientes son aquellas que, dentro de un conjunto de posibles caminos, logran
maximizar el uso de los recursos disponibles y equilibrar múltiples variables para
ofrecer un desempeño general favorable. A diferencia de las rutas óptimas, que se
enfocan en la minimización o maximización de un único criterio, las rutas eficientes
priorizan soluciones prácticas que consideran restricciones reales, como capacidades
limitadas, costos y tiempo, en un contexto operativo. (Rocha, Gómez, & Sánchez, 2013)
Entre las principales características de las rutas eficientes se destacan la adaptabilidad a
condiciones cambiantes, el balance entre diferentes factores y la factibilidad para ser
implementadas en escenarios reales. Este enfoque permite atender demandas crecientes
en transporte, logística y redes de comunicación, maximizando el rendimiento global
del sistema. A continuación, se presentan sus aplicaciones más relevantes en distintos
campos:
3.4.2.1. Aplicaciones de las Rutas Eficientes
Transporte:
En sistemas de transporte público o privado, las rutas eficientes no siempre son
las más rápidas, sino aquellas que logran equilibrar el uso de combustible, costos
operativos y satisfacción del usuario. Por ejemplo, en redes de autobuses
urbanos, las rutas eficientes buscan reducir el tiempo total de espera de los
pasajeros y el consumo de recursos, mientras se garantiza la cobertura de áreas
con alta demanda.
Redes de comunicación:
En la transmisión de datos, como en Internet, las rutas eficientes equilibran
criterios como latencia, uso de ancho de banda y estabilidad de la conexión. Por
ejemplo, el enrutamiento dinámico en redes ajusta las trayectorias según las
condiciones de congestión, buscando maximizar la velocidad y minimizar
interrupciones en el servicio.
Logística y distribución:
En este campo, las rutas eficientes son clave para minimizar el impacto
ambiental y los costos logísticos. Empresas de distribución implementan
algoritmos multicriterio para diseñar rutas que consideren no solo la distancia,
sino también las ventanas de tiempo de entrega, el tamaño de los vehículos y las
restricciones de tráfico.
Industria y manufactura:
En procesos industriales, las rutas eficientes se aplican para optimizar la
logística interna de materiales en plantas de producción. Esto incluye la
secuencia de operaciones, distribución de tareas y minimización de
desplazamientos innecesarios, lo que resulta en una mayor productividad y
menores costos operativos.
Sistemas de energía:
En las redes eléctricas, las rutas eficientes son fundamentales para minimizar
pérdidas durante la transmisión de energía. Estas rutas consideran las
condiciones de la infraestructura, las demandas en tiempo real y los costos de
mantenimiento, asegurando un suministro constante y sostenible.
CAPITULO III
3. Algoritmos de búsqueda
Los algoritmos de búsqueda son métodos que se usan para encontrar un elemento
específico dentro de un conjunto de datos. Estos datos pueden estar organizados en
estructuras como grafos, árboles binarios o incluso en rangos de valores de funciones
matemáticas. Existen dos tipos principales de búsqueda que son la informada y no
informada. La búsqueda informada aprovecha información previa sobre el objetivo, lo
que la hace más rápida y eficiente. Por otro lado, la búsqueda no informada no tiene
datos sobre el objetivo, por lo que necesita explorar más opciones, lo que aumenta el
tiempo y los recursos necesarios. La elección del tipo de búsqueda y cómo se representa
el problema dependen de lo que se busca resolver y los recursos disponibles (Arellano,
2022, p. 1).
4.1. Algoritmos de Búsqueda No Informados
Hablamos de algoritmos de búsqueda no informados cuando estos no utilizan
información contenida en los elementos listados con el fin de alcanzar más rápido el
objetivo, es decir, ninguna información en cuanto a la proximidad al objetivo es
utilizada para guiar la elección de los elementos a expandir (y cerrar) en cada iteración.
Los algoritmos no informados más conocidos son los algoritmos de búsqueda en
amplitud (técnica de programación dinámica progresiva), la búsqueda en profundidad
(técnica de enumeración implícita no informada o "Backtracking") y el algoritmo de
Dijkstra, que se utiliza en grafos con costos no negativos (Meza & Ortega, 1993, p.
138).
Primero se explican los algoritmos de búsqueda no informada, conocidos como BFS
(búsqueda en anchura) y DFS (búsqueda en profundidad). Para entender cómo
funcionan, se utiliza un gráfico no dirigido y sin peso que contiene diez nodos como
ejemplo.
4.1.1. Búsqueda en Amplitud
El algoritmo en amplitud o anchura conocida en inglés como Breadth-First Search
(BFS), es un algoritmo de búsqueda que recorre todos los nodos de un grafo,
comenzando desde la raíz y expandiéndose por niveles. La forma de accionar de este
algoritmo es definiendo un nodo raíz y recorrer todos sus vecinos, luego, de cada uno de
los vecinos explorados, se exploran sus respectivos vecinos y este proceso se sigue hasta
que se recorra todo el grafo.
En otras palabras, la búsqueda en amplitud es un algoritmo de recorrido o búsqueda en
grafos que explora sistemáticamente todos los nodos a una misma profundidad antes de
avanzar a la siguiente. Comienza desde un nodo inicial y visita todos sus nodos vecinos
inmediatos antes de pasar a los vecinos de estos, repitiendo el proceso hasta encontrar el
nodo objetivo o recorrer todo el grafo. Se utiliza comúnmente en problemas de
conectividad, búsqueda de rutas más cortas en grafos no ponderados y como base para
otros algoritmos.
4.1.1.1. Características
Las características más relevantes de este algoritmo son los siguientes:
a) Recorrido por niveles: Explora el grafo nivel por nivel, comenzando con los
vecinos directos del nodo inicial y avanzando gradualmente hacia los más
alejados.
b) Uso de una estructura de cola: Utiliza una cola (FIFO: First In, First Out) para
gestionar el orden en el que los nodos son explorados. Los nodos se agregan a la
cola cuando se descubren y se procesan en el orden en que fueron añadidos.
c) Garantiza la ruta más corta en grafos no ponderados: Si los arcos o aristas no
tienen peso, BFS encuentra la ruta más corta entre el nodo inicial y cualquier
otro nodo alcanzable.
d) Marcado de nodos visitados: Mantiene un registro de los nodos ya explorados
para evitar ciclos y redundancias en el recorrido.
e) Completo y óptimo en ciertos casos: Es completo en grafos finitos, es decir,
siempre encuentra una solución si existe. Además, es óptimo cuando las aristas
no tienen peso.
4.1.1.2. Pasos para resolver
Para una mejor comprensión se pensó en la optimización de recursos, por lo que se
desarrolló la versión iterativa.
Así pues, el algoritmo de primero en anchura está conformado por los siguientes pasos:
Figura X
Representación del grafo
Nota. Se observa la representación del grafo para la solución con algoritmos BFS y
DFS.
1) Definir una cola y un nodo raíz.
2) Inicializa un array de visitados y agrega al nodo raíz al array.
3) Saca el primer nodo de la cola.
4) Marca el nodo que fue removido de la cola como visitado en el array.
5) Inserta todos los vecinos del nodo actual en la cola.
6) Repite los puntos del 3 al 5 hasta que la cola este vacía.
Analizando el algoritmo anterior, podemos observar que serán necesarios dos ciclos,
uno que se repite hasta que no haya más elementos en la cola y otro para recorrer todos
los vecinos del nodo actual, por lo que se puede pensar que tiene una complejidad del
tipo O(n 2 ) al tratarse de dos ciclos, pero esta conclusión ignora el hecho de que el
número de vecinos de cada nodo no es fijo, sino que varía por lo que en realidad se
tendría una complejidad de tipo O(V + E) donde V es el número de vértices y E el
número de aristas.
4.1.1.3. Limitaciones
Las limitaciones de este algoritmo son los siguientes:
a) Alto consumo de memoria: BFS puede requerir una gran cantidad de memoria
para almacenar los nodos en la cola, especialmente en grafos con muchos nodos
y un alto grado de ramificación. En el peor caso, consume espacio proporcional
al número de nodos del nivel más profundo explorado.
b) Ineficiente en grafos grandes o profundos: En grafos con un gran número de
nodos o niveles, BFS puede volverse lento y consumir muchos recursos debido a
la exploración exhaustiva de cada nivel antes de avanzar.
c) No considera pesos en las aristas: BFS no es útil para grafos ponderados, ya que
no tiene en cuenta los costos o pesos de las aristas. Para grafos de este tipo,
algoritmos como Dijkstra o A* son más adecuados.
d) No se adapta bien a búsquedas específicas: Si el objetivo está muy alejado del
nodo inicial, BFS recorrerá innecesariamente muchos otros nodos cercanos antes
de llegar al nodo deseado, lo que puede ser ineficiente.
4.1.2. Búsqueda en Profundidad
El algoritmo en amplitud o anchura conocida en inglés como Depth First Search (DFS),
es un algoritmo de búsqueda que atraviesa todos los nodos de un grafo, comenzando en
la raíz y extendiéndose lo más posible a lo largo de cada rama antes de retroceder.
Entonces, la idea general de este algoritmo es comenzar con un nodo raíz aleatorio y
marcarlo como visitado, luego pasar al siguiente nodo no visitado previamente y
marcarlo como visitado, hasta que no queden otros nodos y pueda cambiar a llegar. En
este punto deberás regresar para encontrar más nodos no visitados y repetir el ciclo
anterior. Tenga en cuenta que los algoritmos DFS se pueden desarrollar utilizando una
función recursivos o por ciclos.
Dicho de otra manera, la búsqueda en profundidad es un algoritmo de recorrido o
búsqueda en grafos que explora tanto como sea posible a lo largo de una rama antes de
retroceder y explorar otras ramas. Comienza desde un nodo inicial, visita un nodo
vecino y continúa adentrándose hasta alcanzar un nodo terminal o uno ya visitado.
Luego retrocede para explorar otras ramas desde el último punto donde fue posible
ramificarse. Asimismo, DFS es útil en problemas de recorrido completo, análisis de
grafos y como base para otros algoritmos.
4.1.2.1. Características
Las características más resaltantes que presenta son las siguientes:
a) Explora ramas completas antes de retroceder: DFS sigue una sola rama del grafo
hasta que no hay más nodos por explorar, momento en el cual retrocede para
probar caminos alternativos.
b) Uso de una estructura de pila: DFS puede implementarse de dos formas, la
primera de manera recursiva ya que utiliza la pila implícita del sistema; y la
segunda, de manera iterativa ya que usa una pila (LIFO: Last In, First Out) para
gestionar el recorrido de los nodos.
c) Recorre grafos dirigidos y no dirigidos: Es aplicable a cualquier tipo de grafo, ya
sea dirigido, no dirigido, conectado o desconectado.
d) No garantiza la ruta más corta: A diferencia de BFS, DFS no asegura encontrar
la ruta más corta, ya que explora en profundidad antes de evaluar todas las
opciones posibles.
e) Puede detectar ciclos y componentes conectados: Es eficaz para identificar
ciclos en grafos dirigidos y no dirigidos, y para encontrar componentes
fuertemente conectados.
f) Completo en grafos finitos: DFS siempre encontrará una solución si existe,
aunque puede no ser óptima. En grafos infinitos, puede no terminar.
4.1.2.2. Pasos para resolver
Así pues, el algoritmo de primero en profundidad está conformado por los siguientes
pasos:
1) Crea una pila para los nodos y un array de visitados
2) Inserta el nodo raíz 3 en la pila de nodos
3) Toma un nodo del stack y marcalo como el actual
4) Inserta todos los vecinos del nodo actual en la pila
5) Si el nodo actual no está en la lista de visitados, añadir.
6) Repite los puntos del 3 al 5 hasta que la cola este vacía.
Al igual que con el algoritmo bfs, podemos observar que serán necesarios dos ciclos,
uno que se repite hasta que no haya más elementos en la pila y otro para recorrer todos
los vecinos del nodo actual, por lo que se puede pensar que tiene una complejidad del
tipo O(n 2 ) al tratarse de dos ciclos, pero de igual forma, esto ignoraría el hecho de que
el número de vecinos de cada nodo no es fijo, sino que varía por lo que en realidad se
tendría una complejidad de tipo O(V + E) donde V es el número de vértices y E el
número de aristas (Arellano, 2022, p. 2).
4.1.2.3. Limitaciones
Las limitaciones sobre este algoritmo son las siguientes:
a) Puede quedarse atrapado en bucles: Si el grafo tiene ciclos y no se lleva un
registro adecuado de los nodos visitados, DFS puede entrar en un bucle infinito.
Esto es especialmente problemático en grafos infinitos.
b) No es óptimo: DFS no garantiza encontrar la mejor solución, ya que no evalúa
todas las posibilidades antes de decidir un camino.
c) Riesgo de desbordamiento de pila: En implementaciones recursivas, si el grafo
tiene una gran profundidad, la pila puede desbordarse, causando errores o
ineficiencia. En implementaciones iterativas, la pila puede crecer
significativamente, consumiendo mucha memoria.
d) Exploración desigual: DFS puede ignorar rutas prometedoras cerca del nodo
inicial mientras explora profundamente en una rama menos relevante.
4.1.3. Algoritmo de Dijkstra
Los dos algoritmos estudiados anteriormente tienen la ventaja de utilizar "poca"
memoria. Sin embargo, son poco eficientes pues no toman en consideración los costos y
exploran indiscriminadamente todos los caminos que parten de S. En el problema de la
arborescencia de caminos mínimos, los caminos que más prometen ser óptimos entre los
abiertos son aquellos de costo mínimo. El algoritmo de Dijkstra se obtiene
estableciendo el siguiente criterio de elección de abiertos a cerrar: escoger el abierto de
menor costo, de esta manera la exploración del grafo será hecha en camadas de caminos
de costo similar, salvo en el caso de que existan costos negativos (Meza y Ortega, 1993,
p. 138).
4.1.3.1. ¿Qué es?
El algoritmo de Dijkstra se utiliza para calcular las rutas más cortas desde un nodo de
inicio hasta todos los demás nodos de una red. Es un algoritmo de tipo "greedy"
(codicioso) porque, en cada paso, selecciona la opción que parece más prometedora en
ese momento, con la idea de que esto llevará a la mejor solución global (Alonso, 2008).
El algoritmo de Dijkstra es una herramienta eficiente que permite calcular el camino
con el menor costo desde un nodo inicial hasta todos los demás nodos de un grafo. Fue
creado en 1959 por el matemático y científico informático holandés Edsger Wybe
Dijkstra. Este algoritmo sigue un enfoque ávido, lo que significa que resuelve el
problema paso a paso, eligiendo en cada etapa la opción más óptima disponible para
llegar a la solución final.
El fundamento sobre el que se basa este algoritmo es el principio de optimizar, tomando
en cuenta la figura X: si el camino más corto entre dos vértices "u" y "v" pasa por un
tercer vértice "w", entonces la parte del camino entre "w" y "v" también debe ser el
camino más corto entre esos dos puntos. A partir de esta idea, el algoritmo construye
progresivamente los caminos de menor costo desde un vértice inicial hasta todos los
demás vértices del grafo, utilizando los caminos ya calculados como base para encontrar
nuevos.
En términos más simples, si en un grafo cada arco tiene un peso, el camino de costo
mínimo entre dos vértices "u" y "v" es aquel en el que la suma de los pesos de los arcos
que lo forman es la más baja posible entre todos los caminos que conectan esos dos
vértices.
El funcionamiento del algoritmo es el siguiente: en cada paso, selecciona un vértice "v"
que aún no tiene su distancia confirmada pero que tiene la menor distancia al vértice
origen "s". Una vez que se identifica este vértice, se confirma que el camino más corto
entre "s" y "v" ya está definido, y se marca "v" como procesado. Este proceso se repite
seleccionando nuevos vértices hasta que todos estén marcados, momento en el cual se
conocen las distancias más cortas desde el origen "s" hasta todos los vértices del grafo.
Figura X
Grafo para la explicación del principio de optimalidad
Nota. Adaptada de Algoritmo Dijkstra, por Sánchez Gloria & Lozano Víctor, 2002,
Universidad Politécnica de Madrid. https://arodrigu.webs.upv.es/grafos/doku.php?
id=algoritmo_dijkstra
Entre las condiciones más importantes que deben considerarse para aplicar el algoritmo
están:
- Las aristas deben tener un peso no negativo.
- El grafo debe ser dirigido y por supuesto ponderado.
Una posible aplicación de este algoritmo se presenta cuando se desea encontrar la ruta
más corta entre dos ciudades; cada vértice representa una ciudad y las aristas
representan la duración de los vuelos.
4.1.3.2. Características
a) Uso de métricas para evaluar los arcos: Cada arco en la red tiene un valor
numérico asociado que representa su coste. Este coste puede ser proporcional a
la carga del enlace, inversamente proporcional a su capacidad o una
combinación de ambos. Para determinar la ruta óptima, el algoritmo suma las
métricas de todos los arcos que forman parte de una ruta y selecciona aquella
cuya suma total sea la menor.
b) Diferencias en los costes según la dirección: El coste de un arco puede variar
dependiendo del sentido en el que se atraviese. Esto se debe a factores como el
retardo y la carga, que pueden diferir según las características específicas de las
interfaces de salida de los nodos. Por ello, el algoritmo considera estos costes de
manera unidireccional, evaluando cada dirección de forma independiente.
c) Uso de etiquetas para calcular distancias mínimas: Una característica de este
algoritmo es la utilización de etiquetas en cada nodo cuya función es indicar en
cada iteración del algoritmo la distancia del origen a dicho nodo. En cada
iteración una de las etiquetas será "permanente", es decir, indicará la distancia
mínima final del nodo inicial a dicho nodo (Alonso, 2008, p. 59).
d) Optimización de rutas desde un nodo origen: Dijkstra calcula las rutas óptimas
desde un nodo de origen hasta todos los demás nodos de la red. Este enfoque
permite no solo identificar la mejor ruta hacia un destino en particular, sino
también construir un mapa completo de las rutas más eficientes en términos de
coste desde el nodo inicial.
e) Escalabilidad y aplicación práctica: Dijkstra es ampliamente utilizado en redes
de computadoras y sistemas de navegación debido a su capacidad para trabajar
con redes grandes y diversas. Al optimizar rutas basadas en costes dinámicos
como el retardo o la carga, resulta ideal para entornos donde las condiciones de
los arcos pueden cambiar con (Gil et al., 2010, p. 172).
4.1.3.3. Aplicaciones del algoritmo
Las aplicaciones del algoritmo de Dijkstra son muy diversas y de gran importancia en
distintas áreas del conocimiento. Vamos a presentar algunas de ellas.
Encaminamiento de paquetes en routers: Consideremos una red telefónica donde los
mensajes tardan en viajar por las líneas debido a factores como la congestión o retrasos
en las conexiones. En esta red, cada línea tiene un "costo" asociado que refleja el tiempo
o los recursos necesarios para atravesarla. El problema se centra en encontrar el camino
con el menor costo total entre dos puntos específicos: un nodo de inicio (donde
comienza el mensaje) y un nodo final (su destino) (Trick, 1998).
Aplicaciones para Sistemas de información geográficos: El encaminamiento de
paquetes por routers tiene aplicaciones interesantes en sistemas de información
geográfica, como la extracción de características curvilíneas en imágenes mediante
técnicas de minimización de caminos. En este enfoque, la imagen se representa como
una matriz de puntos donde cada píxel es un nodo que puede estar conectado a un
máximo de ocho nodos vecinos. El peso de las conexiones entre nodos (arcos) se
calcula en función de la diferencia de intensidad entre los píxeles. Este método resulta
más económico comparado con las herramientas actuales que emplean procesos
automáticos de vectorización (Bibie & Lewis, 1994).
Caminos mínimos en Grafos usando XML y parsers de Java: Un camino en un
grafo se define como una secuencia de elementos que incluyen operadores y conectores.
Los operadores representan unidades que realizan un proceso específico, como convertir
formatos o realizar cálculos, mientras que los conectores son los medios por los cuales
los operadores se comunican, como canales o interfaces. A partir de un conjunto de
operadores y conectores descritos, junto con ciertos parámetros de optimización
proporcionados por el usuario y requisitos específicos, el sistema se encarga de
identificar el camino más eficiente. Este camino conecta una entrada inicial con una
salida deseada, aplicando las transformaciones necesarias y buscando minimizar el
tiempo requerido para completar el proceso (Patterson, 2000).
Reconocimiento de lenguaje hablado: Un problema que se presenta es el distinguir
entre palabras que suenan de manera similar. Se puede construir un grafo cuyos vértices
correspondan a palabras posibles y cuyos arcos unan palabras que puedan ir colocadas
una al lado de otra. Si el peso del arco corresponde a la probabilidad de que estén así
colocadas, el camino más corto en el grafo será la mejor interpretación de la frase
(Steven, 2001).
Otras aplicaciones: Enrutamiento de aviones y tráfico aéreo. Tratamiento de imágenes
médicas. Problemas de optimización de una función de coste para moverse entre
diversas posiciones
4.1.3.4. Sobre Edsger Wybe Dijkstra
Edsger Wybe Dijkstra nació en 1930 en Rotterdam, Holanda, en una familia de
intelectuales. Su padre era químico y su madre matemática, por lo que recibió una
educación sobresaliente desde joven. En 1942, a los 12 años, ingresó al Gymnasium
Erasminium, una escuela para estudiantes destacados, donde estudió asignaturas como
griego, latín, francés, alemán, inglés, biología, matemáticas y química. Inicialmente, en
1945, pensó en estudiar Derecho para convertirse en representante de Holanda en las
Naciones Unidas, pero su talento en matemáticas, química y física lo llevó a ingresar a
la Universidad de Leiden para estudiar física teórica.
En 1951, durante un curso de verano en la Universidad de Cambridge, Dijkstra se
interesó por la programación. Al regresar, comenzó a trabajar en el Centro Matemático
de Ámsterdam en 1952, donde su interés por la programación creció. Sin embargo, en
esa época, ser programador no se consideraba una profesión reconocida. Por ejemplo, al
casarse en 1957, tuvo que declararse como físico teórico porque no existía la categoría
de programador.
Dijkstra continuó en el Centro Matemático hasta principios de los años 70, cuando
aceptó un trabajo como desarrollador en Burroughs Corporation en Estados Unidos. Su
trayectoria profesional fue destacada: en 1972 recibió el prestigioso Premio Turing de la
ACM, y en 1974, el AFIPS Harry Good Memorial. En los años 80, se mudó a Austin,
Texas, donde en 1984 asumió un puesto en la Universidad de Texas como profesor de
Ciencias de la Computación. Allí trabajó hasta su fallecimiento el 6 de agosto de 2002
en Nuenen, Holanda.
A lo largo de su vida, Dijkstra recibió numerosos reconocimientos, incluyendo ser
miembro honorario de la Academia Americana de Artes y Ciencias y la Real Academia
Holandesa de Artes y Ciencias, además de Doctor Honoris Causa en Ciencias por la
Queen's University Belfast. Su legado como matemático y científico de la computación
sigue siendo influyente en el campo (Rodriguez, 2023).
Asimismo, Dijkstra fue uno de los miembros más influyentes de la generación
fundadora de la ciencia informática. Entre los ámbitos en los que sus contribuciones
científicas son fundamentales se encuentran:
Diseño de algoritmo
Lenguajes de programación
Diseño de programas
Sistemas operativos
Procesamiento distribuido
Especificación formal y verificación
Diseño de argumentos matemáticos
Además, Dijkstra estaba intensamente interesado en la enseñanza y en las relaciones
entre la informática académica y la industria del software.
Durante sus más de cuarenta años como científico informático, que incluyó puestos
tanto en el ámbito académico como en la industria, las contribuciones de Dijkstra le
valieron numerosos premios y reconocimientos, incluido el máximo honor de la ciencia
informática, el Premio ACM Turing (Richards, 2021).
4.1.3.5. Ruta más corta por el algoritmo Dijkstra
En esta sección se abordan conceptos como la ruta más corta, el árbol mínimo y el
camino mínimo, y se ofrece un ejemplo para facilitar la comprensión de estos temas. En
1956, Dijkstra presentó su algoritmo de caminos mínimos después de trabajar con el
ARMAC, una computadora que formaba parte del Centro Matemático. Más adelante,
desarrolló el algoritmo para el árbol generador mínimo. A principios de los años 60,
Dijkstra aplicó la idea de exclusión mutua a las comunicaciones entre una computadora
y su teclado, y su solución ha sido usada en procesadores y tarjetas de memoria
modernas desde 1964, cuando IBM la implementó por primera vez en la arquitectura de
su computadora IBM 360. Dijkstra también abordó el famoso problema de los filósofos
comensales, en el que cinco filósofos se sientan alrededor de una mesa circular con un
plato de arroz y un palillo a cada lado, de manera que hay cinco palillos en total. El
desafío es usar los recursos compartidos de manera eficiente sin que los filósofos
enfrenten bloqueos, inanición o conflictos por los recursos. Además, Dijkstra promovió
la importancia de la disciplina en la programación, afirmando que el uso excesivo de la
instrucción GOTO hacía que el código fuera más difícil de entender.
En cuanto a las redes de comunicación, se trata de un conjunto de nodos conectados
mediante arcos, que transportan datos de un nodo origen a un nodo destino. La forma
más común de elegir la ruta de estos datos es a través de la ruta más corta, donde cada
arco tiene un valor positivo que representa su longitud. Un algoritmo de ruta más corta
calcula el camino de menor longitud entre el nodo de origen y el de destino. En su
versión más simple, donde cada arco tiene la misma longitud, la ruta más corta se define
como aquella con el menor número de arcos. Sin embargo, en un caso más general, la
longitud de un arco puede depender de factores como su capacidad de transmisión y el
nivel de tráfico.
La idea es encontrar la ruta más corta que, idealmente, contenga arcos menos
congestionados, lo que aumenta la eficiencia de la transmisión de datos. Algunos
algoritmos de ruteo avanzados permiten que la longitud de los arcos varíe con el tiempo,
adaptándose a los cambios en el tráfico y evitando nodos congestionados. Por lo tanto,
los algoritmos de ruta más corta deben funcionar de manera continua, determinando la
mejor ruta con longitudes que se actualizan en función de las condiciones de tráfico en
tiempo real.
El problema de la ruta más corta se puede resolver utilizando programación lineal, sin
embargo, debido a que el método simplex es de complejidad exponencial, se prefiere
utilizar algoritmos que aprovechen la estructura en red que se tiene para estos
problemas. Para ello, el algoritmo mantiene un conjunto S de nodos cuyos pesos finales
de camino mínimo desde el nodo origen ya han sido determinados. A continuación, se
muestra el pseudocódigo del Algoritmo:
Dijkstra (G,s)
Inicializar
for cada v perteneciente a V[G]
do d[v] = infinito
p[v] = nulo
d[s] = 0
S = vacio
Q = V[G]
mientras Q no vacio
do u = nodo v con min d[v]
S = S unión u 'se añade al conjunto de nodos finalizados
for cada v perteneciente Adyacente u
Relajación
if d[v] > d[u] + w(u,v) then
d[v] = d[u] + w(u,v)
p(v) = u
Para comprender mejor el funcionamiento del algoritmo puede seguir este sencillo
ejemplo. En primer lugar, construya el siguiente grafo a partir de la siguiente matriz de
distancias.
Tabla X
Matriz de costos de transporte entre diferentes destinos
Nota. Se observa las distancias entre los orígenes y los destinos. Tomada de Algoritmo
Dijkstra, por Rodríguez, 2023, upv. https://arodrigu.webs.upv.es/grafos/doku.php?
id=algoritmo_dijkstra
El resultado dibujado será como muestra la siguiente figura.
Figura X
Grafo dirigido ponderado
Nota. Se observa que las conexiones (arcos) tienen una dirección y un peso asociado.
Adaptada de Algoritmo Dijkstra, por Rodríguez, 2023, upv.
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
Seguidamente elija el nodo 0 como origen, y el nodo 4 como destino. El algoritmo de
Dijkstra (camino mínimo) se activará en el menú y podrá ser utilizado.
Figura X
Grafo dirigido y ponderado
Nota. Adaptada de Algoritmo Dijkstra, por Rodríguez, 2023, upv.
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
Tras el cálculo, se mostrará la solución tal y como muestra la siguiente imagen.
Figura X
Grafo dirigido y ponderado
Nota. Adaptada de Algoritmo Dijkstra, por Rodríguez, 2023, upv.
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
Los arcos subrayados forman parte del camino mínimo que une siguiendo la dirección
de los arcos, el nodo origen 0 elegido hasta llegar al nodo destino 4. De todas las
posibles conexiones existentes entre el nodo origen y el nodo destino, el algoritmo de
Dijkstra proporciona el camino mínimo óptimo, es decir, el de menor distancia o coste
total de todos los posibles; que en este caso tiene un coste total de 7 unidades.
A continuación, se presentan los arcos calculados desde el nodo origen (0) hasta el nodo
destino (4):
* 0 ----(5)---> 3
* 3 ----(2)---> 4
Costo total: 5 + 2 = 7
Asimismo, se representa el resultado en la siguiente tabla:
Tabla X
Matriz de arcos con coste mínimo
Nota. Adaptada de Algoritmo Dijkstra, por Rodríguez, 2023, upv.
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
4.1.3.6. Ruta más larga por el algoritmo Dijkstra
En este apartado se habla sobre la ruta más larga, el árbol máximo y el camino crítico, y
se incluye un ejemplo para ayudar a entender estos conceptos. El camino crítico se
compone de tareas esenciales (nodos) cuya duración (el tiempo que lleva completar
cada tarea) define el tiempo total de un proyecto. Si alguna de estas tareas críticas se
retrasa o su duración cambia durante el proyecto, esto afectará directamente el tiempo
total de finalización del proyecto.
Encontrar el camino crítico es básicamente encontrar la secuencia de tareas más larga
desde el inicio del proyecto hasta su final. Esto significa determinar el tiempo mínimo
necesario para completar todo el proyecto. Es importante destacar que, para calcular el
camino crítico, se busca el camino que tenga la duración total más alta desde la tarea
inicial hasta la tarea final.
Aunque el algoritmo de Dijkstra fue originalmente diseñado para encontrar la ruta más
corta, se puede modificar para encontrar la ruta más larga o el camino crítico,
simplemente ajustando su función objetivo. De forma similar, se puede usar para
calcular el árbol máximo desde un nodo de inicio, que es una estructura que conecta
todos los nodos con el mayor peso posible.
Para un mejor entendimiento, se considera el mismo ejemplo anterior, pero esta vez se
requiere calcular la ruta más larga.
En este sentido, el cálculo del camino máximo se realiza del mismo modo, pero arrojará
los resultados contrarios. En consecuencia, se muestra en la siguiente figura la solución
para este caso con un coste máximo de 25 unidades (Rodriguez, 2023).
Figura X
Grafo dirigido y ponderado
Nota. Adaptada de Algoritmo Dijkstra, por Rodríguez, 2023, upv.
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
Los arcos calculados desde el nodo origen (0) hasta el nodo destino (4) son los
siguientes:
* 0 ----(10)---> 1
* 1 ----(2)---> 3
* 3 ----(9)---> 2
* 2 ----(4)---> 4
Costo total: 10 + 2 + 9 + 4 = 25
Finalmente, se representa el resultado en la siguiente tabla:
Tabla X
Matriz de arcos con coste mínimo
Nota. Adaptada de Algoritmo Dijkstra, por Rodríguez, 2023, upv.
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
4.1.3.7. Ventajas
Garantiza encontrar la ruta más corta: Una de las principales fortalezas del
algoritmo de Dijkstra es que asegura encontrar la ruta más corta entre un nodo origen y
cualquier otro nodo en un grafo ponderado, siempre que los pesos de las aristas sean no
negativos. Esto lo convierte en una solución confiable para problemas de optimización,
como sistemas de navegación, planificación de rutas o redes de comunicación. Por
ejemplo, si necesitas determinar el camino más corto entre dos ciudades en un mapa sin
considerar tráfico (pesos negativos), Dijkstra ofrecerá siempre el mejor resultado.
Es completo y óptimo: Dijkstra es un algoritmo completo, lo que significa que siempre
encontrará una solución si existe un camino hacia el nodo destino. Además, su
naturaleza óptima garantiza que la solución será la más eficiente en términos de costo
total del recorrido. Esto lo hace ideal para grafos donde la precisión es crucial, como en
el diseño de redes eléctricas o sistemas logísticos.
Eficiente en grafos dispersos y pequeños: Cuando se aplica en grafos con pocos nodos
o aristas, Dijkstra es rápido y eficiente. Su complejidad se reduce en estos casos,
permitiendo que el algoritmo encuentre soluciones de manera rápida sin consumir
demasiados recursos. Esto lo hace adecuado para problemas de menor escala, como la
planificación de rutas en redes locales o de transporte público de ciudades pequeñas.
Aplicación amplia en diversas áreas: Dijkstra tiene aplicaciones en múltiples
dominios. Es utilizado en sistemas de navegación GPS para calcular rutas óptimas, en
redes de computadoras para determinar las rutas más eficientes para transmitir datos, y
en juegos de video para que los personajes controlados por IA encuentren el camino más
corto hacia un objetivo. Su versatilidad lo convierte en una herramienta fundamental en
ciencias de la computación y disciplinas relacionadas.
Adaptable para diferentes escenarios: El algoritmo puede modificarse para ajustarse a
diferentes necesidades. Por ejemplo, puede calcular la ruta más corta desde un nodo
origen a un único nodo destino; asimismo el árbol de caminos más cortos desde un nodo
origen hacia todos los demás nodos del grafo. Esta flexibilidad permite personalizar
Dijkstra según el tipo de problema que se desea resolver.
Utiliza estructuras eficientes para el cálculo: Con implementaciones avanzadas, como
el uso de montículos binarios, el algoritmo puede ser optimizado significativamente,
reduciendo su tiempo de ejecución en grafos grandes o densos. Estas mejoras hacen que
Dijkstra sea competitivo incluso en contextos donde se necesita rapidez, como en
sistemas en tiempo real.
Base para otros algoritmos más complejos: Dijkstra es un algoritmo fundamental que
sirve como base para otros algoritmos más avanzados. Por ejemplo, el algoritmo A*
extiende Dijkstra añadiendo una heurística para mejorar la eficiencia en ciertas
búsquedas. Esto muestra que su lógica es robusta y puede adaptarse para resolver
problemas más complejos.
4.1.3.8. Limitaciones
Una de las principales limitaciones del algoritmo de Dijkstra es que no funciona
correctamente con pesos negativos en las aristas del grafo. Esto ocurre porque el
algoritmo asume que una vez se encuentra el camino más corto hacia un nodo, este
valor no cambiará. Sin embargo, si en el grafo existe una arista con peso negativo,
podría suceder que un camino alternativo reduzca el costo total, y Dijkstra no reevaluará
esa opción. Por ejemplo, si hay una ruta más barata que incluye un peso negativo, el
algoritmo no la considerará adecuadamente. Esto lo hace inadecuado para problemas
donde los pesos negativos son comunes, como en ciertas aplicaciones financieras o de
redes complejas.
El consumo de tiempo y memoria también es una desventaja significativa de Dijkstra,
especialmente en grafos grandes y densos. A medida que aumenta el número de nodos y
aristas, el algoritmo debe calcular las distancias para todos los caminos posibles, lo que
puede volverse computacionalmente costoso. Aunque hay maneras de optimizarlo,
como el uso de montículos binarios, estas implementaciones avanzadas aún consumen
recursos significativos y pueden no ser prácticas en grafos muy grandes, como los de
mapas globales o redes sociales masivas.
Otro punto débil es que el algoritmo explora caminos innecesarios. Dijkstra evalúa
todas las rutas desde el nodo origen hacia los demás, incluso si algunas no tienen
relevancia para la solución final. Esto significa que, aunque encuentra la ruta más corta,
puede desperdiciar tiempo procesando caminos que no contribuyen al resultado. Por
ejemplo, si el destino está cerca del origen, el algoritmo podría seguir explorando nodos
lejanos antes de llegar a la solución.
Aunque la lógica de Dijkstra es sencilla, su implementación eficiente puede ser
compleja. Usar estructuras avanzadas como montículos binarios o Fibonacci para
optimizar el rendimiento requiere habilidades técnicas más avanzadas. Una
implementación básica, aunque más fácil de entender, puede ser muy lenta y poco
práctica para problemas grandes o aplicaciones en tiempo real. Esto limita su uso en
contextos donde la velocidad y la simplicidad son esenciales (Byte, 2024)
4.2. Algoritmo de Búsqueda Informada
Estos algoritmos utilizan información adicional sobre el problema para guiar la
búsqueda hacia la solución. Esta información extra les permite tomar decisiones más
inteligentes sobre qué camino explorar, reduciendo el espacio de búsqueda y
aumentando la eficiencia.
Los métodos de búsqueda heurísticos mejoran la eficiencia de los métodos de búsqueda
no informados al agregar información extra, pero siguen garantizando que la búsqueda
sea completa y óptima. Para hacer esto, usan una función heurística llamada h*, que
para cada nodo en el espacio de estados estima el coste de llegar al objetivo. Es decir,
para un nodo n, h(n) es el coste real para llegar al objetivo, mientras que h*(n) es el
coste estimado. Una forma de guiar la búsqueda es expandiendo primero el nodo con el
valor más bajo de h*(n), lo que significa que se elige el nodo que parece estar más cerca
del objetivo. Sin embargo, esto solo nos hace priorizar nodos que aparentan estar más
cerca del objetivo, sin considerar cuánto cuesta realmente llegar a ellos, lo que podría
poner en riesgo la completitud y la optimalidad de la búsqueda. En otras palabras, al
enfocarnos solo en nodos que parecen más prometedores, podríamos perder la garantía
de encontrar la mejor solución posible o incluso de encontrar una solución en absoluto
(Billhardt et al., 2015, p. 15).
4.2.1. Algoritmo A estrella
4.2.1.1 Historia
El algoritmo A*, desarrollado en 1968 por Peter E. Hart, Nils J. Nilsson y Bertram
Raphael, es una herramienta de gran utilidad para la toma de decisiones. Su propósito
principal es identificar el camino más económico entre dos puntos en un grafo, siempre
que se cumplan ciertas condiciones específicas. Este enfoque permite resolver
problemas de rutas más cortas en áreas delimitadas de manera eficiente y precisa.
Inspirados por el trabajo previo de Dijkstra, que había revolucionado la búsqueda de
caminos más cortos, los investigadores identificaron una oportunidad para optimizar
aún más el proceso al incorporar estrategias de búsqueda informadas.
En su diseño, A* fusiona la búsqueda avara y la búsqueda de costo uniforme, dos
enfoques que por sí solos presentaban limitaciones. Mientras que la búsqueda avara
priorizaba caminos que parecían prometedores pero no garantizaban soluciones óptimas,
la búsqueda de costo uniforme aseguraba la óptima solución a expensas de una mayor
complejidad computacional. El algoritmo A* superó estas limitaciones combinando lo
mejor de ambos enfoques mediante la introducción de una función heurística.
En el contexto de la inteligencia artificial, este avance marcó un hito al proporcionar
una herramienta que no solo era eficiente, sino también adaptable a diferentes
escenarios. Desde entonces, el algoritmo ha sido adoptado en campos diversos, como la
robótica, el diseño de videojuegos y la optimización de redes de transporte. Su impacto
no se limita a la informática, sino que también se extiende a la administración, donde se
utiliza para resolver problemas complejos de planificación y asignación de recursos.
4.2.1.2. ¿Qué es?
El algoritmo A* es, en esencia, un método de búsqueda que permite identificar el
camino más eficiente entre un punto inicial y un punto final en un grafo. Su enfoque se
basa en evaluar de manera simultánea el costo acumulado de llegar a un nodo y el costo
estimado de alcanzar el objetivo desde ese nodo, hablamos de entender la relación entre
un punto inicial y uno final en términos de eficiencia y costos, buscando el “camino”
que mejor nos ayude a alcanzar el objetivo que tenemos. Esta dualidad de costo de
llegar a un nodo y el costo estimado de alcanzar el objetivo desde ese nodo, lo distingue
de otros algoritmos y lo hace particularmente eficiente en problemas donde el costo y la
dirección son factores cruciales.
En la planificación de rutas, para definir la ruta más corta está y la generación del menor
coste posible, el algoritmo A estrella es una herramienta adecuada debido a su
eficiencia.
El algoritmo A* se basa en los principios del algoritmo de Dijkstra, conocido por
encontrar las rutas más cortas en un grafo. Sin embargo, mejora este enfoque al
incorporar elementos de búsqueda informada; esto significa que utiliza información
adicional para tomar decisiones más inteligentes sobre qué caminos explorar,
priorizando aquellos que parecen ser los más prometedores. Gracias a esta estrategia, el
algoritmo A* logra recorrer el grafo de manera más eficiente y optimizada.
En este tipo de problemas de algoritmo A*, comenzamos con un punto de partida
definido (estado inicial) y un objetivo claro al que queremos llegar (estado final o meta).
Para avanzar, seguimos un conjunto de reglas que nos permiten movernos a través de un
grafo, que está formado por nodos conectados entre sí; a medida que exploramos el
grafo analizamos e identificamos la secuencia de movimientos que nos lleva desde el
punto inicial hasta el objetivo, completando así la búsqueda de manera eficiente.
Ahora, el algoritmo A* surge de la combinación entre el método avaro y la búsqueda
por costo uniforme y la búsqueda por costo uniforme, aunque de manera individual
pueden presentar limitaciones en conjunto optimizan el manejo de búsqueda de rutas
cortas a través del algoritmo A*.
La búsqueda avara se centra en minimizar el costo estimado para alcanzar el
objetivo, representado por h(n). Este enfoque prioriza los caminos que parecen
más prometedores hacia la meta, lo que a menudo reduce el esfuerzo de
búsqueda. Sin embargo, tiene el inconveniente de no garantizar que encuentre
siempre la solución óptima ni explorar todas las posibles alternativas válidas, lo
que lo hace incompleto.
Por otro lado, la búsqueda por costo uniforme se encarga de minimizar el
costo real acumulado hasta un nodo intermedio, es decir, g(n). Este método
garantiza que siempre se encontrará la solución más corta y que se explorarán
todas las opciones necesarias, haciéndolo óptimo y completo. Sin embargo, su
desventaja es que puede volverse muy lento y consumir muchos recursos,
especialmente en grafos grandes.
El algoritmo A* aprovecha lo mejor de ambos enfoques al combinarlos en una
fórmula única:
f(n)=g(n)+h(n)
Aquí, g(n)representa el costo real desde el punto de partida hasta el nodo actual n,
mientras que h(n) es una estimación del costo restante hasta la meta. La suma de estas
dos funciones f(n), permite al algoritmo evaluar de manera equilibrada tanto los costos
reales como las estimaciones, logrando encontrar la solución más económica que pase
por el nodo n.
En otras palabras, si el objetivo es encontrar la solución más económica, tiene sentido
comenzar evaluando el nodo con el valor más bajo de f(n). Lo notable de esta estrategia
no es solo su lógica, sino que también se puede demostrar que es tanto completa como
óptima, siempre y cuando la función heurística (h) cumpla con una simple condición.
(Lopez, 2005).
La condición mencionada consiste en que, para que una función heurística sea admisible
sea aquella en la que el cálculo del costo estimado nunca sea mayor al costo real
necesario para llegar al objetivo. Esto significa que siempre ofrece una estimación
optimista, suponiendo que resolver el problema será menos costoso de lo que realmente
es. Gracias a este optimismo, cuando la heurística es admisible, la función total f(n), que
combina el costo acumulado g(n) y heurística h(n), tampoco superará el costo real de la
mejor solución que pase por un nodo n. Esto asegura que el algoritmo pueda encontrar
la solución más eficiente sin desviarse por caminos incorrectos. (Lopez, 2005)
Desde otro punto de vista conceptual podemos analizar que el algoritmo A* funciona de
la siguiente forma, organiza su funcionamiento utilizando dos grupos de nodos para
realizar la búsqueda de la mejor ruta. Estos grupos se llaman Disponibles y Analizados.
Disponibles (Lista abierta): Aquí se almacenan los nodos que aún no han sido
examinados, pero que son candidatos para formar parte de la ruta óptima.
Inicialmente, solo el nodo de inicio se encuentra en la lista abierta. A medida que
se avanza:
- Se selecciona el nodo con el menor valor de f(n).
- Sus nodos sucesores se añaden a la lista abierta, siempre que no estén ya
en la lista cerrada o si su costo es menor al registrado previamente.
Esta lista actúa como un "mapa de rutas pendientes", permitiendo que el
algoritmo evalúe múltiples caminos antes de tomar decisiones definitivas.
El proceso de búsqueda funciona de la siguiente manera: en cada iteración del
algoritmo, el nodo con el valor más bajo de la función f(n)=g(n)+h(n), ( donde
g(n) es el costo de llegar al nodo desde el origen, y h(n) es la estimación del
costo para llegar al destino desde el nodo actual) es seleccionado de la lista
abierta. Si ese nodo es el destino, el algoritmo termina. Si no, el nodo es
expandido, y sus nodos sucesores (vecinos) se añaden a la lista abierta, siempre
y cuando no estén en la lista cerrada ni se haya explorado previamente.
El objetivo de la lista abierta es gestionar de manera eficiente los nodos que aún
podrían formar parte del camino óptimo, asegurando que la búsqueda se realice
en la dirección más prometedora.
Analizados (Lista cerrada): La lista cerrada almacena nodos que ya han sido
evaluados completamente y se consideran parte del camino seleccionado o se
han descartado por completo. Este almacenamiento evita que el algoritmo
reevalúe nodos ya procesados, reduciendo el tiempo de cálculo y previniendo
ciclos.
El equilibrio entre estas dos listas es crucial. Mientras que la lista abierta asegura
la exploración de nuevos caminos, la lista cerrada consolida las decisiones
tomadas, optimizando el proceso de búsqueda
El proceso comienza colocando únicamente el nodo inicial en el grupo de
“Disponibles”, mientras que el grupo de “Analizados” está vacío. A medida que el
algoritmo avanza, los nodos de “Disponibles” se revisan uno por uno, y aquellos que
cumplen con los criterios se transfieren al grupo de “Analizados”. Este método asegura
que el algoritmo evalúe de manera organizada todas las opciones disponibles para
encontrar la mejor ruta. Para cada nodo n se definen los siguientes valores:
g (n): Representa el costo acumulado desde el nodo inicial hasta el nodo n. Este valor es
calculado sumando los costos de las aristas ya recorridas
h (n): Es una estimación del costo restante para llegar al nodo meta desde n. Se calcula
mediante una función heurística.
F (n) = g (n) + h (n): Este es un estimado del costo de la solución que pasa por el nodo
n.
Dentro de este análisis el algoritmo A* se prioriza la exploración de nodos con menor
valor de f(n), asegurando así un avance eficiente hacia la solución. Este enfoque evita la
exploración innecesaria de nodos que no contribuyen a alcanzar el objetivo. Por lo
tanto, aunque el algoritmo A* tienen un enfoque similar (amos se centran en identificar
los nodos con el menor costo para llegar al destino); a diferencia del algoritmo Dijkstra
que explora todos los posibles caminos en todas las direcciones, A* se enfoca más en la
dirección del objetivo. (Rodriguez, 2005)
En el uso de este tipo de algoritmo se puede identificar a través del número de nodos
que se visitan durante la búsqueda del camino más cortos, el tamaño del espacio que se
está explorando. Si un algoritmo de búsqueda de la ruta más corta explora menos nodos
para encontrar la solución, significa que es más eficiente en términos de velocidad de
procesamiento. Esto se debe a que, al reducir la cantidad de nodos examinados, el
algoritmo puede llegar más rápidamente a la respuesta y esto se relaciona con la ruta
más corta encontrada, la cual a su vez se puede traducir en menores costos y rapidez.
4.2.1.3. Función heurística
La función heurística h(n) es un componente fundamental en el algoritmo A*.
Representa una estimación del costo necesario para llegar desde un nodo intermedio (n)
hasta el objetivo. En esencia, actúa como una guía que dirige el proceso de búsqueda,
permitiendo al algoritmo concentrarse en rutas que son más prometedoras y evitar
exploraciones innecesarias.
Para calcular el valor de la función de evaluación, es necesario determinar dos
componentes: las funciones g y h. El valor de la función g se puede calcular de manera
exacta, ya que representa el costo real de llegar a un nodo desde el punto de inicio. En
cambio, el valor de la función h es una estimación, ya que no se conoce el costo exacto
para llegar al objetivo desde ese nodo. Debido a que h es solo una aproximación, se le
conoce como una "función heurística de costo" (Pariona, 2023).
El diseño de la heurística afecta significativamente el desempeño del algoritmo. Una
heurística bien diseñada puede reducir drásticamente el número de nodos evaluados,
optimizando tanto el tiempo como los recursos computacionales requeridos. Por otro
lado, una heurística mal definida puede resultar en un comportamiento ineficiente,
alargando el tiempo de ejecución o incluso desviando el algoritmo de encontrar la
solución óptima.
Propiedades clave.
- Admisibilidad: Una heurística es admisible si nunca sobreestima el
costo real para llegar al objetivo. Esto garantiza que el algoritmo A* sea
óptimo, es decir, que siempre encuentre la solución más corta posible.
Por ejemplo, en un grafo que representa distancias entre ciudades, una
heurística admisible podría ser la distancia en línea recta entre dos
puntos. Aunque esta distancia no refleja los caminos reales, siempre será
menor o igual al costo real.
- Consistencia: Una heurística es consistente si satisface la desigualdad
triangular, es decir, el costo estimado desde un nodo hasta el objetivo
nunca es mayor que el costo estimado de ir primero a un nodo vecino
más el costo real entre esos dos nodos.
Matemáticamente, si n es un nodo y m su vecino, entonces:
h(n) ≤c(n,m)+h(m)
Donde c(n,m) es el costo real de moverse de n a m.
Esta propiedad asegura que el valor de f(n) nunca disminuya al pasar de
un nodo al siguiente, facilitando una evaluación más directa.
Importancia:
La selección de la función heurística es crucial para el desempeño del algoritmo.
Una heurística demasiado optimista (subestima demasiado los costos) puede
llevar a una exploración más extensa, mientras que una que no sea admisible o
consistente podría llevar al algoritmo a fallar en encontrar la solución óptima. En
escenarios prácticos, el diseño de heurísticas requiere un balance entre precisión
y simplicidad computacional.
Por ejemplo, en un sistema de navegación GPS, una heurística basada en la
distancia euclidiana puede ser efectiva en áreas rurales, pero en entornos
urbanos, podría ser más útil una heurística que también considere restricciones
de tráfico y direcciones permitidas. Por ejemplo:
- Distancia Euclidiana: Es la distancia más corta entre dos puntos, como
si dibujaras una línea recta entre ellos. Se usa cuando los movimientos
pueden ir en cualquier dirección, como medir la distancia entre dos
puntos en un mapa sin restricciones.
- Distancia Manhattan: Es la distancia que recorrerías si solo pudieras
moverte en línea recta hacia los lados o hacia arriba y abajo, como si
estuvieras caminando por las calles de una ciudad con calles en forma de
cuadrícula. Solo puedes ir de un lado a otro o de arriba a abajo, nunca en
diagonal.
La elección de una heurística adecuada puede marcar una gran diferencia en el
rendimiento del algoritmo, reduciendo significativamente el número de nodos
explorados.
4.2.1.4. Aplicaciones del algoritmo A*
Sistemas de navegación GPS: en los sistemas de navegación, como Google Maps, el
algoritmo A* se utiliza para encontrar el camino más rápido y corto entre dos puntos.
Para hacer esto, A* toma en cuenta factores como la distancia entre los lugares, el
tiempo de viaje y las condiciones del tráfico. Esto permite que el GPS te dé la mejor
ruta posible en tiempo real, ayudando a llegar a tu destino de manera más rápida y
eficiente.
Videojuegos: en los videojuegos, A* se usa para que los personajes no jugables
(NPCs), como los enemigos o aliados controlados por la computadora, puedan moverse
de manera inteligente por el mapa. Por ejemplo, si un enemigo necesita encontrar un
camino para alcanzar al jugador o evitar obstáculos, A* le permite calcular el mejor
recorrido para llegar a su objetivo de forma eficiente, sin perder tiempo en caminos
innecesarios.
Robótica: A* también se aplica en robots autónomos, como los que se usan en fábricas
o en vehículos autónomos (como los autos sin conductor). El algoritmo permite que el
robot se desplace por su entorno de manera eficiente, evitando obstáculos y encontrando
la mejor ruta hacia su destino. Por ejemplo, en una fábrica, un robot podría usar A* para
transportar materiales de un lugar a otro evitando paredes y otras máquinas.
Logística: en el ámbito logístico, A* se utiliza para optimizar las rutas de entrega de
productos. Por ejemplo, en empresas de transporte o distribución, el algoritmo ayuda a
calcular la ruta más rápida y económica para que los camiones entreguen mercancías.
Esto reduce los costos de combustible y el tiempo de entrega, mejorando la eficiencia en
el proceso de distribución y asegurando que los productos lleguen a su destino de la
manera más eficiente posible.
4.2.1.5. Ejemplo del algoritmo A*
Para la resolución de un ejercicio A* debemos de tener en cuenta lo siguiente cómo
resumen: el algoritmo A* es un algoritmo informado, ya que además de los costos
asociados a los ejes o aristas, utiliza heurísticas para estimar el costo de un nodo hacia el
destino. De esta forma, es posible incorporar información adicional basada en
experiencia previa. Por ejemplo, si queremos llegar de una ciudad a otra por carretera,
información como si se llevan a cabo trabajos de reparaciones en la carretera puede ser
de mucha utilidad. Las heurísticas deben ser Admisibles, lo que significa que no deben
exceder el valor real para llegar al destino. Cumpliendo con heurísticas admisibles, el
A* siempre devuelve la ruta óptima.
Ejercicio tomado de YouTube de (Cantoral, 2022).
- En este caso la función heurística se ve reflejada por una estimación previa por
experiencia o por información captada previamente, el valor de la heurística se
encuentra en cada vértice del grafo.
- Usaremos la fórmula A*: f(n)=g(n)+h(n)
- h(n) sólo será admisible si es menor al costo real o en el mejor de los casos
igual, entre más cercano el valor más rápido será resuelto el ejercicio.
-
Figura X
Grafo del problema
Nota. El gráfico es de elaboración propia, con el uso de la fuente (Cantoral, 2022).
En el gráfico podemos observar los valores heurísticos, es decirlos costos estimados, se
encuentra en cada intersección. Ejemplo: para llegar al nodo A se cree que costará 8.
Iniciamos con S cuyo valor heurístico es de 5, es decir cree que le costará 5
llegar al destino X.
Figura 1
Solución, parte 1
Nota. El gráfico es de elaboración propia, con el uso de la fuente (Cantoral, 2022).
Elaboramos la lista de Visitados: en este caso S5 pues se inicia con este.
Iniciamos el cálculo con los nodos con acceso directo de S5. Teniendo en cuenta
el costo del movimiento y sus valores autísticos.
Aplicamos f(n)=g(n)+h(n). y tenemos: SA13, SB14, SC9 Y SD2.
Observamos que el menor costo es el de D y C.
Iniciamos con D por ser el menor.
Figura X
Solución, parte 2
Nota. El gráfico es de elaboración propia, con el uso de la fuente (Cantoral, 2022).
Elaboramos la lista de Visitados: S5, D8.
Igualmente identificamos los nodos directos que en este caso serían C, E y F si
bien es cierto se podría considerar S devuelta no sería factible ya que
volveríamos con un costo más alto.
Aplicamos f(n)=g(n)+h(n). y tenemos: SDC11, SDE9, SDF13.
Figura X
Solución, parte 3
Nota. El gráfico es de elaboración propia, con el uso de la fuente (Cantoral, 2022).
Elaboramos la lista de Visitados: S5, D8 y C9.
Una vez terminado continuamos con el segundo menor qué en este caso sería C.
Igualmente identificamos los nodos directos que en este caso serían B, F y I si
bien es cierto se podría considerar S devuelta no sería factible ya que
volveríamos con un costo más alto.
Aplicamos f(n)=g(n)+h(n) y tenemos: SCB11, SCF18, SCI13.
Observamos que los menores valores obtenido a partir de C y D es SDE9 y
SCB11.
A simple vista podríamos analizar que la mejor opción para llegar al final es
SDE9. Pero esto tiene que ser verificado analizando la segunda mejor alternativa.
Figura 2
Solución parte 4
Nota. El gráfico es de elaboración propia, con el uso de la fuente (Cantoral, 2022).
Visitados: S5, D8, C5. .
Aplicamos f(n)=g(n)+h(n). y tenemos: SCBA18. Y SCBX14..
Observamos que tomando la ruta SCBX14. Llegamos al final con un costo de 14,
ahora debemos evaluar el otro camino factible para verificar cuál de los dos es el
correcto.
Figura 3
Solución, parte 5
Nota. El gráfico es de elaboración propia, con el uso de la fuente (Cantoral, 2022).
Visitados: S5, D8, C5, E8. Y B5.
Aplicamos f(n)=g(n)+h(n). y tenemos: SDEX11.
Observamos que tomando la ruta SDEX11 llegamos al final con un costo de 11,
el cuál es menor a la anterior opción.
Por lo tanto, el camino óptimo que genera menor costo es el de la ruta SDEX11 .
4.1.1.5. Ventajas
a) Garantía de optimalidad: siempre que se utilice una heurística admisible, el
algoritmo A* encontrará la solución óptima. Esto lo hace ideal para problemas
en los que la precisión es crítica, como la planificación logística o la navegación
autónoma.
b) Eficiencia en la búsqueda: al combinar g(n) y h(n), A* reduce
significativamente el espacio de búsqueda comparado con algoritmos no
informados como el de Dijkstra. Esto es especialmente importante en grafos
grandes.
c) Flexibilidad: el algoritmo puede adaptarse a diferentes problemas mediante la
modificación de la heurística, haciéndolo aplicable en una variedad de dominios,
desde videojuegos hasta sistemas de transporte.
d) Compatibilidad con heurísticas complejas: A* permite incorporar heurísticas
específicas del dominio, lo que puede mejorar su rendimiento sin comprometer
la exactitud de los resultados.
e) Capacidad para escenarios dinámicos: en sistemas donde los costos pueden
cambiar (como en redes de tráfico en tiempo real), A* puede ajustarse para
recalcular rutas óptimas de manera eficiente.
4.1.1.6. Limitaciones
a) Garantía de optimalidad: siempre que se utilice una heurística admisible, el
algoritmo A* encontrará la solución óptima. Esto lo hace ideal para problemas
en los que la precisión es crítica, como la planificación logística o la navegación
autónoma.
b) Eficiencia en la búsqueda: al combinar g(n) y h(n), A* reduce
significativamente el espacio de búsqueda comparado con algoritmos no
informados como el de Dijkstra. Esto es especialmente importante en grafos
grandes.
c) Flexibilidad: el algoritmo puede adaptarse a diferentes problemas mediante la
modificación de la heurística, haciéndolo aplicable en una variedad de dominios,
desde videojuegos hasta sistemas de transporte.
d) Compatibilidad con heurísticas complejas: A* permite incorporar heurísticas
específicas del dominio, lo que puede mejorar su rendimiento sin comprometer
la exactitud de los resultados.
e) Capacidad para escenarios dinámicos: en sistemas donde los costos pueden
cambiar (como en redes de tráfico en tiempo real), A* puede ajustarse para
recalcular rutas óptimas de manera eficiente.
CAPITULO IV
5. Modelos Matemáticos para la Optimización de Rutas
5.1. Formulación de programación lineal del problema de la ruta más corta
5.2. El Problema del Viajante de Comercio (TSP)
Descripción del problema y su relación con la optimización de rutas más cortas.
Importancia del TSP en aplicaciones logísticas y de transporte.
5.3. El Problema de Flujo Máximo
Explicación del flujo máximo en redes y su relación con la optimización de
rutas.
Aplicaciones del problema de flujo máximo en redes de distribución y sistemas
de comunicación.
4. Conclusiones
5. Referencias Bibliograficas
Alonso, J. (2008). Flujo en Redes y Gestion de proyectos. Netbiblo. Obtenido de
https://www.google.com.pe/books/edition/Flujo_en_Redes_y_Gesti
%C3%B3n_de_Proyectos_T/UQpy6PGbo9MC?hl=es&gbpv=0
Arellano, V. (2022). Analisis de Algoritmos de Busqueda Informada y no Informada.
Obtenido de
file:///C:/Users/ASUS/Downloads/Anlisis_de_algoritmos_de_bsqueda_informad
a_y_no_informada.pdf
Bibie, & Lewis. (1994). Extracting curvilinear Features from Remotely Sensed Images
Using Minimum Cost Path Techniques. Universidad de Leeds. Obtenido de
http://www.mmrg.ecs.soton.ac. uk/publications/archive/dobie1994/html/
Billhardt, H., Gil, A. F., & Ossowski, S. (2015). Inteligencia artificial. Editorial
Universitaria Ramón Areces. Obtenido de
https://www.google.com.pe/books/edition/Inteligencia_artificial/BXunDAAAQ
BAJ?hl=es&gbpv=0
Byte, L. (24 de Octubre de 2024). El Algoritmo de Dijkstra: Qué es, Cómo Funciona y
Dónde se utiliza. Obtenido de Codigo Nautas:
https://codigonautas.com/algoritmo-dijkstra-que-es-ejemplo/
Cantoral, P. (3 de Diciembre de 2022). Youtube. Obtenido de A* search | Búsqueda A
star: https://www.youtube.com/watch?v=yxN6yR_7yJM
Discretas, M. (28 de 11 de 2017). Blogspot. Obtenido de https://conjuntos-y-
relaciones.blogspot.com/2017/11/51-elementos-caracteristicas-y_20.html
Everywhere, G. (8 de 10 de 2020). Graph Everywhere. Obtenido de
https://www.grapheverywhere.com/tipos-de-grafos/
Gil, P., Pomares, J., & Candelas, F. (13 de marzo de 2010). Redes y transmision de
datos. Universidad de Alicante. Obtenido de
https://www.google.com.pe/books/edition/Redes_y_transmisi
%C3%B3n_de_datos/On6y2SEaWyMC?hl=es&gbpv=0
Lopez, B. (17 de Octubre de 2005). Instituto Técnológico de Nuevo Laredo. Obtenido
de Ingeniería en sistemas computacionales:
https://nlaredo.tecnm.mx/takeyas/Apuntes/Inteligencia%20Artificial/Apuntes/
tareas_alumnos/A-Star/A-Star(2005-II-B).pdf
Meza, O., & Ortega, M. (1993). Grafos y algoritmos (2da ed.). Equinoccio. Obtenido de
https://www.google.com.pe/books/edition/Grafos_Y_Algoritmos/bETqIvP2Uuw
C?hl=es&gbpv=0
Obregón, B. (2005). Universidad Nacional Autónoma de México. Obtenido de Teoría de
redes: el problema de la ruta más corta:
http://www.ptolomeo.unam.mx:8080/xmlui/bitstream/handle/132.248.52.100/53
9/obregonquintana.pdf?seque
Pariona, W. (Septiembre de 2023). Universidad de Lima . Obtenido de Implementación
de un sistema de búsqueda de rutas de evacuación eficiente ante la presencia de
sismos en un centro comercial usando el algorido D estrella.:
https://repositorio.ulima.edu.pe/bitstream/handle/20.500.12724/19748/
T018_72477723_T.pdf?sequence=1&isAllowed=y
Patterson, L. (2000). Using the IBM XML. Obtenido de https://www.ibm.com/mx-es
Piña, V. (s.f). Universidad Nacional Autónoma de México. Obtenido de Algoritmo de
Floyd (Floyd-Warshall):
https://www.academia.edu/38918580/Algoritmo_de_Floyd_Floyd_Warshall
Porto, J. P., & Merino, M. (29 de 03 de 2023). Definición.de. Obtenido de
https://definicion.de/grafos/
QUINTANA, B. O. (2005). TEORÍA DE REDES: EL PROBLEMA DE LA RUTA MÁS
CORTA [tesis para titulo de maestria, Universidad Nacional Autónoma de
México]. Repositorio institucional. Obtenido de
http://www.ptolomeo.unam.mx:8080/xmlui/bitstream/handle/132.248.52.100/53
9/obregonquintana.pdf?seque
RAE. (2023). Real Académia Española. Recuperado el 7 de Diciembre de 2024, de
Diccionario RAE: https://dle.rae.es/ruta
Richards, H. (30 de marzo de 2021). Archivo E. W. Dijkstra. Obtenido de EWD:
https://www.cs.utexas.edu/~EWD/
Rocha, J., Gómez, C., & Sánchez, P. (20 de Dicimebre de 2013). Ruta más corta:
soluciones algorítmicas para movilidad eficiente en la malla vial de
Cundinamarca. Programación dinámica. Recuperado el 7 de Diciembre de
2024, de Academia.edu: https://www.academia.edu/120604122/Ruta_m
%C3%A1s_corta_soluciones_algor
%C3%ADtmicas_para_movilidad_eficiente_en_la_malla_vial_de_Cundinamarc
a_Programaci%C3%B3n_din%C3%A1mica
Rodriguez. (13 de marzo de 2023). Algoritmo Dijkstra. Obtenido de upv:
https://arodrigu.webs.upv.es/grafos/doku.php?id=algoritmo_dijkstra
Rodriguez, L. (Junio de 2005). Universidad De Los Andes. Obtenido de Algoritmo para
calcular la ruta más corta en la malla vial de la ciudad de bogotá.:
https://repositorio.uniandes.edu.co/server/api/core/bitstreams/7a9e2cbc-ac42-
4812-8fc9-ac4f872b1527/content
Soria Avendaño, H. S., Collado Salas, J. J., Churano Romero, P. A., Galvez Chaico, Y.
L., & Solano Quispe, R. M. (2021). Universidad Tecnólica De Los Andes.
Obtenido de Algoritmo de Floyd - Warshall:
https://www.studocu.com/pe/document/universidad-tecnologica-de-los-andes/
sistemas-operativos-para-dispositivos-moviles/trabajo-monografico-algoritmo-
de-floyd-warshall/44887739
Steven, S. (2001). Shortest Path. State University of New York. Obtenido de
http://www. cs.sunysb.edu/~algorith/files/shortestpath.shtml
Trick, M. (1998). Shortest path. Carnegie Mellon University. Obtenido de http://mat.
gsia.cmu.edu/classes/networks/node4.html
Yungán, J., Salazar, E., & Villacrés, J. (2022). Algoritmo de Bellman Ford para
solucionar el problema de la ruta más corta. (P. d. conocimiento, Ed.) Polo del
conocimiento, 7(7), 1289-1291. Recuperado el 7 de Diciembre de 2024, de
https://dialnet.unirioja.es/descarga/articulo/9042926.pdf