Foros del Web » Programando para Internet » PHP »

Obtener todas las rutas posibles de un mapa de grafos

Estas en el tema de Obtener todas las rutas posibles de un mapa de grafos en el foro de PHP en Foros del Web. Buenas a todos!! Estoy intentando obtener, desde un array de arrays de estados (ahora pondré un ejemplo), todos los caminos posibles para llegar de un ...
  #1 (permalink)  
Antiguo 13/04/2015, 02:40
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Pregunta Obtener todas las rutas posibles de un mapa de grafos

Buenas a todos!!

Estoy intentando obtener, desde un array de arrays de estados (ahora pondré un ejemplo), todos los caminos posibles para llegar de un nodo a otro. Por ejemplo, yo tengo los siguientes estados (su array interior indica a que otros estados puede conectarse):

Código PHP:
'states' => array(
        
'0' => array( 'to' => array( 110512) ),
    
'1' => array( 'to' => array( 251011) ),
    
'2' => array( 'to' => null),
    
'3' => array( 'to' => null),
    
'4' => array( 'to' => array( 56, ) ),
    
'5' => array( 'to' => array( 28612) ),
    
'6' => array( 'to' => array( 8137) ),
    
'7' => array( 'to' => null),
    
'8' => array( 'to' => array( 213),
    
'9' => array( 'to' => array( 1564) ),
    
'10' => array( 'to' => null),
    
'11' => array( 'to' => array( 4) ),
    
'12' => array( 'to' => array( 1583) ),
), 
Pues bien, tengo que sacar todos los caminos posibles hacía el 1, desde, por ejemplo, el 0, teniendo en cuenta que no puedo repetir caminos y que puede haber recursión.

Me gustaría hacerlo con una función por el cual me diese un array con todas las rutas posibles (osea, un array con subarray en cada posición indicando los diferentes nodos por los que pasa).

¿Se os ocurre cómo hacer esto?


¡¡Gracias!!
__________________
Neversyn Software e Ingeniería
  #2 (permalink)  
Antiguo 13/04/2015, 03:21
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Obtener todas las rutas posibles de un mapa de grafos

Asi, en principio, la funcion recursiva tendría una signature del tipo

function getPath($startNode, $endNode, $availableNodes, $connections, $currentPath, & $solutions)

La llamada inicial tiene
$startNode=<nodo inicial>,
$endNode=<nodo final>,
$availableNodes=<todos>,
$connections=<array de conexiones entre nodos>,
$currentPath=array(),
$solutions=array()

Las llamadas recursivas se realizan con:
$startNode=<nodo iactual>,
$endNode=<nodo final>, <-- fijo
$availableNodes=<aquellos no usados>,
$connections=<array de conexiones entre nodos>, <--- fijo
$currentPath=array(<nodos ya usados>)
$solutions=array(<arrays de soluciones>)

Si una llamada recursiva llega al nodo final, mete el valor de $currentPath dentro de $solutions.

Otra posibilidad es no pasar el array $solutions, y devolverlo como valor de retorno de la funcion, o null si no hay caminos entre $start y $end
  #3 (permalink)  
Antiguo 13/04/2015, 05:14
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Obtener todas las rutas posibles de un mapa de grafos

Hola @dashtrash, gracias por tu rápida respuesta.

Me gusta mucho como punto de partida, y ya había conseguido "algo" similar, la cuestión es que no termino de entender del todo tu pseudo código.

¿Para qué uso realmente availableNodes, si al final puede que tenga que pasar por el mismo para ir a otro punto? ¿Cómo vuelvo a un nodo padre cuando he agotado uno o varios de sus hijos?

A lo mejor es mucho pedir, pero un pequeño ejemplo "funcional" vendría de perlas :)


¡Muchas gracias de nuevo!!
__________________
Neversyn Software e Ingeniería
  #4 (permalink)  
Antiguo 13/04/2015, 05:24
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Obtener todas las rutas posibles de un mapa de grafos

Creo que ya lo he entendido... Voy a terminar mi ejemplo a ver que sale y si lo consigo lo publico.


¡¡Gracias!!
__________________
Neversyn Software e Ingeniería
  #5 (permalink)  
Antiguo 13/04/2015, 06:51
Avatar de zeuslife  
Fecha de Ingreso: enero-2008
Ubicación: Madrid
Mensajes: 533
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Obtener todas las rutas posibles de un mapa de grafos

Cita:
Iniciado por zeuslife Ver Mensaje
Creo que ya lo he entendido... Voy a terminar mi ejemplo a ver que sale y si lo consigo lo publico.


¡¡Gracias!!
Pues no... :(
__________________
Neversyn Software e Ingeniería
  #6 (permalink)  
Antiguo 13/04/2015, 08:38
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Obtener todas las rutas posibles de un mapa de grafos

Cita:
Iniciado por zeuslife Ver Mensaje
Hola @dashtrash, gracias por tu rápida respuesta.
¿Para qué uso realmente availableNodes, si al final puede que tenga que pasar por el mismo para ir a otro punto? ¿Cómo vuelvo a un nodo padre cuando he agotado uno o varios de sus hijos?
Am, lo que no quieres es repetir caminos.Lo mismo da.Available <lo que sea> es la lista de nodos, caminos, o lo que sea que aun quedan disponibles.

Cita:
Iniciado por zeuslife Ver Mensaje
A lo mejor es mucho pedir, pero un pequeño ejemplo "funcional" vendría de perlas :)
Not going to happen.Pero es muy sencillo:

- start == end ? SI->Devolver el path actual, con end como ultimo elemento.
- No?
Crear un array de soluciones vacio.
Por cada uno de los caminos que existen en availableNodes (aunque ya no son nodos, sino caminos), que comienzan (o terminan) en $start:
-crear un array availableNodes nuevo , donde no existe el camino actual.
-crear un array con currentPath + $start
-llamar recursivamente, con start==nodo opuesto del camino, y currentPath, el array anterior.
- Si la llamada devolvio un array, añadirlo al array de soluciones.

- Devolver el array de soluciones.

Etiquetas: arboles, nodos, rutas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:47.