Noticias de ciencia y lo que la rodea
180 meneos
2265 clics
Ruta más corta en grafos: algoritmo supera a Dijkstra tras 65 años

Ruta más corta en grafos: algoritmo supera a Dijkstra tras 65 años

Este problema, conocido como el problema de la ruta más corta u óptima, ha perseguido a la humanidad desde hace siglos. Por ejemplo, en el siglo III a.C. Euclides demostró que una línea recta era siempre más corta que cualquier camino quebrado. O en el siglo XI, astrónomos islámicos resolvían cálculos de geometría esférica para encontrar la qibla, la dirección más corta hacia La Meca desde cualquier punto del planeta.

| etiquetas: grafos , ruta , matemáticas
102 78 0 K 246
102 78 0 K 246
Muy interesante. Lo leeré mañana con tranquilidad. La mayor utilidad que le he dado a Dijkstra es en los advent of code

Esto: O(m + n log n) equivale a esto O(nlogn) ya que siempre se coje el limite superior y se obvia el resto.

En wolfram alpha podeis ver la representación y como crece

www.wolframalpha.com/input?i=plot+n*log^(2/3)n,+plot+n*logn

Así se ve fácilmente que crece ligeramente más lento  media
#1


> Esto: O(m + n log n) equivale a esto O(nlogn) ya que siempre se coje el limite superior y se obvia el resto.

No, me temo que te equivocaste pensando que "m" es una constante, como si fuese independiente de n... Pero NO.
El "m" es el número de aristas y si aumentas "n" debes aumentar "m", al menos en el contexto de Dijkstra que se trata de rutas y encaminamiento.

Si tienes "n" vértices, y si ningún vértice está desconectado,…   » ver todo el comentario
#10 tienes razón. Hablé sin haber hecho el análisis de la complejidad ciclomatica.y pensé que era una constante.

Se puede explicar mejor así:
O(m + n log n) = O(m) + O(nlogn)

El número maximo de vértices que puede tener un nodo m en un grafo completo es: (n-1)×n = O(n^2)

En un grafo muy denso m podría darse
O(n^2) + O(nlogn). de nuevo cogiendo el limite superior sería una complejidad de O(n^2)

Entonces el nuevo algoritmo mejora a diskjtra tanto en el mejor como en el peor caso lo cual es decir muchisimo.

Se puede elegir una implementación u otra dependiendo del tamaño del grafo. De igual forma que leer un array es más rápido para buscar elementos que una tabla hash cuando el número de elementos es pequeño.
#11 de hecho se ve en la gráfica, a partir de n=3 ya crece mas lento. Por lo que podría usarse de forma general
#11

> Entonces el nuevo algoritmo mejora a diskjtra tanto en el mejor como en el peor caso lo cual es decir muchisimo.

Dijkstra
[Nota: tiene ijk , que son letras consecutivas en el abecedario, y que, además, son letras usadas como índices en sumatorios y algoritmos de programación... For i = 1... For j = ... For k = ...]

Y... NO, en el caso peor el nuevo algoritmo propuesto EMPEORA, no mejora al de Dijsktra, cuando n tiende a infinito.
El caso peor es m ~ n^2

O( n^2 • log^(2/3) n )
es peor que
O (n^2 + n log n) ~ O(n^2)
#1 Yo también lo de dejaré para mañana.
En el tipo de trabajo que hacía nunca tuve que resolver ese tipo de problemas, lo recuerdo de la universidad y veía complicado mejorarlo pero nunca puedes descartar el ingenio de algunas personas.
#1 en serio...?
Dijkstra, supone la creación de un árbol ordenado, partiendo del nodo de origen y todos los posibles destinos que aparecen en el grafo.

Emplee Dijkstra Un ciudadano 'resuelve' la ecuación de la movilidad de Zaragoza: "¿Por qué tenemos siempre que delegar en los políticos?" y Zaragoza. Regalo 20 líneas de tranvía y 4.000 millones de razones
#2 te refieres a un B tree?
en.m.wikipedia.org/wiki/B-tree

Diskjtra es para grafos que es un tipo más general que los árboles ya que se permiten ciclos. Los nodos de un grafo no tienen un orden inherente, aunque los puedas recorrer en un orden concreto DFS por ejemplo.
#3 Me refiero a que cuando haces Diskjtra, tomas el nodo de origen y vas construyendo un árbol, insertando cada uno de los nodos que aún no has añadido. y al hacer las insercciones de cada nuevo nodo queda ordenado según las distancias acumuladas. Ahora es muy tarde, pero recuerdo que cuando estuve haciendo ese desarrollo, es la imagen mental que me quedó y si lo haces sobre papel, es cómo te digo.
#3 creo que se refiere a que el resultado de ejecutar dijkstra es un árbol con el camino mínimo desde el nodo origen a todos los demás. Suponiendo un grafo conexo.
Pues a ver si le ponen un nombre más sencillo de pronunciar. :-P
#8 toda la razón mcfgdbbn3
#8 Díselo a sus padres
#8 “daikstra”

Problema resuelto. Ahora podemos centrarnos en arreglar tu nick {0x1f608}
Como anéctoda, el tito Edsger se permitió en su día enviar a tomar Fanta a la mismísima IBM:

blog.smaldone.com.ar/2006/08/01/estimado-sr-x-de-la-empresa-y
#14 de naranja o limón?
Desde mi nula educación formal en estos temas y mi condición de aficionadillo me asaltan varias cuestiones:
¿No es "arista" un término un tanto confuso para lo que sería una "línea de conexión", o simplemente, un "conector"? Para mí (y la RAE) una arista es la línea de intersección entre dos planos. Que yo sepa, no hay planos en un grafo.
El artículo afirma sobre Dijkstra: "el algoritmo termina cuando todos los vértices han sido visitados". Pero el algoritmo realmente termina cuando el nodo a extraer de la lista temporal ordenada es la meta (o la lista está vacía), o en otra palabras, cuando no existe un nodo más cercano al origen que la propia meta.
#15 Mmm según la RAE es correcto ya que es una linea

arista

f. Línea que resulta de la intersección de dos planos.

dle.rae.es/arista

La intersección de esos dos planos está definida por dos puntos, en este caso los nodos del grafo.
#23 Como ya me han dicho que se le llama arista por tradición, no tengo nada más que decir aunque no compute semánticamente.

De todas formas, aunque una arista sea siempre una línea no se puede deducir que una línea sea siempre una arista. Lo que en lógica formal se escribe: A→B ⇏ B→A
#15 es el lenguaje que se usa en teoría de grafos desde que se inventó y se habló de ello en español. Nodos (o vértices) y aristas.

El algoritmo no termina cuando el nodo a extraer es la meta porque entonces no habrías explorado todos los caminos (SSSP completo)
#18 Vale, ya entiendo que se trata de encontrar el camino menos costoso a todos y cada uno de los vértices. Disculpa mi torpeza.

De la wiki: El algoritmo de Dijkstra, también llamado algoritmo de caminos mínimos, es un algoritmo para la determinación del camino más corto, dado un vértice origen, hacia el resto de los vértices.
#15 olvídate de la RAE para términos técnicos
#19 Bueno, no es solo la RAE, es geometría.
#21 sí, pero esto no son conceptos geométricos sino de teoría de grafos, aunque usen la misma palabra por analogía

menéame