kritikaxai commited on
Commit
9a2e68f
·
verified ·
1 Parent(s): 3b6213d

Update environment.py

Browse files
Files changed (1) hide show
  1. environment.py +64 -69
environment.py CHANGED
@@ -1,70 +1,65 @@
1
- import asyncio
2
- import math
3
- import random
4
- from models import State
5
-
6
- class CloudCostEnv:
7
- def __init__(self, task="medium"):
8
- self.task = task
9
- self.reset_vars()
10
-
11
- def reset_vars(self):
12
- self.steps = 0
13
- self.servers = 5
14
- self.is_spot = False
15
-
16
- async def reset(self):
17
- self.reset_vars()
18
- return self.get_current_state()
19
-
20
- def get_current_state(self):
21
- # This simulates traffic based on the "Task" (Easy/Medium/Hard)
22
- if self.task == "easy":
23
- load = 450
24
- else:
25
- # Sine wave simulates day/night traffic peaks
26
- load = int(500 + 350 * math.sin(self.steps / 5))
27
-
28
- # Physics: More servers = lower latency. Load > Servers = high latency.
29
- capacity = self.servers * 100
30
- latency = max(20, (load / (capacity + 1)) * 150)
31
-
32
- # Cost: Spot is 75% cheaper than On-Demand
33
- base_rate = 0.60
34
- current_rate = base_rate * 0.25 if self.is_spot else base_rate
35
- cost = self.servers * current_rate
36
-
37
- return State(
38
- cpu_usage=min(100.0, (load / (capacity + 1)) * 100),
39
- active_servers=self.servers,
40
- hourly_burn_rate=round(cost, 2),
41
- response_latency=round(latency, 2),
42
- incoming_load=load
43
- )
44
-
45
- async def step(self, action_int):
46
- # Apply the action from the AI
47
- if action_int == 1:
48
- self.servers += 1
49
- elif action_int == 2:
50
- self.servers = max(1, self.servers - 1)
51
- elif action_int == 3:
52
- self.is_spot = not self.is_spot
53
-
54
- self.steps += 1
55
- state = self.get_current_state()
56
-
57
- # Calculate Reward (The Score)
58
- reward = 1.0
59
- if state.response_latency > 150: reward -= 0.7 # Penalty for being slow
60
- if state.hourly_burn_rate > 5.0: reward -= 0.5 # Penalty for overspending
61
-
62
- # Episode ends after 20 steps for the grader
63
- done = self.steps >= 20
64
- return state, reward, done
65
-
66
- async def state(self):
67
- return self.get_current_state()
68
-
69
- async def close(self):
70
  pass
 
1
+ import asyncio
2
+ import math
3
+ import random
4
+ from models import State
5
+
6
+ class CloudCostEnv:
7
+ def __init__(self, task="medium"):
8
+ self.task = task
9
+ self.reset_vars()
10
+
11
+ def reset_vars(self):
12
+ self.steps = 0
13
+ self.servers = 5
14
+ self.is_spot = False
15
+
16
+ def reset(self):
17
+ self.reset_vars()
18
+ return self.get_current_state()
19
+
20
+ def get_current_state(self):
21
+ if self.task == "easy":
22
+ load = 450
23
+ elif self.task == "hard":
24
+ load = int(500 + 350 * math.sin(self.steps / 2)) + random.randint(-100, 100)
25
+ else: # medium
26
+ load = int(500 + 350 * math.sin(self.steps / 5))
27
+
28
+ capacity = self.servers * 100
29
+ latency = max(20, (load / (capacity + 1)) * 150)
30
+
31
+ base_rate = 0.60
32
+ current_rate = base_rate * 0.25 if self.is_spot else base_rate
33
+ cost = self.servers * current_rate
34
+
35
+ return State(
36
+ cpu_usage=min(100.0, (load / (capacity + 1)) * 100),
37
+ active_servers=self.servers,
38
+ hourly_burn_rate=round(cost, 2),
39
+ response_latency=round(latency, 2),
40
+ incoming_load=load
41
+ )
42
+
43
+ async def step(self, action_int):
44
+ if action_int == 1:
45
+ self.servers += 1
46
+ elif action_int == 2:
47
+ self.servers = max(1, self.servers - 1)
48
+ elif action_int == 3:
49
+ self.is_spot = not self.is_spot
50
+
51
+ self.steps += 1
52
+ state = self.get_current_state()
53
+
54
+ reward = 1.0
55
+ if state.response_latency > 150: reward -= 0.7
56
+ if state.hourly_burn_rate > 5.0: reward -= 0.5
57
+
58
+ done = self.steps >= 20
59
+ return state, reward, done
60
+
61
+ async def state(self):
62
+ return self.get_current_state()
63
+
64
+ async def close(self):
 
 
 
 
 
65
  pass