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 +1 -1
- gym_examples/envs/wsn_env.py +33 -40
- {gym_examples-3.0.283.dist-info → gym_examples-3.0.285.dist-info}/METADATA +1 -1
- gym_examples-3.0.285.dist-info/RECORD +7 -0
- gym_examples-3.0.283.dist-info/RECORD +0 -7
- {gym_examples-3.0.283.dist-info → gym_examples-3.0.285.dist-info}/WHEEL +0 -0
- {gym_examples-3.0.283.dist-info → gym_examples-3.0.285.dist-info}/top_level.txt +0 -0
gym_examples/__init__.py
CHANGED
gym_examples/envs/wsn_env.py
CHANGED
@@ -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 = -
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
-
|
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 =
|
218
|
-
|
219
|
-
|
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
|
@@ -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,,
|
File without changes
|
File without changes
|