Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. initialState = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
  2. goalState = [1,2,3,4,5,6,7,8,9,10,11,0,13,14,15,12]
  3.  
  4. visited = []
  5.  
  6. ######################################
  7. class Stack:
  8. def __init__(self):
  9. self.items = []
  10. self.children = []
  11.  
  12. def isEmpty(self):
  13. return self.items == []
  14.  
  15. def push(self, item):
  16. self.items.append(item)
  17.  
  18. def pop(self):
  19. return self.items.pop()
  20.  
  21. def peek(self):
  22. return self.items[len(self.items)-1]
  23.  
  24. def size(self):
  25. return len(self.items)
  26. ######################################
  27. def display(s):
  28. i = s
  29. print
  30. print "-------------"
  31. print "|",i[0],"|",i[1],"|",i[2],"|",i[3],"|"
  32. print "-------------"
  33. print "|",i[4],"|",i[5],"|",i[6],"|",i[7],"|"
  34. print "-------------"
  35. print "|",i[8],"|",i[9],"|",i[10],"|",i[11],"| "
  36. print "-------------"
  37. print "|",i[12],"|",i[13],"|",i[14],"|",i[15],"| "
  38. print "-------------"
  39. return
  40. ######################################
  41. def move_down(current_state):
  42. index = 0
  43. for i in xrange(len(current_state)):
  44. if current_state[i] == 0:
  45. index = i
  46. newState = current_state
  47.  
  48. if index not in [12, 13, 14, 15]:
  49. temp = newState[index + 4]
  50. newState[index + 4] = newState[index]
  51. newState[index] = temp
  52. return newState
  53.  
  54. else:
  55. return None
  56.  
  57. ######################################
  58. def move_up(current_state):
  59. index = 0
  60. for i in xrange(len(current_state)):
  61. if current_state[i] == 0:
  62. index = i
  63. newState = current_state
  64.  
  65. if index not in [0, 1, 2, 3]:
  66. temp = newState[index - 4]
  67. newState[index - 4] = newState[index]
  68. newState[index] = temp
  69. return newState
  70.  
  71. else:
  72. return None
  73.  
  74. def check_up(current_state):
  75. index = current_state.index(0)
  76.  
  77. if index not in [0,1,2,3]:
  78. return 1
  79. else:
  80. return 0
  81.  
  82. ######################################
  83. def move_left(current_state):
  84. index = 0
  85. for i in xrange(len(current_state)):
  86. if current_state[i] == 0:
  87. index = i
  88.  
  89. newState = current_state
  90.  
  91. if index not in [0, 4, 8, 12]:
  92. temp = newState[index - 1]
  93. newState[index - 1] = newState[index]
  94. newState[index] = temp
  95. return newState
  96.  
  97. else:
  98. return None
  99.  
  100. ######################################
  101. def move_right(current_state):
  102. index = 0
  103. for i in xrange(len(current_state)):
  104. if current_state[i] == 0:
  105. index = i
  106. newState = current_state
  107.  
  108. if index not in [3, 7, 11, 15]:
  109. temp = newState[index + 1]
  110. newState[index + 1] = newState[index]
  111. newState[index] = temp
  112. return newState
  113.  
  114. else:
  115. return None
  116.  
  117. ######################################
  118. def new_node (current_state, parent, movement):
  119. return Node(current_state, movement)
  120.  
  121. ######################################
  122.  
  123. ######################################
  124. def movement(s):
  125. movement = []
  126. index = 0
  127. for i in xrange(len(s)):
  128. if s[i] == 0:
  129. index = i
  130.  
  131. if index not in [0, 4, 8, 12]:
  132. movement.append("Left")
  133. if index not in [0,1,2,3]:
  134. movement.append("Up")
  135. if index not in [3, 7, 11, 15]:
  136. movement.append("Right")
  137. if index not in [12, 13, 14, 15]:
  138. movement.append("Down")
  139.  
  140.  
  141. return movement
  142. ######################################
  143.  
  144. def possible_movements(s, movement):
  145. children = 0
  146. temp = []
  147. size = len(s)
  148. for i in range(size):
  149. temp.append(s[i])
  150.  
  151. if movement == "Left":
  152. children = move_left(temp)
  153. if movement == "Up":
  154. children = move_up(temp)
  155. if movement == "Right":
  156. children = move_right(temp)
  157. if movement == "Down":
  158. children = move_down(temp)
  159. if movement == None:
  160. children = 0
  161.  
  162. return children
  163.  
  164.  
  165.  
  166. ############################################
  167. def dfs(current_state):
  168. stack = []
  169. visited = []
  170. m = []
  171. actualMove = []
  172. puzzle = current_state
  173. move = movement(puzzle)[::-1]
  174. depth = 0
  175. solved = 0
  176.  
  177.  
  178. visited.append(puzzle)
  179. if puzzle == goalState:
  180. print "Initial State and Goal State are the Same"
  181. solved = 1
  182.  
  183.  
  184. while solved != 1:
  185. #print(depth)
  186.  
  187. #for loop that checks all the possible movements and put them in a stack
  188. for i in xrange(len(move)):
  189. exist = 0
  190. for x in xrange(len(visited)):
  191. if possible_movements(puzzle, move[i]) == visited[x]:
  192. exist = 1
  193. if exist == 1:
  194. stack.append(possible_movements(puzzle, move[i]))
  195. stack.pop()
  196. else:
  197. stack.append(possible_movements(puzzle, move[i]))
  198. m.append(move[i])
  199.  
  200. #increase depth
  201. depth = depth + 1
  202.  
  203. #print "STACK"
  204. #print(stack)
  205. #print "MOVE"
  206. #print(m)
  207. #print "PUZZLE"
  208. #display(puzzle)
  209. #print(actualMove)
  210. #checks if the child is the solution
  211. if stack[len(stack)-1] == goalState:
  212. puzzle = stack[len(stack)-1] #moves to the child
  213. actualMove.append(m.pop()) #mark the movement
  214. display(puzzle) #display board state
  215. display(goalState) #display goal state
  216. print(actualMove) #display move
  217. print "Puzzle Solved in ", len(actualMove) , " steps"
  218. solved = 1
  219.  
  220. #if child is not the solution
  221. else:
  222. puzzle = stack[len(stack)-1] #puzzle becomes the child
  223. move = movement(puzzle)[::-1] #move becomes the movement of the child
  224. visited.append(stack.pop()) #mark the previous state
  225. actualMove.append(m.pop()) #mark the movement
  226. #print "VISITED"
  227. #print(visited)
  228. #print "Movement"
  229. #print(actualMove)
  230.  
  231. #maximum depth reached
  232. if depth == 30:
  233. actualMove.pop()
  234. while stack is not None:
  235. if len(stack) != 0:
  236. actualMove.pop() #remove the last movement
  237. if len(m) == 1:
  238. puzzle = stack.pop() #remove the last movement
  239. visited.append(puzzle) #current location is added to visited
  240. else:
  241. m.pop()
  242. puzzle = stack.pop() #remove the last movement
  243. visited.append(puzzle) #current location is added to visited
  244. #print "DEPTH PUZZLE"
  245. #display(puzzle)
  246. if puzzle == goalState:
  247. actualMove.append(m.pop()) #mark the movement
  248. print "SOLVED"
  249. display(puzzle)
  250. display(goalState)
  251. print(actualMove)
  252. return
  253. else:
  254. print "Solution too deep"
  255. return
  256.  
  257. def make_stack(current_state):
  258. stack = Stack()
  259. child = []
  260. puzzle = current_state
  261. move = movement(puzzle)[::-1]
  262. stack.push(current_state)
  263.  
  264. for i in xrange(len(move)):
  265. exist = 0
  266. for x in xrange(len(visited)):
  267. if possible_movements(puzzle, move[i]) == visited[x]:
  268. exist = 1
  269. if exist == 1:
  270. child.append(possible_movements(puzzle, move[i]))
  271. child.pop()
  272. else:
  273. child.append(possible_movements(puzzle, move[i]))
  274.  
  275. stack.children = child
  276. return stack
  277.  
  278.  
  279. def dfs_trial(current_state):
  280. puzzle = current_state
  281. temp = make_stack(puzzle)
  282. stack = []
  283. stack.append(temp.peek())
  284. depth = 0
  285.  
  286. puzzle = stack[len(stack)-1]
  287. visited.append(puzzle)
  288. display(puzzle)
  289.  
  290. while initialState != goalState:
  291. #print stack[len(stack)-1], " is getting Popped"
  292. stack.pop()
  293. for i in xrange(len(temp.children)):
  294. stack.append(temp.children[i])
  295.  
  296. puzzle = stack[len(stack)-1]
  297. visited.append(puzzle)
  298.  
  299. #print "STACK"
  300. #print(stack)
  301.  
  302. temp = make_stack(puzzle)
  303.  
  304. #print "Current Node Stack"
  305. #print(temp.peek())
  306.  
  307. #print "Children Stack"
  308. #print(temp.children)
  309.  
  310. depth = depth + 1
  311. if puzzle == goalState:
  312. print "Puzzle Solved"
  313. print "Solved in " ,depth, "steps"
  314. display(puzzle)
  315. display(goalState)
  316. return
  317.  
  318. if depth == 1000:
  319. while stack is not None:
  320. depth = depth - 1
  321. stack.pop()
  322. puzzle = stack[len(stack)-1]
  323. visited.append(puzzle)
  324. if puzzle == goalState:
  325. print "Puzzle Solved"
  326. print "Solved in " ,depth, "steps"
  327. display(puzzle)
  328. display(goalState)
  329. return
  330.  
  331.  
  332.  
  333.  
  334. ############################################
  335. #display(initialState)
  336. #dfs(initialState)
  337. dfs_trial(initialState)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement