class Environment: def __init__(self,state): self.loc1_ = 'A' self.loc2_ = 'B' self.state_ = state #state: ['D','D'] etc. def __str__(self): return 'Environment created with {} and {} in a state of {}'.format(self.loc1_,self.loc2_,self.state_) def __repr__(self): return f'Environment(state={self.state_},{self.loc1_},{self.loc2_})' def getloc1(self): return self.loc1_ def getloc2(self): return self.loc2_ def getstate(self): return self.state_ def getloc1_state(self): return self.state_[0] def getloc2_state(self): return self.state_[1] def setloc1_state(self,state): #state='D' self.state_[0] = state def setloc2_state(self,state): #state='D' self.state_[1] = state def changestate(self,loc,state): try: if loc == 'A': self.setloc1_state(state) if loc == 'B': self.getloc2_state(state) except ValueError: print('Invalid location provided. Can only be A or B') class Agent: def __init__(self,percept:list,location:'str',action:'str'='N',goal:list=['C','C']): self.percept_ = percept self.cost_ = 0 self.location_ = location self.action_ = action self.goal_ = goal def __str__(self): return 'Agent with percept: {}, location: {}, goal: {} and cost: {}'.format(self.percept_,self.location_,self.goal_,self.cost_) def __repr__(self): return f'Agent(percept={self.percept_},location={self.location_},action={self.action_},goal={self.goal_})' def setpercept(self,percept): self.percept_ = percept def getpercept(self): return self.percept def setlocation(self,location): self.location_ = location def getlocation(self): return self.location_ def setcost(self,cost): self.cost_ += cost def getcost(self): return self.cost_ def goaltest(self,state): if isinstance(state,list): return isin(goal,state) else: return self.goal_ == state return false def suck(self): place = self.getlocation() if place == 'A': Environment.setloc1_state(self,'C') if place == 'B': Environment.setloc2_state('C') def move(self,direction): if direction == 'L': self.setlocation('A') if direction == 'R': self.setlocation('B') def lookup_action(self,state:list): #print('STATE: ',state) place = self.getlocation() #current_state = state.insert(0,place) current_state = state table={ tuple(['A','D','D']):'S', tuple(['A','D','C']):'S', tuple(['A','C','D']):'R', tuple(['A','C','C']):'N', tuple(['B','D','D']):'S', tuple(['B','D','C']):'L', tuple(['B','C','D']):'S', tuple(['B','C','C']):'N' } return table[tuple(current_state)] def execute_action(self,percept): place = self.getlocation() #print('1: PLACE: ',place) #print('1A: PERCEPT: ',percept) state = percept #state.append(percept) state.insert(0,place)#percept.insert(0,place) print('2: #####################################################STATE: ',state) action = self.lookup_action(state) if action == 'S': self.suck() self.setcost(1) else: self.move(action) def main(): init_state = ['D','D'] house = Environment(init_state) print(house) vacuum = Agent(percept=house.getstate(),location='A') print(vacuum) while house.getstate() != ['C','C']: vacuum.execute_action(house.getstate()) print(house.getstate()) main()