Como representar um gráfico com várias arestas permitidas entre nós e arestas que podem desaparecer seletivamente


11

Estou tentando descobrir que tipo de estrutura de dados usar para modelar um uso hipotético e idealizado da rede.

No meu cenário, vários usuários hostis uns aos outros estão tentando formar redes de computadores onde todas as conexões em potencial são conhecidas. Os computadores que um usuário precisa conectar podem não ser os mesmos que outro usuário precisa conectar; o usuário 1 pode precisar conectar os computadores A, B e D, enquanto o usuário 2 pode precisar conectar os computadores B, C e E.

insira a descrição da imagem aqui

Imagem gerada com a ajuda do NCTM Graph Creator

Eu acho que o núcleo disso será um gráfico cíclico não direcionado, com nós representando computadores e bordas representando cabos Ethernet. No entanto, devido à natureza do cenário, existem alguns recursos incomuns que descartam listas de adjacências e matrizes de adjacência (pelo menos, sem modificações não triviais):

  1. as bordas podem se tornar de uso restrito; ou seja, se um usuário adquirir uma determinada conexão de rede, nenhum outro usuário poderá usar essa conexão
    • no exemplo, o usuário verde não pode se conectar ao computador A, mas o usuário vermelho conectou B a E apesar de não ter um link direto entre eles
  2. em alguns casos, um determinado par de nós será conectado por mais de uma borda
    • no exemplo, existem dois cabos independentes que funcionam de D a E, de modo que os usuários verde e azul puderam conectar essas máquinas diretamente; no entanto, o vermelho não pode mais fazer essa conexão
  3. se dois computadores estiverem conectados por mais de um cabo, cada usuário poderá possuir não mais que um desses cabos

Vou precisar fazer várias operações neste gráfico, como:

  • determinar se algum par específico de computadores está conectado para um determinado usuário
  • identificação do caminho ideal para um determinado usuário conectar computadores de destino
  • identificação da conexão do computador com maior latência para um determinado usuário (ou seja, caminho mais longo sem ramificação)

Meu primeiro pensamento foi simplesmente criar uma coleção de todas as arestas, mas isso é terrível para pesquisar. A melhor coisa que posso pensar agora é modificar uma lista de adjacências para que cada item da lista contenha não apenas o comprimento da borda, mas também o custo e o proprietário atual. Essa é uma abordagem sensata? Assumindo que o espaço não é uma preocupação, seria razoável criar várias cópias do gráfico (uma para cada usuário) em vez de um único gráfico?


Isso de alguma forma parece relevante. youtube.com/watch?v=xdiL-ADRTxQ #
RubberDuck

Eu realmente não estou vendo como isso vai ajudar aqui.
Pops

Então eu pensei sobre isso por um tempo. Na maioria dos algoritmos para gráficos, você tem basicamente duas coisas que precisa fazer: enumerar vizinhos ou descobrir o peso de uma aresta. As perguntas listadas envolvem apenas um usuário. Para um único usuário, a enumeração de vizinhos ou a localização do peso de uma borda podem ser respondidas em tempo constante (se a contagem de usuários estiver limitada) ou no log N simplesmente espelhando a lista de adjacências ou a matriz com uma "propriedade". Para esse fim, acho que qualquer um pode ser estendido facilmente e deve ser escolhido com base nos pontos fortes tradicionais, em vez de se distrair com a parte do usuário.
J Trana

Respostas:


6

Assumindo que o espaço não é uma preocupação, seria razoável criar várias cópias do gráfico (uma para cada usuário) em vez de um único gráfico?

Parece-me que você deveria usar o que poderíamos rotular como "gráficos em camadas", ou seja, adicionar um combinador para gráficos, digamos @, para que:

  • Se A e B são gráficos, A @ B também é um gráfico (ou seja, pode ser alimentado pelos algoritmos da sua biblioteca de gráficos).
  • O conjunto de vértices em A @ B é a união dos vértices em A e B.
  • O conjunto de arestas em A @ B é a união das arestas em A e B.
  • A estrutura A @ B não possui nenhum vértice ou aresta, mas usa A e B como contêineres de dados.

Com esses gráficos em camadas, você pode definir K como a informação disponível do kommon e R, G, B, cada uma das informações privadas, para que cada jogador esteja vendo R @ K, G @ K, B @ K.

Para realmente implementar isso, você pode procurar uma biblioteca de gráficos implementando algoritmos genericamente, ou seja, para que o algoritmo de caminho mais longo etc. seja parametrizado pela representação real do seu gráfico. Então, se sua biblioteca diz

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

você pode substituí-lo facilmente por

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

onde você está fornecendo LayeredGraphse emprestando o restante da biblioteca.


Opa, desconsidere meu comentário anterior, eu entendi um pouco sua resposta. Isso é basicamente o que estou fazendo, embora não tenha aproveitado as bibliotecas de gráficos existentes, porque tolamente não pensei em ver se havia alguma.
Pops

1

O que você precisa é chamado de "gráfico atribuído". Em um gráfico atribuído, informações (atributos) são anexadas aos arcos. Um gráfico ponderado, um dos gráficos atribuídos mais simples.

Para representar um gráfico atribuído, você pode usar uma lista de adjacência adicionando colunas extras ou matrizes de adjacência adicionando mais informações em cada célula. A maioria dos algoritmos para gráficos não atribuídos funcionará se você filtrar os arcos, com base nos atributos. Muitos algoritmos foram desenvolvidos para gráficos atribuídos, então não os descreverei aqui.


1
certamente uma matriz de adjacência normalmente não pode representar mais de uma aresta entre cada par de nós
jk.

1
@ jk, normalmente você está correto. Mas as informações anexadas na matriz de adjacência podem ter o número de arcos e atributos separados para cada arco. Mas na maioria dos casos, eu usaria uma lista de adjacência porque seria mais simples.
walrii

1
se você estiver anexando informações de todas as arestas à célula, você efetivamente tem uma lista adjacente de qualquer maneira, perde o benefício que uma matriz oferece para gráficos densos
jk.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.