Algoritmo del camino mas Corto


Hola Saludos a todos los Integrantes:
Estaba tratando de hacer un programa para hallar el camino mas corto de un punto a otro punto pero tengo problemas no se como hacer para que me de la respuesta osea puedo hallar el valor del camino mas corto pero no se como hallar el camino osea porque nodos pasa si alguien puede ayudarme con ese algoritmo seria de mucha a yuda.
Otros temas de interes


Te digo lo que interpreto:
Si los datos son dos puntos de un plano, de coordenadas (X1,Y1) y (X2,Y2), el camino más corto es la recta que une a esos dos puntos: Y-Y1=m*(X-X1) de pendiente m=(Y2-Y1)/(X2-X1) y la distancia es la raíz cuadrada de (X2-X1)^2+(Y2-Y1)^2.
Si en el stack ingresas:
4: Valor de X1
3: Valor de Y1
2: Valor de X2
1: Valor de Y2
El siguiente programa te dará la distancia en el nivel 2 del stack y la ecuación de la recta en el nivel 1 del stack, mientras que los valores de las coordenadas de los puntos se moverán a los niveles 3,4,5 y 6 del stack.
<< 4 DUPN -> X1 Y1 X2 Y2 <<'raíz((X2-X1)^2+(Y2-Y1)^2)' EVAL 'Y-Y1=((Y2-Y1)/(X2-X1))*(X-X1)' EVAL >> >>
Donde puse raíz va el símbolo de la raíz cuadrada.
-> es el símbolo que se obtiene presionando Shift Derecho y cero.
Ejecutalo en modo aproximado.
-------------------------------------------------
Lo busqué en Google y creo no tiene absolutamente nada que ver mi respuesta con tu pregunta, dejo mi respuesta como un ejercicio de UserRPL mods si la quieren borrar no hay problema.


Saludos a Morifc y a todos los miembros del grupo,
Este tema está relacionado a varias áreas de la ingeniería como Civil, Industrial, Eléctrica, Telecomuncaciones, Transporte, etc.

Aquí he colocado páginas y links a videos que explican un poco lo interesante de este tema:
Links:
[La capa de red]
[Estudio de Redes]
[Viajante de comercio (II) - Backtracking]
Videos:
http://forogeometras.com/index.php?topic=620.msg2902
Y en hpcalc.org un programa que incluye el algoritmo de Dijkstra: [GraphWriter]
Atte. Dante Aroní C. www.deachp.com


Cuelga algún algoritmo para ver si podemos ayudarte a programarlo...
Esto no es materia que maneje, pero quizás viendo de que se trata podría ayudarte a desarrollar un algoritmo para la HP.-


Saludos compañeros:
Aqui les mando un ejemplo de un poblema y el uso del algoritmo hecho a mano es sencillo pero lo que yo quiero es que aparte de darme las iteraciones al final me de el camino,en el ejemplo el camino seria 1-2-3-5 y el valor del camino es 7896
Cualquier Duda me la hacen llegar
En este problema lo que se busca es la ruta mas corta del punto 1 al punto 5
Donde dij :Distancia desde el punto i ap punto j.(Datos del problema)
Donde mi:Ruta mas Corta al punto i(Lo halla en cada iteracion)
m1=0
m2=m1+d12=1700
m3=min {m1+d13, m2+d23}=min {3968,3580}=3580
m4=min {m1+d14, m2+d24, m3+d34}=min {7622, 6352, 5880}=5880
m5=min {m1+d15, m2+d25, m3+d35, m4+d45}=min {10970, 9196, 7896, 8600}=7896
Retrocediendo
Como m5=7896 viene de m3+d35 entonces nos vamos a m3
Como m3=3580 viene de m2+d23 entonces nos vamos a m2
Como m2=1700 viene de m1+d12 entonces nos vamos a m1
Por lo tanto el camino mas corto es 1-2-3-5


El método de camino crítico (CPM) es algo que se ve en Ingeniería Industrial y te dan ejercicios sencillos para hacer a mano.
Estaría bueno un programa para la HP que permita resolver estos problemas y otros de mayor complejidad. En HPCalc no hay nada al respecto, lo que más se acerca es lo posteado por Deachp.


En verdad lo que yo pienso hacer es crear y programa que tenga todos los algoritmos necesarios para Investigacion Operativa II:
Camino mas corto
Arbol de expansion Minima
Flujo Maximo
Proyectos CPM/PERT
Programacion Dinamica
Modelo de Colas
Y mas
que son los que mayormente se usan es esta materia
Por lo pronto tengo problemas con el primero Camino mas Corto ya estoy por terminar el segundo Arbol de......
agradeceria la ayuda
Gracias


Saludos a todos nuevamente,
Recuerdo haber hecho hace varios años atrás un programa muy similar relacionado con estos métodos, yo colocaba una lista de coordenadas rectangulares y buscaba la menor distancia recorrida entre dos puntos a través de los demás. En ese tiempo mi idea apuntaba al diseño de un juego del tipo laberinto (En ese tiempo sólo contaba con una 48GX algo lenta).
Acabo de desarrollar un pequeño programa que seguro ayudará, realmente no está basado en ningúno de los métodos descritos arriba, simplemente lo diseñé.

Se debe crear una lista de listas, en la cual cada sub-lista indica los puntos con los que se conecta cada punto, es decir, de la imagen anterior la lista de listas sería:
{ {2 3 4} {1 4} {1 4} {1 2 3} } La primera sub-lista indica que el punto 1 se conecta con los puntos {2 3 4} y así sucesivamente. Almacenar la lista de listas en la variable 'data'.
Luego se debe colocar en la pantalla los siguientes datos:
3: {1} @el punto inicial entre llaves.
2: 1 @el punto inicial.
1: 4 @el punto final.
y se ejecuta el programa 'Rutas'.
Los resultados obtenidos son todas las listas de rutas entre los puntos inicial y final:
3: {1 2 4}
2: {1 3 4}
1: {1 4}
Nota: Pueden cambiarse ó aumentar la base de datos, y también cambiar los puntos inicial y final por cualquier otro antes de ejecutar el programa 'Rutas'.
Entonces se puede crear un programa adicional que simplemente verifique cual de las sub-listas recorre la menor distancia.
El programa:
«
data 3 PICK GET
DUP SIZE
ant ini fin conex n
«
1 n FOR i
conex i GET
IF DUP fin ‹
THEN
IF ant SWAP POS NOT THEN
ant conex i GET + DUP 'ant' STO
conex i GET fin Rutas
ant 1 OVER SIZE 1 - SUB 'ant' STO
END
ELSE
ant SWAP +
END
NEXT
»
»
(Listo para copiar y pegar en el HPUserEdit ó Emulador para aplicarle STR->.)
Almacenar en la variable 'Rutas'.
Importante: El programa utiliza Recursividad.
Me pareció interesante este programa y lo colocaré como ejemplo en el nuevo manual de programación que estoy desarrollando y que pronto estará disponible.
También hubiera sido interesante colocarlo como propuesta para un [MiniCampeonato].
Atte. Dante Aroní C. www.deachp.com


sALUDOS AMIGOS ACA TENGO MI PROGRAMITA me pueden decir en que esta mal es que no encuentro el error me sale eror argumento pero no se porque voy a revisarlo pero si pueden darme una mano lo agradeceria.
CMC:
"Camino mas Corto"
{
{ "Arcos" "Usando el Editor de Matrices" }
}
{ 1 0 }
{ }
{ }
INFORM
IF
THEN
OBJ DROP
{0} 0 0 d m min n
« d SIZE OBJ DROP 'n' STO DROP
2 n FOR i
Ÿ 'min' STO
1 'i-1' EVAL FOR j
min
'm(j)+ d(j,i)' EVAL
MIN 'min' STO
NEXT
m min +
NEXT
m
»
END
»


Saludos a Morifc y a todos los miembros,
Morifc, aquí te envío el programa que enviaste ya modificado:
(Sólo necesitaba algunos ajustes)
« "Camino mas Corto"
{ { "Arcos" "Usando el Editor de Matrices" } }
{ 1 0 } { } { }
INFORM
IF THEN
OBJ DROP
{0} 0 0 d m min n
« d SIZE OBJ DROP 'n' STO DROP
2 n 1 + FOR i @hasta n+1.
Ÿ 'min' STO
1 'i-1' EVAL FOR j
min
'd(i,j)' EVAL @quité a 'm' e invertí i por j.
MIN 'min' STO
NEXT
m min + 'm' STO @salvé la variable 'm' modificada.
NEXT
m
» END »
Código listo para copiar y pegar en el HPUserEdit ó en el Emulador y aplicarle STR->.
Ingresas la matríz de datos:
[[ 0. 0. 0. 0. ]
[ 1700. 0. 0. 0. ]
[ 3968. 3580. 0. 0. ]
[ 7622. 6352. 5880. 0. ]
[ 10970. 9196. 7896. 8600. ]]
{ 0. 1700. 3580. 5880. 7896. }
Atte. Dante Aroní C.
www.deachp.com


Saludos a todos:
Gracias DEACHP por tu correcion sobre todo la tercera en dodne me olvide de guardar la nueva lista despues de concatenar.
Sin embargo la segunda correcion no es correcta el algoritmo completo es 'm(j)+d(j,i)' o en tu programa seria 'm(j)+d(i,j)' ya que has invertido la matriz.
Lo que pasa es que m(j ) simboliza el camino mas corto desde el punto 1 a el punto j por lo tanto tiene que sumarse a d(j,i) para hallar la distancia total es decir :
m(j ) = Distancia Minima desde el punto 1 hasta el punto j
d(j,i) =Distancia desde el punto j al punto i
El minimo de 'm(j)+d(j,i)'= Distancia minima desde el punto 1 hasta el punto i
Los datos del ejemplo que pusiste no eran los correctos,los datos son las distancias entre los diferentes puntos
d(1,2)=1700
d(1,3)=3968
d(1,4)=7622
d(1,5)=10970
d(2,3)=1880
d(2,4)=4652
d(2,5)=7496
d(3,4)=2300
d(3,5)=4316
d(4,5)=2720
En la matriz seria:
[[ 0. 1700. 3968. 7622. 10970.]
[ 0. 0. 1880. 4652. 7496.]
[ 0. 0. 0. 2300. 4316.]
[ 0. 0. 0. 0. 2720. ]]
metiendo esto en la matriz d el resultado es:
{ 0. 1700. 3580. 5880. 7896. }
Donde 7896 es el valor del camino mas corto desde 1 hasta el punto 5
Ahora ese problema ya esta solucionado pero aca la parte que necesito ayuda:
¿COMO SABER CUAL ES EL CAMINO ES DECIR POR QUE PUNTOS PASA PORQUE A SOLUCION COMPLETA ES:
Valor del Camino = 7896 (Listo)
Camino conformado por los puntos = 1 -2 -3 - 5 (Falta)
Asi se hace manualmente :
m1=0
m2=m1+d12=1700
m3=min {m1+d13, m2+d23}=min {3968,3580}=3580
m4=min {m1+d14, m2+d24, m3+d34}=min {7622, 6352, 5880}=5880
m5=min {m1+d15, m2+d25, m3+d35, m4+d45}=min {10970, 9196, 7896, 8600}=7896
Retrocediendo
m5
Como m5=7896 viene de m3+d35 entonces nos vamos a m3
Como m3=3580 viene de m2+d23 entonces nos vamos a m2
Como m2=1700 viene de m1+d12 entonces nos vamos a m1
Por lo tanto el camino mas corto es 1-2-3-5
Te dejo el codigo ya modificado para haber si me pueden ayudar a solucionar ese problema:
Gracias
«
"Camino mas Corto"
{
{ "Arcos" "Usando el Editor de Matrices" }
}
{ 1 0 }
{ }
{ }
INFORM
IF
THEN
OBJ DROP
{0} 0 0 d m min n
« d SIZE OBJ DROP 'n' STO DROP
2 n FOR i
Ÿ 'min' STO
1 'i-1' EVAL FOR j
min
'm(j)+ d(j,i)' EVAL
MIN 'min' STO
NEXT
m min + 'm' STO
NEXT
m
»
END
»


Saludos a a Morifc y a todos,
Morifc, la primera parte de tu programa no está terminada ya que no devuelve la que realmente debe ser la lista resultante.
La lista que devuelve tu programa es: { 0 1700 3580 5880 7896 }, cuando en realidad debe ser: { 0 1700 3580 7896 }, ya que el valor 5880 es obviado al calcular la menor distancia. Si se logra solucionar ese problema sería muy fácil insertar un código para encontrar el camino {1 2 3 5}.
Te recomiendo seguir este post y no abrir otros similares ya que confundes a programadores que talvéz estén interesados en responderte.
Otra recomendación es que coloques tu calculadora en modo Apróximado antes de guardar tu programa, así convertirás todos los números enteros a enteros apróximados y acelerarás las iteraciones.
Atte. Dante Aroní C. www.deachp.com


Hola muchachos.
Hace tiempo lleve este tema, pero lo que nos pedian era diagramas GANTT, Calendario, CPM y tiempos PERT, tomando la RUTA CRITICA y se hacia manualmente dibujando los grafos (a veces con una ruta o mas rutas criticas), calculando ademas los tiempos mas cortos, a mas tardar, etc, algo de informacion sobre el tema en cuestión aqui, documentos del Dr. Francisco Palacios.
http://www.epsem.upc.edu/~fpq/ale-hp/modulos/aplicaciones/grafos.pdf
http://www.epsem.upc.edu/~fpq/ale-hp/modulos/aplicaciones/markov.pdf
Traduje un programa de HP48 a HP49 sobre Programación de obras disponible en www.hpcalc.org que dibuja el diagrama GANTT mostrando la ruta crítica, devolviendo la tabla de tiempos y actividades, ademas de algunos archivos extra tambien:
http://www.hpcalc.org/details.php?id=5760
El trabajo que estan realizando es interesante y obtener el camino mas corto es la RUTA CRITICA.
En un libro de analisis numérico vi la codificacion del camino mas corto en FORTRAN, pero se puede traducir, cuando tenga un poco mas de tiempo enviare el pseudocodigo y codigo fuente.
Espero que la informacion les sea de utilidad.
Saludos.


Saludos a Morifc y a todos los miembros,
Morifc, aquí te envío el codigó que acabo de desarrollar para obtener la ruta crítica basado en la teória que proporcionaste:
Se coloca en la pila la matríz de distancias:
[[ 0. 1700. 3968. 7622. 10970.]
[ 0. 0. 1880. 4652. 7496.]
[ 0. 0. 0. 2300. 4316.]
[ 0. 0. 0. 0. 2720. ]]
y se ejecuta el programa 'CPM'. El resultado obtenido es: { 1 2 3 5 }
CPM, el programa:
« DUP SIZE 2 GET
{0} 0 {} d n m s r
« {0}
2 n FOR c
{}
1 c 1 - FOR f
'm(f)+d(f,c)' EVAL +
NEXT
DUP SORT HEAD m SWAP + 'm' STO
NEXT
n LIST 's' STO
n
DO
r OVER + 'r' STO
s OVER GET
m ROT GET POS
UNTIL
DUP 1 ==
END
r REVLIST +
»
»
Código listo para copiar y pegar en el HPUserEdit ó en el Emulador y aplicarle STR->.
Leyenda de Variables:
d = Matríz de distancias.
n = # de nodos (# de filas de la matríz d).
m = Listas de distancias mínimas.
s = Lista de Listas de las sumas acumuladas.
r = Lista de rutas.
f = Índice para el # de filas de la matríz d.
c = Índice para el # de columnas de la matríz d.
Si tienes alguna duda me escribes.
Atte. Dante Aroní C. www.deachp.com


Saludos a todos lo miembros
hola DEACHP acabo de acabar mi programa para hallar el camino mas Corto y justo me di cuenta que tu mandaste tambien bueno recien voy a revisar lo que me mandaste para analisarlo y aprender mas sobre programacion ,seguro es muy bueno.
Mas bien dime que opinas de mi programa y en que se puede mejorar te lo agradeceria mucho
Aca te mando mi programa para que le des una revisada:
« "Camino mas Corto"
{{ "Arcos" "Usando el Editor de Matrices" }}
{ 1 0 }{ }
IF 'CMC.dat' VTYPE 5 ==
THEN CMC.dat
ELSE { }
END
INFORM
IF
THEN
DUP 'CMC.dat' STO
OBJ DROP
{0}{}{0} 0 0 0 0 0 d m ca c min mina n k x
« d SIZE OBJ DROP 'n' STO DROP
ca n + 'ca' STO
2 n FOR i
Ÿ 'min' STO
1 i 1 - FOR j
min
'm(j)+ d(j,i)' EVAL
MIN 'mina' STO
IF 'min‹mina'
THEN j 'k' STO
END
mina 'min' STO
NEXT
m min + 'm' STO
c k + 'c' STO
NEXT
n 'x' STO
DO
'c(x)' EVAL DUP 'x' STO
ca + 'ca' STO
UNTIL 'x==1'
END
CLLCD "Magnitud del Camino mas Corto: " m REVLIST HEAD + MSGBOX
"Camino mas Corto: " ca STR + MSGBOX
» END »
Ingresamos la matriz distancias:
[[ 0. 1700. 3968. 7622. 10970.]
[ 0. 0. 1880. 4652. 7496.]
[ 0. 0. 0. 2300. 4316.]
[ 0. 0. 0. 0. 2720.]]
y se ejecuta el programa 'CMC':
Magnitud del Camino mas Corto: 7896
Camino mas Corto: {1 2 3 5}
CesarMoriF Estudiante de Ingenieria Industrial Universidad Nacional Mayor de San Marcos


Saludos a Morifc y a todos los miembros,
Morifc, el programa que desarrollaste trabaja bien. La única sugerencia es la siguiente:
1- Puedes utilizar: lista n GET, en lugar de 'lista(n)' EVAL.
2- Puedes uilizar: matriz f c GET, en lugar de 'matriz(f,c)' EVAL.
Así tus programas correrán más rápido.
Nota: Al utilizar RPN puro para manipular la pila los programas se ejecután más rápido, aunque se harán menos entendibles.
Atte. Dante Aroní C. www.deachp.com


Mis saludos a todos
Muchas gracias por tu aporte Deachp voy a cambiar lo que me dijiste en mi programa tienes razon si lo pongo en RPN es mas rapido.
Ahora quisiera completar el programa para esto faltan dos puntos imoportantes:
1)Quiero hacer que me vote el procedimiento manual es decir lo siguiente:
m1=0
m2=m1+d12=1700
m3=min {m1+d13, m2+d23}=min {3968,3580}=3580
m4=min {m1+d14, m2+d24, m3+d34}=min {7622, 6352, 5880}=5880
m5=min {m1+d15, m2+d25, m3+d35, m4+d45}=min {10970, 9196, 7896, 8600}=7896
Como esta el program pienso que seria agregarle algo en la mitad del programa pero tengo problemas al trabajar con texto lo que pasa es que quiero mostrar exactamente igual a lo anterior y no se la forma exacta.
2)Agregar la restriction que indique que puntos estan conectados con cual ejemplo: Si el punto 2 no esta conectado con el punto 3 entonces no existe d(2,3) por lo tanto no se evalua esa distancia y se pasa a la distancia entre 2 y 4 es decir d(2,4) si es que existiera asi sucesivamente.Se que habria muchas formas de hacerlo pero me gustaria saber cual seria la mas apropiada. Con esto mi programa estaria practicamente terminado por eso serai de gran ayuda cualquier consejo ,ejemplo o aporte que me puedan brindar tu Deachp o algun otro adicto que este interesado en este tema. Estamos en contacto Gracias Cesar Mori Fuentes Estudiante de Ingenieria Industrial Universidad Nacional Mayor de San Marcos

Hola Deachp
Necesito ayuca con la instalacion del programa graphwriter, ya que no tengo forma humana de instalarlo en la hp50g.
Muchas gracias

Me parece un proyecto excelente el que realizas , podrías decirnos si lograste terminarlo para probarlo o al menos la parte terminada.

Alexis eres un Mounstruo¡¡¡¡¡¡¡
No se si el programa da resultados correctos al 100% ; pero este es un programa must have, para el que estudie alguna rama de la ingenieria industrial
Realmente muy agradecido por la compilacion a la hp 50 G que has hecho.
Hola muchachos.
Hace tiempo lleve este tema, pero lo que nos pedian era diagramas GANTT, Calendario, CPM y tiempos PERT, tomando la RUTA CRITICA y se hacia manualmente dibujando los grafos (a veces con una ruta o mas rutas criticas), calculando ademas los tiempos mas cortos, a mas tardar, etc, algo de informacion sobre el tema en cuestión aqui, documentos del Dr. Francisco Palacios.
http://www.epsem.upc.edu/~fpq/ale-hp/modulos/aplicaciones/grafos.pdf
http://www.epsem.upc.edu/~fpq/ale-hp/modulos/aplicaciones/markov.pdf
Traduje un programa de HP48 a HP49 sobre Programación de obras disponible en www.hpcalc.org que dibuja el diagrama GANTT mostrando la ruta crítica, devolviendo la tabla de tiempos y actividades, ademas de algunos archivos extra tambien:
http://www.hpcalc.org/details.php?id=5760
El trabajo que estan realizando es interesante y obtener el camino mas corto es la RUTA CRITICA.
En un libro de analisis numérico vi la codificacion del camino mas corto en FORTRAN, pero se puede traducir, cuando tenga un poco mas de tiempo enviare el pseudocodigo y codigo fuente.
Espero que la informacion les sea de utilidad.
Saludos.


Alexis eres un Mounstruo¡¡¡¡¡¡¡
No es ninguna novedad, siempre lo fue 
Creo que se escribe monstruo (mostro para los amigos).

amigos tengo curiocidad al final lograron terminar este programita??
les comento que yo estoy llevando la materia de investigacion operativa II y me serviria de mucho...alguien podrian compartirlo conmigo por favor...asi les cuento como me fue pues are uso de todos los metodos






Si exacto DEACHP eso es a lo que me refiero pero el metodo de Dikjistra no es que quiero el CPM (Critical Path Method) metodo de la ruta mas Corta es el que estoy programando ya que ese metodo tienen varios usos.
Si es que alguien me puede ayudar.