add1ctus

Pizza Delivery

Jan 9th, 2017
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 4.59 KB | None | 0 0
  1. ; read input
  2. (defun read-input(p)
  3. (cond
  4.     ((null p) nil)
  5.     (T (cons p (read-input (read nil nil))))
  6. )
  7. )
  8.  
  9. (defun readinput(i)
  10.     (cdr (read-input 1))
  11. )  
  12.  
  13. (defun heuristic (state)
  14.   (declare (special *goal*))
  15.   (heuristic-eval state *goal*)
  16. )
  17. (defun heuristic-eval (state goal)
  18.     (+ 1 (manhattan state goal))
  19. )
  20.  
  21. (defun manhattan (state goal)
  22.     (+ (abs (- (nth 0 state) (nth 0 goal))) (abs (- (nth 1 state) (nth 1 goal))) )  
  23. )
  24.  
  25.  
  26. (defun run-best (start goal)
  27. (declare (special *goal*)       ;state
  28.          (special *open*)       ;list of state-tuples
  29.          (special *closed*)     ;list of state-tuples
  30. )
  31.          (setq *goal* goal)
  32.          (setq *open* (list (build-record start nil 0
  33.                       (heuristic start))))     
  34.          (setq *closed* nil)
  35.          (best-first)
  36. )
  37.  
  38.  
  39.  
  40.  
  41. (defun build-record (state parent depth weight)
  42. ;;returns state-tuple
  43.     (list state parent depth weight)
  44. )
  45. (defun insert (item sorted-list)
  46. ;;returns list of state-tuples
  47.   (cond
  48.      ((null sorted-list) (list item))
  49.      ((< (get-weight item) (get-weight (car sorted-list)))
  50.          (cons item sorted-list))
  51.      (T (cons (car sorted-list)
  52.               (insert item (cdr sorted-list))))
  53.   )
  54. )
  55.  
  56. (defun insert-by-weight (childrens sorted-list)
  57. ;;returns list of state-tuples
  58.   (cond
  59.      ((null childrens) sorted-list)
  60.      (T (insert (car childrens)
  61.         (insert-by-weight (cdr childrens) sorted-list)))
  62.   )
  63. )
  64.  
  65.  
  66. (defun get-state (state-tuple) (nth 0 state-tuple))
  67.  
  68. (defun get-parent (state-tuple) (nth 1 state-tuple))
  69.  
  70. (defun get-depth ( state-tuple )  
  71.     (nth 2 state-tuple)
  72. )
  73. (defun get-weight ( state-tuple )  
  74.     (nth 3 state-tuple)
  75. )
  76.  
  77.  
  78. (defun retrieve-by-state (state list)
  79.   (cond ((null list) nil)
  80.         ((equal state (get-state (car list))) (car list))
  81.         (t (retrieve-by-state state (cdr list)))))
  82.  
  83.  
  84.  
  85. (defun best-first ()
  86.   (declare (special *goal*)
  87.            (special *open*)
  88.            (special *closed*)
  89.            (special *moves*))
  90.   ;(print "open =") (print *open*)
  91.   ;(print "closed =") (print *closed*)
  92.   (cond ((null *open*) nil)
  93.         (t (let
  94.            ((state (car *open*)))
  95.            (setq *closed* (cons state *closed*))
  96.            (cond ((equal (get-state state) *goal*)
  97.                          (reverse (build-solution *goal*)))
  98.                   (t (setq *open*
  99.                           (insert-by-weight
  100.                           (generate-descendants (get-state state)
  101.                                  (+ 1 (get-depth state)) *moves*)
  102.                           (cdr *open*))
  103.                       )
  104.                       (best-first))))))
  105. )
  106.  
  107.  
  108. (defun generate-descendants (state depth moves)
  109. ;;returns the descendants of state in a list of state-tuples
  110. (declare (special *closed*)
  111.          (special *open*))
  112. (cond
  113.    ((null moves) nil)
  114.    (t (let ((child (funcall (car moves) state))
  115.       (rest (generate-descendants state depth (cdr moves))))
  116.       (cond ((null child) rest)
  117.             ((retrieve-by-state child rest) rest)
  118.             ((retrieve-by-state child *open*) rest)
  119.             ((retrieve-by-state child *closed*) rest)
  120.             (t (cons (build-record child state depth
  121.                             (+ depth (heuristic child))
  122.                )
  123.                  rest
  124.            )
  125. ))))))
  126.  
  127.  
  128.  
  129. (defun build-solution (state)
  130.   (declare (special *closed*))
  131.   (cond ((null state) nil)
  132.         (t (cons state (build-solution
  133.                         (get-parent
  134.                          (retrieve-by-state state *closed*)))))))
  135.  
  136.  
  137. (defvar *initial* (car (readinput nil)))
  138. ;--don't change above this line
  139.  
  140. (defun safe(state)
  141.     (cond
  142.         ( ( < (nth 0 state) 1) nil )
  143.         ( ( < (nth 1 state) 1) nil )
  144.         ( ( > (nth 0 state) 4) nil )
  145.         ( ( > (nth 1 state) 4) nil )
  146.         ( T state )
  147.     )
  148. )
  149.  
  150. (defun move1 (state)
  151.     (safe (list (nth 0 state) (- (nth 1 state) 1)))    
  152. )
  153.  
  154. (defun move2 (state)
  155.     (safe (list (nth 0 state) (+ (nth 1 state) 1)))    
  156. )
  157.  
  158. (defun move3 (state)
  159.     (safe (list (- (nth 0 state) 1) (nth 1 state)))    
  160. )
  161.  
  162. (defun move4 (state)
  163.     (safe (list (+ (nth 0 state) 1) (nth 1 state)))    
  164. )
  165.  
  166.  
  167. ;write your function(s) here. modify heuristic function above
  168. (defvar *moves* '(move1 move2 move3 move4))
  169.  
  170. (defvar *solution* (list (car *initial*)))
  171.  
  172. (defun addtosolution (steps)
  173.     (setq *solution* (append *solution* (cdr steps)))
  174. )
  175.  
  176. (defun solve(prevstate goalstates)
  177.     (if (not (null goalstates)) (progn (addtosolution(run-best prevstate (car goalstates))) (solve (car goalstates) (cdr goalstates)) ) )
  178. )
  179.  
  180. (solve (car *initial*) (cadr *initial*))
  181. (print *solution*)
Add Comment
Please, Sign In to add comment