Spaces:
Sleeping
Sleeping
| class EmergencyEnv: | |
| def __init__(self, difficulty="easy"): | |
| self.difficulty = difficulty | |
| self.grid_size = 5 | |
| self.reset() | |
| def reset(self): | |
| self.agent = [0, 0] | |
| self.resources = 3 | |
| if self.difficulty == "easy": | |
| self.requests = [ | |
| {"pos": [4, 4], "priority": "normal"} | |
| ] | |
| self.time_left = 20 | |
| elif self.difficulty == "medium": | |
| self.requests = [ | |
| {"pos": [4, 4], "priority": "critical"}, | |
| {"pos": [2, 3], "priority": "normal"} | |
| ] | |
| self.time_left = 30 | |
| else: | |
| self.requests = [ | |
| {"pos": [4, 4], "priority": "critical"}, | |
| {"pos": [2, 3], "priority": "critical"}, | |
| {"pos": [1, 4], "priority": "normal"} | |
| ] | |
| self.time_left = 40 | |
| return self.get_state() | |
| def get_state(self): | |
| return { | |
| "agent": self.agent, | |
| "requests": self.requests, | |
| "num_requests": len(self.requests), | |
| "resources_left": self.resources, | |
| "time_left": self.time_left | |
| } | |
| def step(self, action): | |
| reward = -0.5 # reduced penalty | |
| done = False | |
| # movement | |
| if action == 0: self.agent[0] -= 1 | |
| elif action == 1: self.agent[0] += 1 | |
| elif action == 2: self.agent[1] -= 1 | |
| elif action == 3: self.agent[1] += 1 | |
| # boundary | |
| self.agent[0] = max(0, min(4, self.agent[0])) | |
| self.agent[1] = max(0, min(4, self.agent[1])) | |
| # allocation | |
| if action == 4 and self.resources > 0: | |
| for req in self.requests: | |
| if self.agent == req["pos"]: | |
| reward += 20 if req["priority"] == "critical" else 10 | |
| self.requests.remove(req) | |
| self.resources -= 1 | |
| break | |
| self.time_left -= 1 | |
| if self.time_left <= 0: | |
| reward -= 20 | |
| done = True | |
| if len(self.requests) == 0: | |
| reward += 30 | |
| done = True | |
| return self.get_state(), reward, done, {} |