$$\rightleftharpoonup{xx}$$
$$\longleftharp{xx}$$,
$$\longrightharp{xx}$$,
Datenübertragungs- und Paketverarbeitungs-Workflow
Knoteninitialisierung: Jeder Knoten beginnt mit vollständigen Netzwerktopologieinformationen, seiner maximalen Energiekapazität und einem vortrainierten SAC-Agenten, der für Entscheidungen bereit ist. Das Netzwerkcodierungsmodul aktiviert und bereitet die Paketkombinationsoperationen vor.
Paketcodierungsprozess: Wenn die Übertragung beginnt, sammeln Quellknoten mehrere Datenpakete von Sensoren. Das Netzwerkcodierungsmodul kombiniert diese Pakete zu weniger codierten Paketen mithilfe effizienter mathematischer Operationen, wodurch die Gesamtzahl der benötigten Übertragungen erheblich reduziert wird.
SAC-Routing-Entscheidungsausführung: Der SAC-Agent analysiert den aktuellen Netzwerkzustand, einschließlich der Energieniveaus der Nachbarn, Verbindungsqualität, Verkehrsbedingungen und Zielentfernung. Es wählt den optimalen Next-Hop-Nachbarn basierend auf seiner erlernten Strategie aus und legt dabei Wert auf Energieeffizienz und Zuverlässigkeit.
Multi-Hop-Paketweiterleitung: Codierte Pakete durchlaufen den ausgewählten Pfad. Zwischenknoten entscheiden, ob sie die Pakete weiter kombinieren oder sie direkt weiterleiten, basierend auf ihrem aktuellen Pufferstatus und verbleibenden Energieniveaus.
Belohnungsberechnung und -speicherung: Nach jeder Übertragung berechnet das System einen Belohnungswert basierend auf Liefererfolg, Energieverbrauch, Übertragungsverzögerung und Paketverlusten. Diese Belohnungsinformationen werden gespeichert, damit der SAC-Agent daraus lernen kann.
Kontinuierliches Lernen: Der SAC-Mitarbeiter überprüft regelmäßig gespeicherte Erfahrungen und aktualisiert seine Entscheidungsstrategie, um energieeffiziente Routen besser auszuwählen und gleichzeitig eine hohe Lieferleistung zu gewährleisten.
Systemarchitektur
Ein typischer Knoten funktioniert wie folgt: Er erkennt und sammelt Daten, kodiert sie mit Netzwerkcodierung und leitet das kodierte Paket dann über einen vom SAC-Agenten ausgewählten Routingpfad weiter. Der SAC-Agent bewertet den Zustand des Knotens, einschließlich verbleibender Energie, Pufferstatus und Linkqualität, um den nächsten optimalen Hop zu bestimmen. Dieser Prozess ist dynamisch und entwickelt sich durch Erfahrung, wenn sich die Netzwerkbedingungen verändern. Abbildung 1 veranschaulicht diesen Datenfluss und die Interaktion zwischen den Komponenten.
Netzwerkcodierungsgleichung
Netzwerkcodierung wird an Zwischenknoten wie folgt angewendet:

Dabei ist Ci das codierte Paket, αij der Codierungskoeffizient (über SAC gelernt) und Pj die ursprünglichen Pakete. Dies ermöglicht es dem Netz, die Anzahl der Übertragungen zu reduzieren und die Zuverlässigkeit zu verbessern.
SAC-Zielfunktion
Der SAC-Agent optimiert die Policy anhand des folgenden entropieregularisierten Ziels:

Dabei ist r(st, at) die Belohnung, α ein Kompromissparameter für die Erkundung, und H ist der Entropieterm.
Energieverbrauchsmodell
Um den realistischen Energieverbrauch zu simulieren, wird folgendes Modell verwendet:

Dabei ist: Eelec- ist die Energie pro Bit, um den Sender/Empfänger zu betreiben, - k ist die Datengröße in Bits, -
ist die vom Senderverstärker benötigte Energie, - ist der Abstand zwischen den Knoten, -d ist der Pfadverlust-Exponent.
Bewertungsmetriken
Die folgenden Leistungskennzahlen wurden in den Simulationen dieser Studie verwendet:
Paketzustellungsverhältnis (PDR):

Durchsatz:

Netzwerklebensdauer: Definiert als die Dauer, bis 50 % der Netzwerkknoten ihre Energie erschöpft haben.
Energieeffizienz:

Pseudocode
Initialisierung von IoT-Netzwerkknoten
Diese Funktion richtet alle IoT-Knoten im Netzwerk ein, bevor das System in Betrieb genommen wird. Jedem Knoten wird maximale Energie, ein leerer Puffer zur Speicherung von Paketen, ein Zustand zur Darstellung seiner lokalen Umgebung, ein SAC-Agent zum Lernen optimaler Entscheidungen und ein NC-Modul zugewiesen, das eine intelligente Datenkodierung ermöglicht.
def initialize_nodes(Netzwerk):
Für den Knoten im Netzwerk:
node.energy = MAX_ENERGY
node.buffer = []
node.state = sense_environment(node)
node.agent = initialize_sac_agent()
node.nc_module = activate_network_coding()
Paketgenerierung und Netzwerkcodierung
Diese Funktion ist dafür verantwortlich, Sensordaten vom Quellknoten zu sammeln, diese mit einer linearen oder XOR-basierten Netzwerkcodierungsmethode zu codieren und für die Übertragung vorzubereiten. Es reduziert den Kommunikationsaufwand, indem mehrere Pakete zu einem codierten Paket gebündelt werden, das bereit ist, über das Netzwerk weitergeleitet zu werden.
def 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(Pakete):
Rückgabe linear_combination(Pakete)
SAC-basierte Routing-Entscheidung
Hier verwendet der aktuelle Knoten seinen SAC-Agenten, um den Netzwerkzustand zu analysieren und den energieeffizientesten und zuverlässigsten Nachbarn auszuwählen, an den das Paket weitergeleitet werden soll. Die Entscheidung basiert auf erlernten Richtlinien und aktuellen Umweltbedingungen, wie der Qualität der Verbindung oder der Restenergie.
def select_next_hop(current_node):
current_state = observe_network_state(current_node)
Aktion = sac_agent_policy(current_node.agent, current_state)
next_hop = map_action_to_neighbor(Aktion)
Rückkehr next_hop
Paketübertragung und Rückkopplungsschleife
Diese Funktion verwaltet die tatsächliche Übertragung eines codierten Pakets. Nachdem der beste nächste Hop bestimmt ist, wird das Paket gesendet, wenn der Link gültig ist. Das System berechnet dann eine Belohnung basierend auf dem Erfolg der Übertragung und dem Energieverbrauch, die verwendet wird, um das Lernmodell des SAC-Agenten zu aktualisieren.
def transmit_packet(current_node, Packet):
next_hop = select_next_hop(current_node)
Wenn is_link_valid(current_node, next_hop):
send(packet, next_hop)
Belohnung = compute_reward(current_node, Paket)
update_sac_agent(current_node, Belohnung)
sonst:
recompute_next_hop(current_node)
SAC-Agenten-Update (Lernphase)
Sobald ein Paket übertragen wurde, aktualisiert diese Funktion den SAC-Agenten. Es zeichnet die Zustandsänderung auf, speichert die Erfahrung im Speicher und verwendet eine Stichprobencharge, um die Entscheidungsstrategie des Agenten zu verbessern. Dies hilft dem Knoten, sich im Laufe der Zeit an Netzwerkänderungen anzupassen.
def update_sac_agent(Knoten, Belohnung):
new_state = observe_network_state(Knoten)
store_transition(node.agent.memory, node.state, node.action, reward, new_state)
if enough_experience(node.agent.memory):
batch = sample_batch(node.agent.memory)
node.agent = optimize_sac(node.agent, batch)
node.state = new_state
Dekodierung am Empfänger
Am Ziel nimmt diese Funktion alle empfangenen codierten Pakete auf und dekodiert sie mit Methoden wie Gaußscher Eliminierung wieder in die Originaldaten. Die wiedergewonnenen Daten werden dann an die entsprechende Anwendungsschicht oder den entsprechenden Prozess weitergegeben.
def decode_packet(destination_node):
received_packets = destination_node.buffer
original_data = dekodieren(received_packets)
deliver_data(original_data)
def decode(packets):
Rückgabe gaussian_elimination(Pakete)
Energieüberwachung und Knotenschlaflogik
Diese Funktion verfolgt die Energieniveaus jedes Knotens und bestimmt, ob ein Knoten weiter betrieben oder in den Schlafmodus wechseln soll, um Energie zu sparen. Reicht die Energie aus, zieht der Knoten die übertragungsbedingten Kosten ab; Wenn nicht, wird er vorübergehend abgeschaltet, um die gesamte Netzwerklaufzeit zu verlängern.
def monitor_energy(Knotenpunkt):
wenn node.energy < THRESHOLD:
put_node_to_sleep(Knoten)
sonst: knoten.energie -= transmission_cost()