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.
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):
- 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
- 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
- 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?
fonte
Respostas:
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: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
você pode substituí-lo facilmente por
onde você está fornecendo
LayeredGraphs
e emprestando o restante da biblioteca.fonte
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.
fonte