gym-examples 3.0.3__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 CHANGED
@@ -3,7 +3,7 @@ from gym.envs.registration import register
3
3
  register(
4
4
  id="WSNRouting-v0",
5
5
  entry_point="gym_examples.envs:WSNRoutingEnv",
6
- max_episode_steps=1000,
6
+ max_episode_steps=50,
7
7
  )
8
8
 
9
- __version__ = "3.0.3"
9
+ __version__ = "3.0.5"
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gym-examples
3
- Version: 3.0.3
3
+ Version: 3.0.5
4
4
  Summary: A custom environment for multi-agent reinforcement learning focused on WSN routing.
5
5
  Home-page: https://github.com/gedji/CODES.git
6
6
  Author: Georges Djimefo
@@ -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=AAQWRhqIDpGJJCKsRn18CyWJ3sfJZO6h6Vf1KGqpewQ,194
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.3.dist-info/METADATA,sha256=QEcB4IX0GIDFiRGfinR-uQgv1vDbqB_z8SGSDDOnkig,410
5
- gym_examples-3.0.3.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
6
- gym_examples-3.0.3.dist-info/top_level.txt,sha256=rJRksoAF32M6lTLBEwYzRdo4PgtejceaNnnZ3HeY_Rk,13
7
- gym_examples-3.0.3.dist-info/RECORD,,