Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1.  
  2. initialState = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]
  3. goalState = [2,3,4,0,1,6,7,8,5,10,11,12,9,13,14,15]
  4.  
  5. ######################################
  6. class Queue:
  7. def __init__(self):
  8. self.in_stack = []
  9. self.out_stack = []
  10.  
  11. def enqueue(self, obj):
  12. self.in_stack.append(obj)
  13.  
  14. def pop(self):
  15. if not self.out_stack:
  16. self.in_stack.reverse()
  17. self.out_stack = self.in_stack
  18. self.in_stack = []
  19. return self.out_stack.pop()
  20.  
  21. def printQ(self):
  22. display(self.in_stack[0])
  23.  
  24. def first(self):
  25. return self.in_stack[0]
  26. '''
  27. def printAll(self):
  28. for i in xrange(len(self.in_stack))
  29. display(self.in_stack[i])
  30. '''
  31. ######################################
  32. class Node(object):
  33. def __init__(self, data=None, next_node=None):
  34. self.data = data
  35. self.next_node = next_node
  36.  
  37. def get_data(self):
  38. return self.data
  39.  
  40. def get_next(self):
  41. return self.next_node
  42.  
  43. def set_next(self, new_next):
  44. self.next_node = new_next
  45.  
  46. ######################################
  47. def display(s):
  48. i = s
  49. print
  50. print "-------------"
  51. print "|",i[0],"|",i[1],"|",i[2],"|",i[3],"|"
  52. print "-------------"
  53. print "|",i[4],"|",i[5],"|",i[6],"|",i[7],"|"
  54. print "-------------"
  55. print "|",i[8],"|",i[9],"|",i[10],"|",i[11],"| "
  56. print "-------------"
  57. print "|",i[12],"|",i[13],"|",i[14],"|",i[15],"| "
  58. print "-------------"
  59. return
  60. ######################################
  61. def move_down(current_state):
  62. index = 0
  63. for i in xrange(len(current_state)):
  64. if current_state[i] == 0:
  65. index = i
  66. newState = current_state
  67.  
  68. if index not in [12, 13, 14, 15]:
  69. temp = newState[index + 4]
  70. newState[index + 4] = newState[index]
  71. newState[index] = temp
  72. return newState
  73.  
  74. else:
  75. return None
  76.  
  77. ######################################
  78. def move_up(current_state):
  79. index = 0
  80. for i in xrange(len(current_state)):
  81. if current_state[i] == 0:
  82. index = i
  83. newState = current_state
  84.  
  85. if index not in [0, 1, 2, 3]:
  86. temp = newState[index - 4]
  87. newState[index - 4] = newState[index]
  88. newState[index] = temp
  89. return newState
  90.  
  91. else:
  92. return None
  93.  
  94. def check_up(current_state):
  95. index = current_state.index(0)
  96.  
  97. if index not in [0,1,2,3]:
  98. return 1
  99. else:
  100. return 0
  101.  
  102. ######################################
  103. def move_left(current_state):
  104. index = 0
  105. for i in xrange(len(current_state)):
  106. if current_state[i] == 0:
  107. index = i
  108.  
  109. newState = current_state
  110.  
  111. if index not in [0, 4, 8, 12]:
  112. temp = newState[index - 1]
  113. newState[index - 1] = newState[index]
  114. newState[index] = temp
  115. return newState
  116.  
  117. else:
  118. return None
  119.  
  120. ######################################
  121. def move_right(current_state):
  122. index = 0
  123. for i in xrange(len(current_state)):
  124. if current_state[i] == 0:
  125. index = i
  126. newState = current_state
  127.  
  128. if index not in [3, 7, 11, 15]:
  129. temp = newState[index + 1]
  130. newState[index + 1] = newState[index]
  131. newState[index] = temp
  132. return newState
  133.  
  134. else:
  135. return None
  136.  
  137. ######################################
  138. def new_node (current_state, parent, movement):
  139. return Node(current_state, movement)
  140.  
  141. ######################################
  142. def movement(s):
  143. movement = []
  144. index = 0
  145. for i in xrange(len(s)):
  146. if s[i] == 0:
  147. index = i
  148.  
  149. if index not in [0, 4, 8, 12]:
  150. movement.append("Left")
  151. if index not in [0,1,2,3]:
  152. movement.append("Up")
  153. if index not in [3, 7, 11, 15]:
  154. movement.append("Right")
  155. if index not in [12, 13, 14, 15]:
  156. movement.append("Down")
  157.  
  158.  
  159. return movement
  160. ######################################
  161.  
  162. def possible_movements(s, movement):
  163. children = 0
  164. temp = []
  165. size = len(s)
  166. for i in xrange(size):
  167. temp.append(s[i])
  168.  
  169. if movement == "Left":
  170. children = move_left(temp)
  171. if movement == "Up":
  172. children = move_up(temp)
  173. if movement == "Right":
  174. children = move_right(temp)
  175. if movement == "Down":
  176. children = move_down(temp)
  177.  
  178.  
  179. return children
  180.  
  181.  
  182.  
  183. ############################################
  184. def dfs(current_state, goal_state):
  185. stack = []
  186. visited = []
  187. m = []
  188. puzzle = current_state
  189. move = movement(puzzle)[::-1]
  190. size = 0
  191. depth = 0
  192. solved = 0
  193.  
  194. visited.append(puzzle)
  195. if puzzle == goal_state:
  196. print "Initial State and Goal State are the Same"
  197. solved = 1
  198.  
  199.  
  200. while solved != 1:
  201.  
  202. for i in xrange(len(move)):
  203. exist = 0
  204. for x in xrange(len(visited)):
  205. if possible_movements(puzzle, move[i]) == visited[x]:
  206. exist = 1
  207. if exist == 1:
  208. stack.append(possible_movements(puzzle, move[i]))
  209. stack.pop()
  210. else:
  211. stack.append(possible_movements(puzzle, move[i]))
  212.  
  213.  
  214.  
  215. depth = depth + 1
  216.  
  217. size = len(stack)
  218. #print "STACK"
  219. #print(stack)
  220. #print "MOVE"
  221. #print(m)
  222. if stack[size-1] == goalState:
  223. puzzle = stack[size-1]
  224. print "Puzzle Solved"
  225. display(puzzle)
  226. display(goalState)
  227. solved = 1
  228. else:
  229. puzzle = stack[size-1]
  230. move = movement(puzzle)[::-1]
  231. visited.append(stack.pop())
  232. #print "VISITED"
  233. #print(visited)
  234. if depth > 1000:
  235. print "Solution is too far"
  236. solved = 1
  237.  
  238. ############################################
  239.  
  240. def bfs(current_state, goal_state):
  241. q = Queue()
  242. q.enqueue(current_state)
  243. puzzle = current_state
  244. move = movement(puzzle)[::-1]
  245. visited = []
  246.  
  247. while q.first() != goal_state:
  248.  
  249. for i in xrange(len(move)):
  250. exist = 0
  251. for x in xrange(len(visited)):
  252. if possible_movements(puzzle, move[i]) == visited[x]:
  253. exist = 1
  254. if exist == 1:
  255. q.enqueue(possible_movements(puzzle, move[i]))
  256. q.pop()
  257. else:
  258. q.enqueue(possible_movements(puzzle, move[i]))
  259.  
  260.  
  261. ############################################
  262. #display(initialState)
  263. #dfs(initialState, goalState)
  264. l= Queue()
  265. l.enqueue(initialState)
  266. l.printQ()
  267. #l.printAll()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement