def getChild(self, node, action, heuristic='off'): IJ0 = self.findZero(node.state) I0 = IJ0[0] J0 = IJ0[1] s = node.state newState = [[0 for i in range(3)] for j in range(3)] for i in range(3): for j in range(3): newState[i][j] = s[i][j] if action == 'r': newState[I0][J0] = newState[I0][J0 + 1] newState[I0][J0 + 1] = 0 elif action == 'l': newState[I0][J0] = newState[I0][J0 - 1] newState[I0][J0 - 1] = 0 elif action == 'u': newState[I0][J0] = newState[I0 - 1][J0] newState[I0 - 1][J0] = 0 elif action == 'd': newState[I0][J0] = newState[I0 + 1][J0] newState[I0 + 1][J0] = 0 if heuristic == 'off': child = Node.Node(newState, node.pathCost + 1, node, action) elif heuristic == 'on': child = Node.AStarNode(newState, node.pathCost + 1, node, action) return child
def run(self, problem): node = Node.AStarNode(problem.initialState, 0, 0, '') self.numOfCreatedNodes += 1 heapq.heappush(self.frontier, node) self.explored = [] while True: if len(self.frontier) == 0: return False self.maxNodesInMemory = max( len(self.frontier) + len(self.explored), self.maxNodesInMemory) node = heapq.heappop(self.frontier) if problem.goalTest(node.state): return self.solution(node) self.explored.append(node) actions = problem.actions(node.state) for action in actions: child = problem.getChild(node, action) self.numOfCreatedNodes += 1 if self.isNotVisited(child): heapq.heappush(self.frontier, child)