class SelfDrivingCar: def __init__(self): self.gui = GUI(self.run) self.env = self.gui.env self.sensors = Sensors(self.env.mainCar, self.env) self.actuators = Actuators(self.env.mainCar) self.car = LearnerCar(self.actuators, self.sensors) self.guiPerEpisode = int(RESULT_PER_EPISODE) if self.guiPerEpisode <= 0: self.guiPerEpisode = EPISODES_OF_LEARNING + 1 self.episodes = 1 self.gui.run() def run(self): while self.episodes != EPISODES_OF_LEARNING + EPISODES_OF_TESTING: if self.episodes > EPISODES_OF_LEARNING: self.car.turnOffLearning() print "testing episode", self.episodes - EPISODES_OF_LEARNING, ":" else: print "learning episode", self.episodes, ":" delayTime = 0 if (self.episodes > EPISODES_OF_LEARNING) or (self.episodes % self.guiPerEpisode == 0): self.gui.turnOn() delayTime = 0.05 else: self.gui.turnOff() self.env.mainCar.reset() clocks = 0 while clocks < TIME_OUT: if self.env.mainCar.queue.isEmpty(): state = self.car.getState() action = self.car.policy(state) self.car.commit(action) nextState = self.car.getState() reward = self.car.getReward(state, action, nextState) self.car.update(state, action, nextState, reward) print " iteration", clocks print "\tstate:", state print "\taction:", action print "\tnextstate:", nextState print "\treward:", reward, "\n" clocks += 1 if self.car.sensors.isHit(): print "Car hit" break if self.car.sensors.isInDestination(): print "Car reached the goal!" break if delayTime > 0: time.sleep(delayTime) self.env.checkCollision() self.gui.update() if clocks == TIME_OUT: print 'Time out occurred' self.episodes += 1 self.gui.window.destroy() sys.exit()