Тема: DMS кажется Вы сможете помочь (спасите)или те кто понимает в Лисп

Помогите усовершенствовать программу для задачи коммивояжера: она должна еще возвращать длину маршрута, который должен быть самым коротким.  Кроме того, должны быть посещены все города. Я в Лиспе почти ничего не понимаю, поэтому очень прошу написать решение!!!
Дано множество городов: программа ищет маршрут между двумя  произвольными городами (но не возвращается  в исходный город, а это условие задачи коммивояжера):
Продукции, соответствующие пространству поиска:
(setq *продукции*
‘((Хельсинки Стокгольм)
(Хельсинки Таллинн)
(Хельсинки Ленинград)
(Стокгольм Хельсинки)
(Таллинн Хельсинки)
(Ленинград Выборг)
(Выборг Хельсинки)))
Функция  маршрут ищет путь между двумя городами:
(defun маршрут (начало конец порядок)
(поиск конец
(применимы начало)
(list начало)  порядок))
Функция применимы возвращает продукции, применимые в данной ситуации:
(defun применимы (состояние)
(mapcan # ‘(lambda (правило)
(if (eq состояние (car правило))
(list правило) nil))
*продукции*))
Функция поиск имеет параметры:
Цель-искомое конечное состояние;
План-потенциально применимые в данный момент продукции;
Решение-содержит искомый путь;
Порядок-определяет способ поиска;
(defun поиск (конец план решение порядок)
(cond ((null план) nil)
((eq конец (second (car план)))
(reverse (cons конец решение)))
((member (second (car план)) решение)
(поиск конец (cdr план)
решение порядок))
((поиск конец (funcall порядок план)
(cons (second (car план)) решение)  порядок))
(t (поиск конец (cdr план)  решение порядок))))
Поиск по наилучшему варианту ( здесь используется критерий  широта, а у коммивояжера должен быть ближайший город):
(defun наилучший (план)
(sort (append (применимы ( car план))
    (cdr план))
#’критерий))
((defun критерий (x y)
(>= (get (second x) ‘широта)
       (get (second y) ‘широта)))
(setf (get ‘Хельсинки ‘широта) 4)
(setf (get ‘Стокгольм ‘широта) 1)
(setf (get ‘Таллинн ‘широта) 2)
(setf (get ‘Ленинград‘широта) 3)
(setf (get ‘Выборг ‘широта) 5)
Работа программы:    (маршрут ‘Стокгольм  ‘Выборг ‘наилучший)
Получим: (Стокгольм Хельсинки Ленинград Выборг)

Re: DMS кажется Вы сможете помочь (спасите)или те кто понимает в Лисп

Это прога к сожалению не подходит. Необходимо задавать расстояния между городами в виде списка, содержащего вложенные списки. Например, есть три города А В С, тогда надо задать список ((0 3 9) (3 0 1) (9 1 0)), т.е. расстояние от каждого города до всех других. Решать надо эвристическим методом, с эвристикай "идти в ближайший город". Выдываться должен минимальный путь коммивояжера, и если возможно список городов, составляющих этот минимальный путь. Вроде бы не сложно, но решить эту задачку я не могу. Пожалуйста, помогите. Если не сложно напишите алгоритм!!!!
Очень, очень нужно!!