gym-examples 3.0.4__py3-none-any.whl → 3.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gym_examples/__init__.py +1 -1
- gym_examples/envs/wsn_env.py +52 -1
- {gym_examples-3.0.4.dist-info → gym_examples-3.0.5.dist-info}/METADATA +1 -1
- gym_examples-3.0.5.dist-info/RECORD +7 -0
- gym_examples-3.0.4.dist-info/RECORD +0 -7
- {gym_examples-3.0.4.dist-info → gym_examples-3.0.5.dist-info}/WHEEL +0 -0
- {gym_examples-3.0.4.dist-info → gym_examples-3.0.5.dist-info}/top_level.txt +0 -0
gym_examples/__init__.py
CHANGED
gym_examples/envs/wsn_env.py
CHANGED
@@ -21,6 +21,7 @@ lower_bound = 0 # lower bound of the sensor positions
|
|
21
21
|
upper_bound = 100 # upper bound of the sensor positions
|
22
22
|
base_station_position = np.array([(upper_bound - lower_bound)/2, (upper_bound - lower_bound)/2]) # position of the base station
|
23
23
|
initial_number_of_packets = 1 # initial number of packets to transmit
|
24
|
+
latency_per_hop = 1 # latency per hop in seconds
|
24
25
|
|
25
26
|
|
26
27
|
# Define the final reward function using an attention mechanism
|
@@ -73,9 +74,19 @@ class WSNRoutingEnv(gym.Env):
|
|
73
74
|
self.remaining_energy = np.ones(self.n_sensors) * initial_energy
|
74
75
|
self.number_of_packets = np.ones(self.n_sensors, dtype=int) * initial_number_of_packets # number of packets to transmit
|
75
76
|
self.episode_count += 1
|
77
|
+
|
78
|
+
self.packets_delivered = 0
|
79
|
+
self.total_energy_consumed = 0
|
80
|
+
self.steps = 0
|
81
|
+
self.first_node_dead_time = None
|
82
|
+
self.total_latency = 0
|
83
|
+
self.packet_latency = np.zeros(self.n_sensors) # Latency for each packet
|
84
|
+
self.total_packets_sent_by_sensors = 0
|
85
|
+
|
76
86
|
return self._get_obs()
|
77
87
|
|
78
88
|
def step(self, actions):
|
89
|
+
self.steps += 1
|
79
90
|
rewards = [0] * self.n_sensors
|
80
91
|
dones = [False] * self.n_sensors
|
81
92
|
for i, action in enumerate(actions):
|
@@ -100,7 +111,16 @@ class WSNRoutingEnv(gym.Env):
|
|
100
111
|
transmission_energy = self.transmission_energy(self.number_of_packets[i], self.distance_to_base[i])
|
101
112
|
if self.remaining_energy[i] < transmission_energy:
|
102
113
|
continue # Skip if the sensor does not have enough energy to transmit data to the base station
|
114
|
+
|
103
115
|
self.update_sensor_energies(i, transmission_energy)
|
116
|
+
|
117
|
+
# Update the metrics
|
118
|
+
self.total_energy_consumed += transmission_energy
|
119
|
+
self.packets_delivered += self.number_of_packets[i]
|
120
|
+
self.total_packets_sent_by_sensors += self.number_of_packets[i]
|
121
|
+
self.total_latency += self.packet_latency[i] + latency_per_hop
|
122
|
+
self.packet_latency[i] = 0
|
123
|
+
|
104
124
|
rewards[i] = self.compute_individual_rewards(i, action)
|
105
125
|
dones[i] = True
|
106
126
|
else:
|
@@ -112,8 +132,16 @@ class WSNRoutingEnv(gym.Env):
|
|
112
132
|
reception_energy = self.reception_energy(self.number_of_packets[i])
|
113
133
|
if self.remaining_energy[i] < transmission_energy or self.remaining_energy[action] < reception_energy:
|
114
134
|
continue
|
135
|
+
|
115
136
|
self.update_sensor_energies(i, transmission_energy)
|
116
137
|
self.update_sensor_energies(action, reception_energy)
|
138
|
+
|
139
|
+
# Update the metrics
|
140
|
+
self.total_energy_consumed += transmission_energy + reception_energy
|
141
|
+
self.total_packets_sent_by_sensors += self.number_of_packets[i]
|
142
|
+
self.packet_latency[action] += self.packet_latency[i] + latency_per_hop
|
143
|
+
self.packet_latency[i] = 0
|
144
|
+
|
117
145
|
# Compute individual rewards
|
118
146
|
rewards[i] = self.compute_individual_rewards(i, action)
|
119
147
|
# Update the number of packets
|
@@ -136,6 +164,9 @@ class WSNRoutingEnv(gym.Env):
|
|
136
164
|
|
137
165
|
self.distance_to_base = np.linalg.norm(self.sensor_positions - base_station_position, axis=1)
|
138
166
|
|
167
|
+
if self.first_node_dead_time is None and np.any(self.remaining_energy <= 0):
|
168
|
+
self.first_node_dead_time = self.steps
|
169
|
+
|
139
170
|
return self._get_obs(), rewards, dones, {}
|
140
171
|
|
141
172
|
def _get_obs(self):
|
@@ -294,4 +325,24 @@ class WSNRoutingEnv(gym.Env):
|
|
294
325
|
# Cancel the displacement if the sensor goes out of bounds
|
295
326
|
for i in range(self.n_sensors):
|
296
327
|
if not(np.all(self.sensor_positions[i] >= lower_bound) and np.all(self.sensor_positions[i] <= upper_bound)):
|
297
|
-
self.sensor_positions[i] -= displacement[i]
|
328
|
+
self.sensor_positions[i] -= displacement[i]
|
329
|
+
|
330
|
+
def get_metrics(self):
|
331
|
+
# Calculate network throughput
|
332
|
+
network_throughput = self.packets_delivered / self.steps if self.steps > 0 else 0
|
333
|
+
# Calculate energy efficiency
|
334
|
+
energy_efficiency = self.packets_delivered / self.total_energy_consumed if self.total_energy_consumed > 0 else 0
|
335
|
+
# Calculate packet delivery ratio
|
336
|
+
packet_delivery_ratio = self.packets_delivered / self.total_packets_sent_by_sensors if self.total_packets_sent_by_sensors > 0 else 0
|
337
|
+
# Calculate network lifetime
|
338
|
+
network_lifetime = self.first_node_dead_time if self.first_node_dead_time is not None else self.steps
|
339
|
+
# Calculate average latency
|
340
|
+
average_latency = self.total_latency / self.packets_delivered if self.packets_delivered > 0 else 0
|
341
|
+
|
342
|
+
return {
|
343
|
+
"network_throughput": network_throughput,
|
344
|
+
"energy_efficiency": energy_efficiency,
|
345
|
+
"packet_delivery_ratio": packet_delivery_ratio,
|
346
|
+
"network_lifetime": network_lifetime,
|
347
|
+
"average_latency": average_latency
|
348
|
+
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
gym_examples/__init__.py,sha256=zR6j1LhHJ8uXhLKrad_AHpAObvekta5hm-SRnVorJIk,192
|
2
|
+
gym_examples/envs/__init__.py,sha256=lgMe4pyOuUTgTBUddM0iwMlETsYTwFShny6ifm8PGM8,53
|
3
|
+
gym_examples/envs/wsn_env.py,sha256=fRGbJ1P73yX4HCvY0QHKojTzsMjYhWcLpuWybHW7goc,17561
|
4
|
+
gym_examples-3.0.5.dist-info/METADATA,sha256=qiL6ukiPIe0mT1wv1A8_VIOXwMShSMu72K41xG9DwTY,410
|
5
|
+
gym_examples-3.0.5.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
6
|
+
gym_examples-3.0.5.dist-info/top_level.txt,sha256=rJRksoAF32M6lTLBEwYzRdo4PgtejceaNnnZ3HeY_Rk,13
|
7
|
+
gym_examples-3.0.5.dist-info/RECORD,,
|
@@ -1,7 +0,0 @@
|
|
1
|
-
gym_examples/__init__.py,sha256=pBtmbXnUs0H6nJW5IksyjbSaFWQt3fsV-WUH_g0CXEA,192
|
2
|
-
gym_examples/envs/__init__.py,sha256=lgMe4pyOuUTgTBUddM0iwMlETsYTwFShny6ifm8PGM8,53
|
3
|
-
gym_examples/envs/wsn_env.py,sha256=-PySvM8tO8y9f05zdI3d-vbY-7uFEni50gWvAxQlWoU,15187
|
4
|
-
gym_examples-3.0.4.dist-info/METADATA,sha256=xV1RByDj_ZHNoZBBgixahjFAidj-XPQ4G_KWL6uNhiM,410
|
5
|
-
gym_examples-3.0.4.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
6
|
-
gym_examples-3.0.4.dist-info/top_level.txt,sha256=rJRksoAF32M6lTLBEwYzRdo4PgtejceaNnnZ3HeY_Rk,13
|
7
|
-
gym_examples-3.0.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|