from collections import deque visited_states = [] total_moves = 70 expanded = 0 count = 0 class Node: def __init__(self, state, parent, operator, depth, cost): self.state = state self.parent = parent self.operator = operator self.depth = depth self.cost = cost def create_node(state, parent, operator, depth, cost): return Node(state, parent, operator, depth, cost) def expand_node(node): expanded_nodes = [] temp_state = move_down(node.state) temp_node = create_node(temp_state, node, "down", node.depth + 1, node.cost + 1) expanded_nodes.append(temp_node) temp_state1 = move_up(node.state) temp_node1 = create_node(temp_state1, node, "up", node.depth + 1, node.cost + 1) expanded_nodes.append(temp_node1) temp_state2 = move_left(node.state) temp_node2 = create_node(temp_state2, node, "left", node.depth + 1, node.cost + 1) expanded_nodes.append(temp_node2) temp_state3 = move_right(node.state) temp_node3 = create_node(temp_state3, node, "right", node.depth + 1, node.cost + 1) expanded_nodes.append(temp_node3) return expanded_nodes def move_left(state): swap = state.copy() idx = swap.index(0) if (idx == 0 or idx == 3 or idx == 6): return swap else: swap[idx - 1], swap[idx] = swap[idx], swap[idx - 1] return swap def move_right(state): swap = state.copy() idx = swap.index(0) if (idx == 2 or idx == 5 or idx == 8): return swap else: swap[idx + 1], swap[idx] = swap[idx], swap[idx + 1] return swap def move_up(state): swap = state.copy() idx = swap.index(0) if (idx == 0 or idx == 1 or idx == 2): return swap else: swap[idx - 3], swap[idx] = swap[idx], swap[idx - 3] return swap def move_down(state): swap = state.copy() idx = swap.index(0) if (idx == 6 or idx == 7 or idx == 8): return swap else: swap[idx + 3], swap[idx] = swap[idx], swap[idx + 3] return swap def bfs(start, goal): if (start == goal): return [None] else: to_be_expanded = [] current_node = create_node(start, None, None, 0, 0) to_be_expanded.append(current_node) for i in range(total_moves): temp_expanded = [] size = len(to_be_expanded) for j in range(size): if (to_be_expanded[j] in visited_states): continue node_array = expand_node(to_be_expanded[j]) for x in range(4): if (node_array[x].state == goal): count = i + 1 return node_array[x] else: temp_expanded.append(node_array[x]) visited_states.append(node_array[x].state) to_be_expanded.clear() to_be_expanded = temp_expanded.copy() temp_expanded.clear() return None def main(): method = 'bfs' length = 0 x = 0 x = x + 1 board_input = input("Enter the initial state values (comma-separated): ") board_split = board_input.split(',') starting_state = [int(i) for i in board_split] goal_input = input("Enter the goal state values (comma-separated): ") goal_split = goal_input.split(',') goal_state = [int(i) for i in goal_split] if (len(starting_state) == 9 and len(goal_state) == 9): result = bfs(starting_state, goal_state) if result == None: print("No solution found") elif result == [None]: print("Start node was the goal!") else: print("Total number of moves needed =", result.cost) path = [] path.append(result.state) current = result flag = True while flag: parent = current.parent prev_state = parent.state path.append(prev_state) current = parent if (prev_state == starting_state): flag = False path.reverse() print("Step-wise Sequence of states from start to goal is ") for state in path: print(state[0], "|", state[1], "|", state[2]) print(state[3], "|", state[4], "|", state[5]) print(state[6], "|", state[7], "|", state[8]) print() else: print("Invalid input") if __name__ == "__main__": main()
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter