Я пытаюсь изменить существующую функцию Hill-climb, которая принимает два имени узла (например, A и E) и имеет необязательный параметр, который используется рекурсивно (очередь). Я пытаюсь определить функцию «дешевле», которая оценивает, дешевле ли один путь, чем другой. Кроме того, вместо одного целевого узла я пытаюсь передать список целевых узлов, которые функция, достигнув одного из этих узлов, перестает оценивать.
Проблема в том, что моя функция не вернет ничего, кроме начального узла, который я ввел, и пустого списка.
Вот моя сеть/график и связанные с этим расходы:
(setf (get 's 'coordinates) '(0 3)
(get 'a 'coordinates) '(4 6)
(get 'b 'coordinates) '(7 6)
(get 'c 'coordinates) '(11 9)
(get 'd 'coordinates) '(2 0)
(get 'e 'coordinates) '(9 2)
(get 'f 'coordinates) '(11 3))
(setf (get 's 'cost) 0
(get 'a 'cost) 16
(get 'b 'cost) 4
(get 'c 'cost) 10
(get 'd 'cost) 5
(get 'e 'cost) 12
(get 'f 'cost) 14)
А вот моя модифицированная функция подъема в гору:
(defun hill-climb (start finish &optional (queue (list (list start))))
(cond ((endp queue) nil)
((member (first (first queue)) finish)
(reverse (first queue)))
(t (hill-climb start finish (append (sort (extend (first queue))
#'(lambda (p1 p2)
(cheaper p1 p2
finish)))
(rest queue))))))
Наконец, вот функции «стоимость» и «дешевле»:
(defun cost (path)
(apply '+ (mapcar #'(lambda (x) (get x 'cost)) path)))
(defun cheaper (p1 p2)
(< (cost p1)
(cost p2)))
РЕДАКТИРОВАТЬ: Извините, а вот «расширить»:
(defun extend (path)
(print (reverse path))
(mapcar #'(lambda (new-node) (cons new-node path))
(remove-if #'(lambda (neighbor) (member neighbor path))
(get (first path) 'neighbors))))
extend
? Обратите внимание, что вы передаете неправильное количество аргументов вcheaper
. Кроме того, использование одиночных связанных списков в качестве очередей, вероятно, не лучшая идея. - person danlei   schedule 11.10.2011neighbors
? Планировали ли вы добавить это свойство на отдельном шаге? Я не знаю ваших спецификаций, но я бы хотел, чтобы сосед был +/- 1 для каждой координаты (?). Кроме того, поскольку это домашнее задание, пожалуйста, отметьте его как таковое. - person danlei   schedule 11.10.2011