Cómo representar un gráfico con múltiples aristas permitidas entre nodos y aristas que pueden desaparecer selectivamente

11

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.

ingrese la descripción de la imagen aquí

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):

  1. 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
  2. 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
  3. 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?

Estallidos
fuente
Esto de alguna manera parece relevante. youtube.com/watch?v=xdiL-ADRTxQ
RubberDuck
Realmente no veo cómo eso va a ayudar aquí.
Aparece el
Así que pensé en esto por un tiempo. En la mayoría de los algoritmos para gráficos, tiene principalmente dos cosas que debe hacer: enumerar vecinos o encontrar el peso de un borde. Todas las preguntas que enumeró involucran a un solo usuario. Para un solo usuario, enumerar vecinos o encontrar el peso de una arista puede responderse en tiempo constante (si el recuento de usuarios está acotado) o en el log N simplemente reflejando la lista de adyacencia o la matriz con una "propiedad". Con ese fin, creo que cualquiera puede extenderse fácilmente y debe elegirse en función de las fortalezas tradicionales, en lugar de distraerse con la parte del usuario.
J Trana

Respuestas:

6

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?

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:

  • Si A y B son gráficos, entonces A @ B también es un gráfico (es decir, se puede alimentar a los algoritmos de su biblioteca de gráficos).
  • El conjunto de vértices en A @ B es la unión de vértices en A y B.
  • El conjunto de aristas en A @ B es la unión de aristas en A y B.
  • La estructura A @ B no posee ningún vértice o borde, sino que usa A y B como contenedores de datos.

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

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

puedes reemplazarlo fácilmente con

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

donde está suministrando LayeredGraphsy prestando el resto de la biblioteca.

Michael Le Barbier Grünewald
fuente
Vaya, ignore mi comentario anterior, leí mal su respuesta un poco. Esto es básicamente lo que estoy haciendo, aunque no pude aprovechar las bibliotecas de gráficos existentes, porque tontamente no pensé en ver si existía alguna.
Aparece el
1

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í.

walrii
fuente
1
seguramente una matriz de adyacencia normalmente no puede representar más de 1 borde entre cada par de nodos
jk.
1
@jk, normalmente tienes razón. Pero la información adjunta en la matriz de adyacencia podría tener el número de arcos y atributos separados para cada arco. Pero en la mayoría de los casos, usaría una lista de adyacencia porque sería más simple.
walrii
1
si está adjuntando información para cada borde a la celda, de todos modos tiene una lista adyacente, pierde el beneficio que una matriz le brinda para gráficos densos
jk.