Come rappresentare un grafico con più spigoli consentiti tra nodi e spigoli che possono scomparire selettivamente


11

Sto cercando di capire quale tipo di struttura di dati utilizzare per modellare un ipotetico utilizzo idealizzato della rete.

Nel mio scenario, un certo numero di utenti che sono ostili tra loro stanno tutti cercando di formare reti di computer in cui sono note tutte le potenziali connessioni. Tuttavia, i computer a cui un utente deve connettersi potrebbero non essere uguali a quelli a cui un altro utente deve connettersi; l'utente 1 potrebbe aver bisogno di connettere i computer A, B e D mentre l'utente 2 potrebbe aver bisogno di connettere i computer B, C ed E.

inserisci qui la descrizione dell'immagine

Immagine generata con l'aiuto di NCTM Graph Creator

Penso che il nucleo di questo sarà un grafico ciclico non indirizzato, con nodi che rappresentano computer e bordi che rappresentano cavi Ethernet. Tuttavia, a causa della natura dello scenario, ci sono alcune caratteristiche non comuni che escludono elenchi di adiacenza e matrici di adiacenza (almeno, senza modifiche non banali):

  1. i bordi possono diventare ad uso limitato; vale a dire, se un utente acquisisce una determinata connessione di rete, nessun altro utente può utilizzare quella connessione
    • nell'esempio, l'utente verde non può connettersi al computer A, ma l'utente rosso ha collegato B a E nonostante non abbia un collegamento diretto tra di loro
  2. in alcuni casi, una determinata coppia di nodi sarà connessa da più di un bordo
    • nell'esempio, ci sono due cavi indipendenti che vanno da D a E, quindi gli utenti verde e blu erano entrambi in grado di collegare direttamente quelle macchine; tuttavia, il rosso non può più effettuare tale connessione
  3. se due computer sono collegati da più di un cavo, ogni utente non può possedere più di uno di questi cavi

Dovrò fare diverse operazioni su questo grafico, come:

  • determinare se una determinata coppia di computer è connessa per un determinato utente
  • identificare il percorso ottimale per un determinato utente per connettere i computer di destinazione
  • identificare la connessione del computer a latenza più elevata per un determinato utente (ovvero il percorso più lungo senza diramazione)

Il mio primo pensiero è stato semplicemente quello di creare una raccolta di tutti i bordi, ma è terribile per la ricerca. La cosa migliore che posso pensare di fare ora è modificare un elenco di adiacenza in modo che ogni elemento nell'elenco contenga non solo la lunghezza del bordo ma anche il suo costo e l'attuale proprietario. È un approccio sensato? Supponendo che lo spazio non sia un problema, sarebbe ragionevole creare più copie del grafico (una per ciascun utente) anziché un singolo grafico?


Questo in qualche modo sembra rilevante. youtube.com/watch?v=xdiL-ADRTxQ
RubberDuck

Non vedo davvero come sarà d'aiuto qui.
Schiocca il

Quindi ci ho pensato per un po '. Nella maggior parte degli algoritmi per i grafici, hai principalmente due cose che devi fare: enumerare i vicini o trovare il peso di un bordo. Le domande che hai elencato riguardano tutte un solo utente. Per un singolo utente, si può rispondere all'enumerazione dei vicini o alla ricerca del peso di un bordo in tempo costante (se il conteggio degli utenti è limitato) o nel registro N semplicemente eseguendo il mirroring dell'elenco di adiacenza o della matrice con una "proprietà". A tal fine, penso che entrambi possano essere estesi facilmente e dovrebbero essere scelti in base ai punti di forza tradizionali, piuttosto che essere distratti dalla parte dell'utente.
J Trana,

Risposte:


6

Supponendo che lo spazio non sia un problema, sarebbe ragionevole creare più copie del grafico (una per ciascun utente) anziché un singolo grafico?

Mi sembra che dovresti usare ciò che potremmo etichettare "grafici a strati", cioè aggiungere un combinatore per i grafici, diciamo @, in modo che:

  • Se A e B sono grafici, anche A @ B è un grafico (ovvero può essere inviato agli algoritmi della libreria dei grafici).
  • L'insieme dei vertici in A @ B è l'unione dei vertici in A e B.
  • L'insieme dei bordi in A @ B è l'unione dei bordi in A e B.
  • La struttura A @ B non possiede alcun vertice o bordo, ma utilizza A e B come contenitori di dati.

Con tali grafici a strati, puoi definire K come informazione disponibile kommon e R, G, B ogni informazione privata in modo che ogni giocatore stia effettivamente vedendo R @ K, G @ K, B @ K.

Per implementarlo effettivamente, potresti cercare una libreria di grafici che implementa algoritmi genericamente, cioè in modo che l'algoritmo del percorso più lungo ecc. Sia parametrizzato dalla rappresentazione effettiva del tuo grafico. Quindi, se la tua biblioteca dice

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

puoi facilmente sostituirlo con

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

dove stai fornendo LayeredGraphse prendendo in prestito il resto dalla biblioteca.


Spiacenti, ignorando il mio commento precedente, ho letto male la tua risposta. Questo è fondamentalmente quello che sto facendo, anche se non sono riuscito a sfruttare le librerie di grafici esistenti, perché non ho pensato scioccamente di vedere se ne esistessero.
Schiocca il

1

Quello che ti serve è chiamato un "grafico attribuito". In un grafico attribuito, le informazioni (attributi) sono allegate agli archi. Un grafico pesato uno dei più semplici grafici attribuiti.

Per rappresentare un grafico attribuito, è possibile utilizzare un elenco di adiacenza aggiungendo colonne aggiuntive o matrici di adiacenza aggiungendo ulteriori informazioni in ciascuna cella. La maggior parte degli algoritmi per i grafici non attribuiti funzionerà se si filtrano gli archi, in base agli attributi. Sono stati sviluppati molti algoritmi per i grafici attribuiti, quindi non li descriverò qui.


1
sicuramente una matrice di adiacenza normalmente non può rappresentare più di 1 spigolo tra ciascuna coppia di nodi
jk.

1
@jk, normalmente hai ragione. Ma le informazioni allegate nella matrice di adiacenza potrebbero avere il numero di archi e attributi separati per ciascun arco. Ma nella maggior parte dei casi, userei un elenco di adiacenza perché sarebbe più semplice.
walrii,

1
se stai allegando informazioni per ogni bordo alla cella, hai comunque un elenco di adiacenza, perdi il vantaggio che una matrice ti offre per grafici densi
jk.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.