LeoRaja commited on
Commit
488df9f
·
verified ·
1 Parent(s): 3063c58

Upload 2 files

Browse files
Files changed (2) hide show
  1. env/delivery_env.py +107 -0
  2. graders/grader.py +3 -0
env/delivery_env.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import random
2
+
3
+ class DeliveryEnv:
4
+
5
+ def __init__(self):
6
+ self.state_data = None
7
+ self.total_reward = 0
8
+ self.done = False
9
+ self.current_time = 0
10
+
11
+ def _generate_orders(self, n):
12
+ return [
13
+ {
14
+ "id": i,
15
+ "location": random.randint(1, 10),
16
+ "prep_time": random.randint(1, 3),
17
+ "deadline": random.randint(6, 15),
18
+ "assigned": False
19
+ }
20
+ for i in range(1, n + 1)
21
+ ]
22
+
23
+ def _generate_riders(self, n):
24
+ return [
25
+ {"id": i, "location": random.randint(0, 5)}
26
+ for i in range(1, n + 1)
27
+ ]
28
+
29
+ def reset(self, task="easy"):
30
+ if task == "easy":
31
+ orders = self._generate_orders(2)
32
+ riders = self._generate_riders(1)
33
+ elif task == "medium":
34
+ orders = self._generate_orders(4)
35
+ riders = self._generate_riders(2)
36
+ else:
37
+ orders = self._generate_orders(6)
38
+ riders = self._generate_riders(2)
39
+
40
+ self.state_data = {
41
+ "orders": orders,
42
+ "riders": riders
43
+ }
44
+
45
+ self.total_reward = 0
46
+ self.done = False
47
+ self.current_time = 0
48
+
49
+ return self.state()
50
+
51
+ def state(self):
52
+ return {
53
+ "time": self.current_time,
54
+ "orders": self.state_data["orders"],
55
+ "riders": self.state_data["riders"]
56
+ }
57
+
58
+ def step(self, action):
59
+ if self.done:
60
+ return self.state(), 0.0, True, {"error": "Episode finished"}
61
+
62
+ try:
63
+ parts = action.split("_")
64
+ order_id = int(parts[1])
65
+ rider_id = int(parts[3])
66
+
67
+ order = next(o for o in self.state_data["orders"] if o["id"] == order_id)
68
+ rider = next(r for r in self.state_data["riders"] if r["id"] == rider_id)
69
+
70
+ if order["assigned"]:
71
+ return self.state(), -1.0, False, {"error": "Already assigned"}
72
+
73
+ # Distance & time
74
+ distance = abs(rider["location"] - order["location"])
75
+ delivery_time = order["prep_time"] + distance
76
+
77
+ self.current_time += delivery_time
78
+
79
+ # 🔥 URGENCY CALCULATION
80
+ urgency = order["deadline"] - self.current_time
81
+
82
+ # 🔥 REWARD COMPONENTS
83
+ if self.current_time <= order["deadline"]:
84
+ base_reward = 1.0
85
+ elif self.current_time <= order["deadline"] + 3:
86
+ base_reward = 0.3
87
+ else:
88
+ base_reward = -0.5
89
+
90
+ urgency_bonus = max(0, (10 - urgency) * 0.1)
91
+ travel_penalty = distance * 0.05
92
+
93
+ reward = base_reward + urgency_bonus - travel_penalty
94
+
95
+ # Update state
96
+ order["assigned"] = True
97
+ rider["location"] = order["location"]
98
+
99
+ self.total_reward += reward
100
+
101
+ done = all(o["assigned"] for o in self.state_data["orders"])
102
+ self.done = done
103
+
104
+ return self.state(), reward, done, {"error": None}
105
+
106
+ except Exception as e:
107
+ return self.state(), -1.0, False, {"error": str(e)}
graders/grader.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ def compute_score(total_reward, max_possible):
2
+ score = total_reward / max_possible
3
+ return max(0.0, min(1.0, score))