7 votos

¿Hace Dijkstra ' obra algoritmo cuando multiplican los pesos de los nodos sucesivos?

El ejemplo concreto es:

Me da n pares de divisas y tipos de cambio, y tengo que cambiar de decir de dólares por euros. Y no tengo que cambiar el dinero directamente, por ejemplo, yo podría cambiar de dólares a libras esterlinas primero y, a continuación, en euros y ganar más dinero de lo que me hubiera por intercambio directo. Así que mi primera idea era dibujar el grafo completo con tipos de cambio como los pesos de las aristas y el uso de Dijkstra el algoritmo con un pequeño cambio, me multiplicar el peso, no suma. En realidad parece ser lógico: si voy por un camino y cada vez hacer multiplicaciones puedo obtener el número de unidades (en la moneda que corresponde al nodo he llegado a) me habría después de estos intercambios. Y en cada iteración de Dijkstra el algoritmo de si veo que la forma en que me cambio el dinero en este paso es mejor que la anterior para este nodo (si se visita), entonces puedo cambiar el valor. Así que cuando termino un árbol que puede fácilmente encontrar una ruta más corta entre los nodos, es decir, la forma óptima para el intercambio de dinero de una moneda a otra. Hay algo en lo que contradice esta idea?

Gracias de antemano, Saludos

5voto

theog Puntos 585

Como @dtldarek ha respondido en los comentarios, su enfoque propuesto es exactamente la misma que la de hacer el tradicional de Dijkstra el algoritmo de los logaritmos de los tipos de cambio. Sin embargo, el de Dijkstra el algoritmo requiere que todos borde de pesos para ser no negativo, que sólo será posible si todos sus tipos de cambio son, al menos, $1$ (poco probable), por lo que este enfoque no puede ser garantizado para trabajar. Por otro lado, la Bellman-Ford algoritmo encuentra los caminos más cortos en la presencia de peso negativo de los bordes. Así, se debería etiquetar sus bordes con los logaritmos de los tipos de cambio y, a continuación, realizar la Bellman-Ford algoritmo.

0voto

Born2Smile Puntos 316

Porque originalmente no tienen pesos negativos, puede hacer lo siguiente: puntaje = -log(1 - calificación/max(puntuación)), entonces el uso de Dijkstra como de costumbre. puntuación/max_score está en [0,1], y queremos multiplicativo de pesos, por lo que utiliza el registro para obtener el mismo efecto a través de la adición (ya que log(x1*x2*...*xN) = log(x1) + ... + log(xN)). Pero ya que sus calificaciones están ahora en [0,1], la negativa del registro garantiza que las puntuaciones nunca será negativo, pero desafortunadamente se ha invertido el problema y ahora se encuentra a la más larga multiplicativo camino. Restando puntuación/max_score de 1 revierte de nuevo, asegurándose de que se encuentra el multiplicativo de la ruta más corta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X