Estoy tratando de averiguar qué tipo de estructura de datos usar para modelar un uso hipotético e idealizado de la red.
En mi escenario, varios usuarios que son hostiles entre sí están tratando de formar redes de computadoras donde se conocen todas las conexiones potenciales. Sin embargo, las computadoras que un usuario necesita para conectarse pueden no ser las mismas que necesita conectar otro usuario; el usuario 1 podría necesitar conectar las computadoras A, B y D, mientras que el usuario 2 podría necesitar conectar las computadoras B, C y E.
Imagen generada con la ayuda de NCTM Graph Creator
Creo que el núcleo de esto será un gráfico cíclico no dirigido, con nodos que representan computadoras y bordes que representan cables Ethernet. Sin embargo, debido a la naturaleza del escenario, hay algunas características poco comunes que descartan listas de adyacencia y matrices de adyacencia (al menos, sin modificaciones no triviales):
- los bordes pueden volverse de uso restringido; es decir, si un usuario adquiere una conexión de red determinada, ningún otro usuario puede usar esa conexión
- en el ejemplo, el usuario verde no puede conectarse a la computadora A, pero el usuario rojo ha conectado B a E a pesar de no tener un enlace directo entre ellos
- en algunos casos, un par de nodos dado estará conectado por más de un borde
- en el ejemplo, hay dos cables independientes que van de D a E, por lo que los usuarios verde y azul pudieron conectar esas máquinas directamente; sin embargo, el rojo ya no puede hacer esa conexión
- Si dos computadoras están conectadas por más de un cable, cada usuario puede poseer no más de uno de esos cables
Tendré que hacer varias operaciones en este gráfico, como:
- determinar si algún par de computadoras en particular está conectado para un usuario determinado
- identificar la ruta óptima para que un usuario determinado conecte las computadoras de destino
- identificar la conexión de computadora de mayor latencia para un usuario determinado (es decir, la ruta más larga sin ramificación)
Mi primer pensamiento fue simplemente crear una colección de todos los bordes, pero eso es terrible para la búsqueda. Lo mejor que puedo hacer ahora es modificar una lista de adyacencia para que cada elemento de la lista contenga no solo la longitud del borde, sino también su costo y el propietario actual. ¿Es este un enfoque sensato? Suponiendo que el espacio no es una preocupación, ¿sería razonable crear múltiples copias del gráfico (una para cada usuario) en lugar de un solo gráfico?
fuente
Respuestas:
Me parece que debería usar lo que podríamos etiquetar como "gráficos en capas", es decir, agregar un combinador para gráficos, por ejemplo
@
, para que:Con tales gráficos en capas, puede definir K como la información disponible de kommon y R, G, B cada información privada para que cada jugador realmente vea R @ K, G @ K, B @ K.
Para implementar esto realmente, puede buscar una biblioteca de gráficos que implemente algoritmos genéricamente, es decir, para que el algoritmo de la ruta más larga, etc., esté parametrizado por la representación real de su gráfico. Entonces, si tu biblioteca dice
puedes reemplazarlo fácilmente con
donde está suministrando
LayeredGraphs
y prestando el resto de la biblioteca.fuente
Lo que necesita se llama un "gráfico atribuido". En un gráfico atribuido, la información (atributos) se adjunta a los arcos. Un gráfico pesado, uno de los gráficos atribuidos más simples.
Para representar un gráfico atribuido, puede usar una lista de adyacencia agregando columnas adicionales o matrices de adyacencia agregando más información en cada celda. La mayoría de los algoritmos para gráficos no atribuidos funcionarán si filtra los arcos, en función de los atributos. Se han desarrollado muchos algoritmos para gráficos atribuidos, por lo que no los describiré aquí.
fuente