Qual è l'algoritmo migliore per assegnare ID / numeri seriali univoci a un gruppo di oggetti identici?

-5

per rendere più semplice la visualizzazione di questa domanda, chiamiamola "il problema della mesh di pollo".

Supponiamo di avere un gallo e un numero (supponiamo che sia 30) di polli baby.

Obiettivo: consentire al gallo di identificare in modo univoco ognuno dei polli del bambino e i messaggi RELAY (indirettamente, da qui la parola "RELÈ") a un pollo specifico. (Per i polli vicino al gallo, può parlare direttamente con loro, ma questo è oltre il punto)

Limitazioni e amp; condizioni:

  • Il gallo può parlare con qualcuno (quelli che gli sono vicini), ma non può identificare nessuno dei polli prima di assegnare loro degli ID (basta correggere quella scappatoia per formare l'inizio)
  • Il gallo può accedere / parlare direttamente a un numero molto limitato di polli vicino a lui, e per i polli lontani, può solo passare messaggi (che possono includere informazioni ID o altre informazioni, i pacchetti / messaggi sono personalizzabili) polli (sì, più di una gallina) vicino a lui, e lascia che quei polli trasmettano i messaggi, usando il metodo del diluvio.
  • Qualsiasi 2 polli si chiudono (ho capito che "quanto vicino" potrebbe essere un grosso problema, ma per ora, definiamolo come "l'uno accanto all'altro") l'uno all'altro possono parlare tra loro.
  • I polli sono sparsi ovunque in modo irregolare. Immagina di avere un'enorme scacchiera e ha molte, molte più griglie, le galline occupano queste griglie in modo radicale, MA puoi sempre trovare il modo di trasmettere il messaggio del gallo a tutti, anche se significa che una grande quantità di messaggi dovrà passa un paio di polli, perché questi due sono vicini l'uno all'altro e formano involontariamente una sorta di "ponte" tra due grandi gruppi di polli.

Una panoramica di ciò che potrebbe accadere se dovessi provare ad assegnare a ogni cucciolo di pollo un numero ID univoco (solo un esempio, non l'effettiva implementazione in quanto non so come):

Il gallo parla con il pollo più vicino a lui usando un pacchetto di configurazione di qualche tipo e chiama il pollo "0x01", quindi il gallo parla con un altro pollo accanto a lui (in realtà, questo ordine potrebbe essere causato dalla distanza, o puramente casuale) e chiamarlo "0x02". Quindi 0x02 passa questo pacchetto di configurazione a un altro pollo con un certo flag impostato che informa chiunque abbia ricevuto questo pacchetto che l'ID "0x02" era già stato preso. Questo processo viene ripetuto fino a quando un chiken ottiene un ID "0x1E", e da quel momento in poi nessuno risponderà a nessun pacchetto di configurazione, e ogni singolo pollo può essere ID-ed univocamente dato che semplicemente ignorerà i pacchetti che contengono ID diversi da propria.

Nota che lo scenario sopra riportato non è l'effettiva implementazione, solo un esempio per aiutarti a capire che cosa è probabile che accada.

Ultimo ma non meno importante, per favore non ottenere alcun algoritmo di routing, per favore usa solo "stupido" flood. E sì, lo so che è un po 'irragionevole, ma devo implementare l'intero schema usando apparecchiature di fascia bassa, abbastanza basse che non ho il tipo di RAM e probabilmente nemmeno la potenza di calcolo per eseguire un processo di instradamento attivo. / p>

E per alluvione, per favore non ti preoccupare dei messaggi che si ripetono all'infinito, sovraccaricando e paralizzando l'intera rete, ci sono già meccanismi in plaque per impedirlo (ad esempio, ridurre la frequenza di ripetizione esponenziale di un messaggio)

Il punto è, sono sicuro che ci sono algoritmi per questo, ma non ho uno sfondo solido in SE o CS, quindi per favore aiuto?

    
posta PowerPack1 24.10.2016 - 14:43
fonte

1 risposta

4

Dovrai fare qualche ricerca sui protocolli di rete di basso livello - questo è un problema risolto.

Ecco uno schema, basato su una lezione di networking che ho fatto 20 anni fa.

Passaggio 1: chiedi al tuo gallo di inviare un messaggio

all chickens who receive this directly: a) I am chicken ID 0x00. b) do not rebroadcast this message, and c) pick a random 32 bit integer and reply to this message with that number

Passaggio 2: chiedi al tuo gallo di rispondere a ciascun rispondente:

To the chicken who sent '431151231': You are now ID 0x01.

To the chicken who sent '513413412': You are now ID 0x02.

Se per qualche miracolo due polli hanno inviato lo stesso numero casuale, chiedi loro di generare un nuovo numero e di inviare nuovamente. Spero che non stiano usando lo stesso seme casuale.

Passaggio 3: invia un messaggio a ogni pollo di primo livello a turno:

Chicken 0x01: send this message to all of your direct connections, and relay the results to me (0x00): all chickens who receive this message, do not rebroadcast it, but reply with a random 32 bit integer.

    
risposta data 24.10.2016 - 15:25
fonte

Leggi altre domande sui tag