gym-examples 3.0.283__py3-none-any.whl → 3.0.285__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
@@ -5,4 +5,4 @@ register(
5
5
  entry_point="gym_examples.envs:WSNRoutingEnv",
6
6
  )
7
7
 
8
- __version__ = "3.0.283"
8
+ __version__ = "3.0.285"
@@ -74,7 +74,6 @@ class WSNRoutingEnv(gym.Env):
74
74
  self.episode_count = 0
75
75
  self.scale_displacement = 0.01 * (upper_bound - lower_bound) # scale of the random displacement of the sensors
76
76
  self.epsilon = 1e-10 # small value to avoid division by zero
77
- self.current_sensor = 0 # Index of the current sensor
78
77
 
79
78
  # Define observation space
80
79
  self.observation_space = Tuple(
@@ -84,7 +83,8 @@ class WSNRoutingEnv(gym.Env):
84
83
  # self.action_space = Tuple(tuple([Discrete(self.n_sensors + 1)] * self.n_agents))
85
84
  # self.action_space = MultiDiscrete([self.n_sensors + 1] * self.n_agents)
86
85
  # self.action_space = MultiDiscrete([self.n_agents, self.n_sensors + 1])
87
- self.action_space = Discrete(self.n_sensors + 1) # +1 for the base station
86
+ # self.action_space = Discrete(self.n_sensors + 1) # +1 for the base station
87
+ self.action_space = Discrete((self.n_sensors + 1)**self.n_agents)
88
88
 
89
89
  self.reset()
90
90
 
@@ -118,11 +118,10 @@ class WSNRoutingEnv(gym.Env):
118
118
 
119
119
  def step(self, actions):
120
120
  self.steps += 1
121
- rewards = - max_reward
122
- # rewards = 0
123
- dones = False
124
- actions = np.array([self.current_sensor, actions])
125
- for i, action in [actions]:
121
+ rewards = [-max_reward] * self.n_sensors
122
+ dones = [False] * self.n_sensors
123
+ actions = self.to_base_n(actions, self.n_sensors + 1)
124
+ for i, action in enumerate(actions):
126
125
  if self.remaining_energy[i] <= 0 or self.number_of_packets[i] <= 0:
127
126
  continue # Skip if sensor has no energy left or no packets to transmit
128
127
 
@@ -137,11 +136,6 @@ class WSNRoutingEnv(gym.Env):
137
136
  transmission_energy = self.transmission_energy(self.number_of_packets[i], self.distance_to_base[i])
138
137
  if self.remaining_energy[i] < transmission_energy:
139
138
  self.remaining_energy[i] = 0
140
- next_sensor = self.find_next_sensor()
141
- if next_sensor is None:
142
- dones = True
143
- else:
144
- self.current_sensor = next_sensor
145
139
  continue # Skip if the sensor does not have enough energy to transmit data to the base station
146
140
 
147
141
  self.update_sensor_energies(i, transmission_energy)
@@ -153,12 +147,8 @@ class WSNRoutingEnv(gym.Env):
153
147
  self.total_latency += self.packet_latency[i] + latency_per_hop
154
148
  self.packet_latency[i] = 0
155
149
 
156
- rewards = max_reward # Reward for transmitting data to the base station
157
- next_sensor = self.find_next_sensor()
158
- if next_sensor is None:
159
- dones = True
160
- else:
161
- self.current_sensor = next_sensor
150
+ rewards[i] = max_reward # Reward for transmitting data to the base station
151
+ dones[i] = True
162
152
  else:
163
153
  distance = np.linalg.norm(self.sensor_positions[i] - self.sensor_positions[action])
164
154
  if distance > self.coverage_radius:
@@ -167,21 +157,11 @@ class WSNRoutingEnv(gym.Env):
167
157
  transmission_energy = self.transmission_energy(self.number_of_packets[i], distance)
168
158
  reception_energy = self.reception_energy(self.number_of_packets[i])
169
159
  if self.remaining_energy[i] < transmission_energy:
170
- self.remaining_energy[i] = 0
171
- next_sensor = self.find_next_sensor()
172
- if next_sensor is None:
173
- dones = True
174
- else:
175
- self.current_sensor = next_sensor
160
+ self.remaining_energy[i] = 0
176
161
  continue # Skip if the sensor does not have enough energy to transmit data to the next hop
177
162
  if self.remaining_energy[action] < reception_energy:
178
163
  self.number_of_packets[i] = 0
179
164
  self.remaining_energy[action] = 0
180
- next_sensor = self.find_next_sensor()
181
- if next_sensor is None:
182
- dones = True
183
- else:
184
- self.current_sensor = next_sensor
185
165
  continue # Skip if the next hop does not have enough energy to receive data
186
166
 
187
167
  self.update_sensor_energies(i, transmission_energy)
@@ -193,16 +173,15 @@ class WSNRoutingEnv(gym.Env):
193
173
  self.packet_latency[action] += self.packet_latency[i] + latency_per_hop
194
174
  self.packet_latency[i] = 0
195
175
 
196
- rewards = self.compute_individual_rewards(i, action)
176
+ rewards[i] = self.compute_individual_rewards(i, action)
197
177
 
198
178
  # Update the number of packets
199
179
  self.number_of_packets[action] += self.number_of_packets[i]
200
180
 
201
- self.current_sensor = action
202
181
  self.number_of_packets[i] = 0 # Reset the number of packets of the sensor i
203
182
  # Calculate final reward
204
183
  # rewards[i] = self.compute_attention_rewards(rewards[i])
205
- rewards = np.mean(rewards)
184
+ rewards[i] = np.mean(rewards[i])
206
185
 
207
186
  # Integrate the mobility of the sensors
208
187
  # self.integrate_mobility()
@@ -214,9 +193,13 @@ class WSNRoutingEnv(gym.Env):
214
193
 
215
194
  self.get_metrics()
216
195
 
217
- rewards = rewards.item() if isinstance(rewards, torch.Tensor) else rewards # Convert the reward to a float
218
- if not dones:
219
- dones = all(self.remaining_energy[i] <= 0 or self.number_of_packets[i] == 0 for i in range(self.n_sensors))
196
+ rewards = [reward.item() if isinstance(reward, torch.Tensor) else reward for reward in rewards] # Convert the reward to a float
197
+ rewards = np.mean(rewards) # Average the rewards
198
+
199
+ for i in range(self.n_sensors):
200
+ if not dones[i]:
201
+ dones[i] = self.remaining_energy[i] <= 0 or self.number_of_packets[i] == 0
202
+ dones = np.all(dones)
220
203
 
221
204
  return self._get_obs(), rewards, dones, self.get_metrics()
222
205
 
@@ -225,8 +208,7 @@ class WSNRoutingEnv(gym.Env):
225
208
  return [{'remaining_energy': np.array([e]),
226
209
  'consumption_energy': np.array([initial_energy - e]),
227
210
  'sensor_positions': p,
228
- 'number_of_packets': np.array([d]),
229
- 'curent_sensor': np.array([self.current_sensor])
211
+ 'number_of_packets': np.array([d])
230
212
  } for e, p, d in zip(self.remaining_energy, self.sensor_positions, self.number_of_packets)]
231
213
 
232
214
 
@@ -235,8 +217,7 @@ class WSNRoutingEnv(gym.Env):
235
217
  ('remaining_energy', Box(low=0, high=initial_energy, shape=(1,), dtype=np.float64)),
236
218
  ('consumption_energy', Box(low=0, high=initial_energy, shape=(1,), dtype=np.float64)),
237
219
  ('sensor_positions', Box(low=lower_bound, high=upper_bound, shape=(2,), dtype=np.float64)),
238
- ('number_of_packets', Box(low=0, high=self.n_sensors * initial_number_of_packets + 1, shape=(1,), dtype=int)),
239
- ('current_sensor', Box(low=0, high=self.n_sensors - 1, shape=(1,), dtype=int))
220
+ ('number_of_packets', Box(low=0, high=self.n_sensors * initial_number_of_packets + 1, shape=(1,), dtype=int))
240
221
  ]))
241
222
 
242
223
 
@@ -498,4 +479,16 @@ class WSNRoutingEnv(gym.Env):
498
479
  next_index = (self.current_sensor + offset) % self.n_sensors
499
480
  if self.remaining_energy[next_index] > 0 and self.number_of_packets[next_index] > 0:
500
481
  return next_index
501
- return None # If no such sensor is found
482
+ return None # If no such sensor is found
483
+
484
+
485
+ def to_base_n(self, number, base):
486
+ """Convert a number to a base-n number."""
487
+ if number == 0:
488
+ return [0] * (base - 1)
489
+
490
+ digits = []
491
+ while number:
492
+ digits.append(number % base)
493
+ number //= base
494
+ return digits[::-1] # Reverse the list to get the correct order
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gym-examples
3
- Version: 3.0.283
3
+ Version: 3.0.285
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=RG4x72mbBXJgNSIrzig4Fq6xeAVsPtwrVaN8fHLoVHc,166
2
+ gym_examples/envs/__init__.py,sha256=lgMe4pyOuUTgTBUddM0iwMlETsYTwFShny6ifm8PGM8,53
3
+ gym_examples/envs/wsn_env.py,sha256=7AKFR_Q4I_GADV3Q78g-JYacUSIwRDzjxLRZ5X9lzFc,23610
4
+ gym_examples-3.0.285.dist-info/METADATA,sha256=fR_FUKKdoAUxYEjQ8KbeVC4quinNkfxfqShtSaWFMlo,412
5
+ gym_examples-3.0.285.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
6
+ gym_examples-3.0.285.dist-info/top_level.txt,sha256=rJRksoAF32M6lTLBEwYzRdo4PgtejceaNnnZ3HeY_Rk,13
7
+ gym_examples-3.0.285.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- gym_examples/__init__.py,sha256=B6nFhjmZ3o9wglL3vYZps18eP8W7b436z2-pBFs_-2w,166
2
- gym_examples/envs/__init__.py,sha256=lgMe4pyOuUTgTBUddM0iwMlETsYTwFShny6ifm8PGM8,53
3
- gym_examples/envs/wsn_env.py,sha256=pi4-ErjIpxM1jrWjMr8vbUHmp0YSY9YaGSTXsL2k50I,24121
4
- gym_examples-3.0.283.dist-info/METADATA,sha256=0J7nhDUnmHi_7HwHNYycQqRikH_nlbSNNGmVVf6ujm0,412
5
- gym_examples-3.0.283.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
6
- gym_examples-3.0.283.dist-info/top_level.txt,sha256=rJRksoAF32M6lTLBEwYzRdo4PgtejceaNnnZ3HeY_Rk,13
7
- gym_examples-3.0.283.dist-info/RECORD,,