$$\rightleftharpoonup{xx}$$
$$\longleftharp{xx}$$,
$$\longrightharp{xx}$$,
Flusso di lavoro di trasmissione dati e elaborazione dei pacchetti
Inizializzazione del nodo: Ogni nodo parte con tutte le informazioni topologiche della rete, la sua capacità energetica massima e un agente SAC pre-addestrato pronto per la decisione. Il modulo di codifica di rete attiva e prepara le operazioni di combinazione di pacchetti.
Processo di codifica dei pacchetti: Quando inizia la trasmissione, i nodi sorgente raccolgono più pacchetti di dati dai sensori. Il modulo di codifica di rete combina questi pacchetti in meno pacchetti codificati utilizzando operazioni matematiche efficienti, riducendo significativamente il numero totale di trasmissioni necessarie.
Esecuzione della decisione di instradamento SAC: L'agente SAC analizza lo stato attuale della rete, inclusi livelli energetici dei vicini, qualità del collegamento, condizioni del traffico e distanza di destinazione. Seleziona il vicino ideale del prossimo hop in base alla sua politica appresa, dando priorità all'efficienza energetica e all'affidabilità.
Inoltro di pacchetti multi-hop: i pacchetti codificati viaggiano attraverso il percorso selezionato. I nodi intermedi decidono se combinare ulteriormente i pacchetti o inoltrarli direttamente, in base al loro stato attuale del buffer e ai livelli di energia rimanenti.
Calcolo e memorizzazione della ricompensa: Dopo ogni trasmissione, il sistema calcola un punteggio di ricompensa basato sul successo della consegna, l'energia utilizzata, il ritardo nella trasmissione e i drop dei pacchetti. Queste informazioni sulla ricompensa sono memorizzate affinché l'agente SAC possa imparare.
Aggiornamento sull'apprendimento continuo: L'agente SAC esamina regolarmente le esperienze memorizzate e aggiorna la propria strategia decisionale per migliorare la selezione di percorsi efficienti dal punto di vista energetico, mantenendo al contempo alte prestazioni di consegna.
Architettura di sistema
Un nodo tipico funziona come segue: rileva e raccoglie dati, li codifica usando la codifica di rete e poi inoltra il pacchetto codificato attraverso un percorso di routing selezionato dall'agente SAC. L'agente SAC valuta lo stato del nodo, inclusa energia residua, stato del buffer e qualità del collegamento, per decidere il prossimo salto ottimale. Questo processo è dinamico e si evolve attraverso l'esperienza man mano che cambiano le condizioni della rete. La Figura 1 illustrerà questo flusso di dati e l'interazione tra i componenti.
Equazione di codifica di rete
La codifica di rete viene applicata ai nodi intermedi come segue:

Dove Ci è il pacchetto codificato, αij è il coefficiente di codifica (appreso tramite SAC), e Pj sono i pacchetti originali. Questo permette alla rete di ridurre il numero di trasmissioni e migliorare l'affidabilità.
Funzione obiettivo SAC
L'agente SAC ottimizza la policy utilizzando il seguente obiettivo regolarizzato dall'entropia:

Dove r(s t, a t) è la ricompensa, α è un parametro di compromesso per l'esplorazione, e H è il termine di entropia.
Modello di consumo energetico
Per simulare un consumo realistico di energia, viene utilizzato il seguente modello:

Dove: Eelec- è l'energia per bit per far funzionare il trasmettitore/ricevitore, - k è la dimensione dei dati in bit, -
è l'energia richiesta dall'amplificatore del trasmettitore, - è la distanza tra i nodi, -d è l'esponente della perdita di percorso.
Metriche di valutazione
Le seguenti metriche di prestazione sono state utilizzate nelle simulazioni di questo studio:
Rapporto di consegna dei pacchetti (PDR):

Capacità produttiva:

Durata della rete: Definita come la durata fino a quando il 50% dei nodi di rete esaurisce la propria energia.
Efficienza energetica:

Pseudocodice
Inizializzazione dei nodi di rete IoT
Questa funzione configura tutti i nodi IoT nella rete prima che il sistema inizi a funzionare. A ogni nodo viene assegnata l'energia massima, un buffer vuoto per memorizzare i pacchetti, uno stato che rappresenta il suo ambiente locale, un agente SAC per apprendere decisioni ottimali e un modulo NC che consente la codifica intelligente dei dati.
Difesa initialize_nodes(rete):
per il nodo nella rete:
nodo.energia = MAX_ENERGY
nodo.buffer = []
nodo.stato = sense_environment(nodo)
node.agent = initialize_sac_agent()
node.nc_module = activate_network_coding()
Generazione di pacchetti e codifica di rete
Questa funzione è responsabile della raccolta dei dati dei sensori dal nodo sorgente, della loro codifica tramite un metodo di codifica lineare o basato su XOR, e della loro preparazione per la trasmissione. Riduce il sovraccarico di comunicazione raggruppando più pacchetti in un unico pacchetto codificato, pronto per essere inoltrato attraverso la rete.
Difesa generate_and_code_packets(source_node):
data_packets = collect_data(source_node)
coded_packet = network_code(data_packets)
queue_transmission(source_node, coded_packet)
Def network_code(pacchetti):
Ritorno linear_combination(pacchetti)
Decisione di routing basata su SAC
Qui, il nodo corrente utilizza il suo agente SAC per analizzare lo stato della rete e selezionare il vicino più efficiente dal punto di vista energetico e affidabile a cui inoltrare il pacchetto. La decisione si basa su politiche appassionate e condizioni ambientali attuali, come la qualità del collegamento o l'energia residua.
Def select_next_hop(current_node):
current_state = observe_network_state(current_node)
Azione = sac_agent_policy(current_node.agente, current_state)
next_hop = map_action_to_neighbor(azione)
Ritorno next_hop
Trasmissione dei pacchetti e anello di feedback
Questa funzione gestisce la trasmissione effettiva di un pacchetto codificato. Dopo aver determinato il miglior salto successivo, il pacchetto viene inviato se il collegamento è valido. Il sistema calcola quindi una ricompensa basata sul successo della trasmissione e sul consumo energetico, che viene utilizzata per aggiornare il modello di apprendimento dell'agente SAC.
Def transmit_packet(current_node, pacchetto):
next_hop = select_next_hop(current_node)
se is_link_valid(current_node, next_hop):
invio (pacchetto, next_hop)
Ricompensa = compute_reward(current_node, pacchetto)
update_sac_agent(current_node, ricompensa)
Altrimenti:
recompute_next_hop(current_node)
Aggiornamento agente SAC (fase di apprendimento)
Una volta trasmesso un pacchetto, questa funzione aggiorna l'agente SAC. Registra il cambiamento di stato, memorizza l'esperienza in memoria e, se viene raccolta abbastanza esperienza, utilizza un lotto campione per migliorare la strategia decisionale dell'agente. Questo aiuta il nodo ad adattarsi ai cambiamenti della rete nel tempo.
Definitivamente update_sac_agent(nodo, ricompensa):
new_state = observe_network_state(nodo)
store_transition(node.agent.memory, node.state, node.action, ricompensa, new_state)
se enough_experience(node.agent.memory):
batch = sample_batch(node.agent.memory)
node.agent = optimize_sac(node.agent, batch)
nodo.stato = new_state
Decodifica al ricevitore
A destinazione, questa funzione prende tutti i pacchetti codificati ricevuti e li decodifica nuovamente nei dati originali utilizzando metodi come l'eliminazione gaussiana. I dati recuperati vengono poi passati al livello applicativo o al processo appropriato.
Def decode_packet(destination_node):
received_packets = destination_node.buffer
original_data = decodifica(received_packets)
deliver_data(original_data)
Decodifica DEF (pacchetti):
ritorno gaussian_elimination(pacchetti)
Monitoraggio energetico e logica del sonno dei nodi
Questa funzione monitora i livelli energetici di ogni nodo e determina se un nodo deve continuare a funzionare o passare in modalità sospensione per risparmiare energia. Se l'energia è sufficiente, il nodo detrae i costi correlati alla trasmissione; altrimenti, si spegne temporaneamente per prolungare la durata complessiva della rete.
Def monitor_energy(nodo):
se node.energy < SOGLIA:
put_node_to_sleep(nodo)
else: nodo.energy -= transmission_cost()