Lista de todos los usuarios de la red gráfica dada una distancia X
Una distancia X
de qué? desde un nodo inicial o una distancia X
entre ellos? ¿Puede dar un ejemplo? Esto puede o no ser tan simple como hacer una búsqueda BF o ejecutar Dijkstra.
Suponiendo que comienza en un nodo determinado y desea enumerar todos los nodos que tienen distancias X
al nodo inicial, simplemente ejecute BFS desde el nodo inicial. Cuando esté a punto de insertar un nuevo nodo en la cola, verifique si la distancia desde el nodo inicial al nodo que desea insertar es el nuevo nodo desde + el peso del borde desde el nodo desde el que desea insertar el nuevo nodo. el nuevo nodo es < = X
. Si es estrictamente más bajo, inserte el nuevo nodo y si es igual, simplemente imprima el nuevo nodo (y solo insértelo si también puede tener 0 como un peso de borde).
Lista todos los usuarios en la red gráfica dada una distancia X y el tipo de relación
Véase más arriba. Simplemente tenga en cuenta el tipo de relación en el BFS: si el tipo del elemento primario es diferente al del nodo que está intentando insertar en la cola, no lo inserte.
calcular la trayectoria más corta entre 2 usuarios en la red gráfico dado un tipo de relación
El algoritmo depende de varios factores:
- ¿Con qué frecuencia es necesario calcular ¿esta?
- ¿Cuántos nodos tiene?
Como quiera fácil, las más fáciles son las de Roy-Floyd y Dijkstra.
- El uso de Roy-Floyd es cúbico en el número de nodos, tan ineficiente. Solo use esto si puede permitirse ejecutarlo una vez y luego responder cada consulta en O (1). Use esto si puede permitirse mantener una matriz de adyacencia en la memoria.
- Dijkstra's es cuadrática en el número de nodos si desea mantenerlo simple, pero deberá ejecutarlo cada vez que desee calcular la distancia entre dos nodos. Si desea usar Dijkstra, use una lista de adyacencia.
Éstos son implementaciones C: Roy-Floyd y Dijkstra_1, Dijkstra_2. Puede encontrar mucho en google con "<algorithm name> c implementation"
.
Editar: Roy-Floyd está fuera de la cuestión de 18 000 nodos, como es una matriz de adyacencia. Tomaría demasiado tiempo construir y demasiada memoria. Su mejor opción es usar el algoritmo de Dijkstra para cada consulta, pero preferiblemente implementar Dijkstra usando un montón. En los enlaces que proporcioné, use un montón para encontrar el mínimo. Si ejecuta el Dijkstra clásico en cada consulta, eso también podría llevar mucho tiempo.
Otra opción es usar el algoritmo Bellman-Ford en cada consulta, lo que le dará O(Nodes*Edges)
tiempo de ejecución por consulta. Sin embargo, esta es una gran sobreestima si no la implementa como se lo ordena Wikipedia. En su lugar, use una cola similar a la usada en BFS. Siempre que un nodo actualice su distancia desde la fuente, inserte ese nodo nuevamente en la cola. Esto será muy rápido en la práctica, y también funcionará para pesos negativos. Te sugiero que uses este o el Dijkstra con montones, ya que el Dijkstra clásico puede llevar mucho tiempo en 18 000 nodos.
calcular la distancia máxima entre 2 usuarios en la red gráfica
La forma más sencilla es utilizar el retroceso: probar todas las posibilidades y mantener el camino más largo encontrado. This is NP-complete, por lo que las soluciones polinomiales no existen.
Esto es realmente malo si tienes 18 000 nodos, no conozco ningún algoritmo (simple o de otro tipo) que funcione razonablemente rápido para tantos nodos. Considere aproximarlo utilizando algoritmos codiciosos.O tal vez tu gráfico tiene ciertas propiedades que puedes aprovechar. Por ejemplo, ¿es un DAG (gráfico acíclico dirigido)?
Calcular los usuarios conectados más distantes de la red gráfica
Lo que significa que quiere encontrar el diámetro de la gráfica. La forma más simple de hacer esto es encontrar las distancias entre cada dos nodos (todos los pares de caminos más cortos), ya sea ejecutar Roy-Floyd o Dijkstra entre cada dos nodos y elegir los dos con la distancia máxima).
De nuevo, esto es muy difícil de hacer rápido con su número de nodos y bordes. Me temo que no tienes suerte en estas dos últimas preguntas, a menos que tu gráfica tenga propiedades especiales que puedan explotarse.
¿Crees que ayudaría si "convertí" el gráfico a una matriz de adyacencia para representar el peso del enlace y el tipo de relación? ¿Sería más fácil realizar el algoritmo en lugar de las listas vinculadas? Podría implementar fácilmente una función para hacer esa conversión cuando sea necesario. Estoy diciendo esto porque tuve la sensación de que sería más fácil después de leer un par de páginas sobre el tema, pero podría estar equivocado.
No, la matriz de adyacencia y Roy-Floyd son una muy mala idea a menos que su aplicación esté dirigida a supercomputadores.
1) Distancia X, supongo que es como el peso total entre 2 nodos. 2) No sé con qué frecuencia, las operaciones anteriores son opciones en el menú de la interfaz de usuario. 3) Es como ~ 18000 vértices con ~ 520000 enlaces en la muestra de datos provista. 4) Además, gracias por los enlaces, voy a investigar ... –
Actualicé mi respuesta, y también agregué algunas preguntas más :). – IVlad
No hay propiedades especiales ... Bueno, si dice que no hay algoritmos especiales y que llevará demasiado tiempo con los habituales, entonces no entiendo el sentido de estas operaciones como parte del proyecto. El año pasado (que no completé debido a problemas personales) el proyecto fue similar, pero solo se pidió el camino más corto: S –