Тема: Помогите с Lisp (задача коммивояжора)

Знатоки Lisp, отзовитесь!!! Помогите решить задачку коммивояжора с эвристикой. Т. е. у нас есть города и нужно найти кратчайший путь между ними, при этом заданы эвристические оценки для каждого расстояния меджу городами(близость к цели, чем меньше эта оценка тем лучше). Если необходимо, то даже есть алгоритм эвристического поиска.
Заранее спасибо!

Re: Помогите с Lisp (задача коммивояжора)

> Liza
В каком виде можно в программу передать имеющуюся у вас информацию, и в каком виде вы хотели бы получать ответ?
Описанной вами информации совершенно не достаточно " у нас есть города"...
Кстати, любые ваши алгоритмы будут интересны.

Re: Помогите с Lisp (задача коммивояжора)

Требуется найти такой путь коммвояжора, по кот. необходимо посетить М-1 городов, зайдя в каждый город и вернуться домой, причем протяженность пути должна быть минимальной. При этом заданы эвристические оценки для каждого расстояния между городами(близость к цели, чем меньше эта оценка тем лучше).

Re: Помогите с Lisp (задача коммивояжора)

?Жадный алгоритм поиска?  использует списки сохраненных состояний: список open отслеживает текущее состояние поиска, а в closed записываются уже проверенные состояния. На каждом шаге  в список open записываются состояния с учетом эвристической оценки его ?близости к цели?, т.е. на каждом шаге рассматриваются наиболее перспективные состояния из списка open. Алгоритм:
Function Best;
Begin
Open:= [Start];
Closed:=[];
While open <> [] do             `оставшиеся состояния
Begin
Удалить первое состояние Х из списка open;
If X=goal/ return путь от  Start к X
Else
Begin
Сгенерировать потомок Х;
For каждого потомка Х do
Case
Потомок не содержится в списке open или closed;
Begin
Присвоить потомку эвристическое значение;
Добавить потомок  в список open
End;
Потомок уже содержится в списке open:
If потомок был достигнут по кратчайшему пути
Then записать это состояние в список open
Потомок уже содержится в списке closed:
If потомок был достигнут по кратчайшему пути  then
Begin
Удалить состояние и списка closed;
Добавить потомок в список open
End;
End;                                                                                         `конец case
Поместить Х в список closed;
Переупорядочить состояния в списке open
В соответствии с эвристикой (лучший слева)
End;
Return FAIL                                                               ` список OPEN пуст
End.
На каждой итерации функция Best удаляет первый элемент из списка open. Достигнув цели, алгоритм возвращает путь, который ведет к решению.
Но мне непонятно, если мы задаем список городов, то где задавать эвристические оценки. И вообще как этот алгоритм реализовать на Lisp (может использовать рекурсию, но я все равно не в силах это сделать). Помогите пожалуйста!!!!!!!