class Intersection: def __init__(self, length, prob, keepalive, wait_weight): self.NSRoad = Road(length,prob) self.EWRoad = Road(length,prob) self.keepalive = keepalive self.total_reward = 0 self.length = length self.prob = prob self.end = False self.wait_weight = wait_weight def getState(self): temp = np.array([np.array(self.NSRoad.binaryRepresentation()), np.array(self.EWRoad.binaryRepresentation())]) return temp def newInstance(self): self.NSRoad = Road(self.length, self.prob) self.EWRoad = Road(self.length, self.prob) self.end = False self.total_reward = 0 def getReward(self): return self.total_reward def gameEnd(self): return self.end def step(self,NS_action, EW_action): NSoutput = self.NSRoad.step(NS_action) EWoutput = self.EWRoad.step(EW_action) step_reward = 0 if (NSoutput[1][0] == 1) and (EWoutput[1][0] == 1): self.NSRoad.crash() self.EWRoad.crash() self.total_reward -= 100 self.end = True return -100 if (NSoutput[0][0] == 1): step_reward += 15 if (EWoutput[0][0] == 1): step_reward += 15 wait_penalty = self.wait_weight * (self.NSRoad.totalWait() + self.EWRoad.totalWait()) step_reward += (self.keepalive - wait_penalty) self.total_reward += step_reward return step_reward
class Intersection: def __init__(self, length, prob, keepalive, wait_weight): self.NSRoad = Road(length, prob) self.EWRoad = Road(length, prob) self.NSwait = 0 self.EWwait = 0 self.passedCars = 0 self.keepalive = keepalive self.total_reward = 0 self.length = length self.prob = prob self.end = False self.wait_weight = wait_weight self.numSteps = 0 def getState(self): temp = np.array([ self.NSRoad.binaryRepresentation(), self.NSRoad.carRepresentation(), self.EWRoad.binaryRepresentation(), self.EWRoad.carRepresentation() ]) return temp def getBinary(self): state = [] temp = self.NSRoad.binaryRepresentation() for i in range(0, 4): state.append(temp[i]) temp = self.EWRoad.binaryRepresentation() for i in range(0, 4): state.append(temp[i]) state.append((self.NSwait + self.EWwait)) return np.array(state) def newInstance(self): self.NSRoad = Road(self.length, self.prob) self.EWRoad = Road(self.length, self.prob) self.end = False self.passedCars = 0 self.total_reward = 0 def getReward(self): return self.total_reward def gameEnd(self): return self.end def gameWait(self): print("Wait NS: " + str(self.NSRoad.totalWait())) print("Wait EW: " + str(self.EWRoad.totalWait())) def step(self, NS_action, EW_action): if (NS_action == 1): self.NSwait += 1 else: self.NSwait = 0 if (EW_action == 1): self.EWwait += 1 else: self.EWwait = 0 #self.numSteps += 1 NSoutput = self.NSRoad.step(NS_action) EWoutput = self.EWRoad.step(EW_action) step_reward = 0 if ((NSoutput[1][0] == 1) and (EWoutput[1][0] == 1)) or ( (self.NSwait + self.EWwait) > 10) or (self.total_reward < -200): self.NSRoad.crash() self.EWRoad.crash() self.total_reward -= 100 self.end = True return -100 if (NSoutput[0][0] == 1): step_reward += 20 self.passedCars += 1 if (EWoutput[0][0] == 1): step_reward += 20 self.passedCars += 1 wait_penalty = self.wait_weight * (self.NSwait + self.EWwait) step_reward += (self.keepalive - wait_penalty) self.total_reward += step_reward return step_reward