Тема: Задача коммивояжера
Люди добрые, поделитесь решением задачи о коммивояжоре на Lisp.
Коммивояжер должен выйти из первого города, посетить по разу в неизвестном порядке города 2,1,3..n и вернуться в первый город. Расстояния между городами известны. В каком порядке следует обходить города, чтобы замкнутый путь коммивояжера был кратчайшим? Выдавать программа должна кротчайший путь коммивояжера и его длину.
Для нахождения длины пути велели задавать матрицу городов в виде списка расстояний между городами. Допустим есть три города А В С , тога надо задать список расстояний от одного города до каждого из остальных
((0 3 9) (3 0 1) (9 1 0)).
АВС
А 039
В 301
С 910
Надо реализовывать эвристический алгоритм поиска, с эвристикой "идти в ближайший город" (это наверное "жаданый алгоритм"????). Я буду рада любому решению, главное, чтобы работало.
Единственное, что мне удалось сделать, так это написать алгоритм нахождения гамильтонова цикла (т.е. прохождение через все города только по одному разуи возвращение в исходный город). Методом поиска в глубину с возвратом. Но я не знаю, будет ли это кратчайший путь и как вычислять пройденный путь (надо как-то добавить еще алгоритм?).
(DEFUN HAMILTCYCLE (LAMBDA (GRAPH) ; GRAPH - граф в виде структуры смежности ; ; Результат: гамильтонов цикл в виде списка вершин, ; ; NIL - если гамильтонова цикла не существует ; (COND ( (NULL GRAPH) NIL ) ( T (COND ( (NULL (CDR GRAPH)) (LIST (CAAR GRAPH))) ( T (HC GRAPH (CAAR GRAPH) (LIST (CAAR GRAPH)) (CDAR GRAPH) ) ) ) ) ) )) ; ---------------------------------------- ; (DEFUN HC (LAMBDA (GRAPH START VISITED SONS) ; START - первая вершина графа ; ; VISITED - список пройденных вершин ; ; SONS - соседи просматриваемой вершины ; (COND ( (NULL SONS) NIL ) ( T (COND ( (AND (MEMBER START SONS) (EQ (LENGTH GRAPH) (LENGTH VISITED)) ) (REVERSE VISITED) ) ( T (COND ( (MEMBER (CAR SONS) VISITED) (HC GRAPH START VISITED (CDR SONS)) ) ( T (OR (HC GRAPH START (CONS (CAR SONS) VISITED) (NEIGHBOUR3 (CAR SONS) GRAPH) ) (HC GRAPH START VISITED (CDR SONS))) )) ) ) ) ) )) ; ------------------------------- ; (DEFUN NEIGHBOUR3 (LAMBDA (X GRAPH) (COND ( (NULL (ASSOC X GRAPH)) NIL ) ( T (CDR (ASSOC X GRAPH)) ) ) ))
Пример:
$ (HAMILTCYCLE '((1 . (2 6)) (2 . (1 3 4)) (3 . (2 4)) (4 . (2 3 5)) (5 . (4 6)) (6 . (1 5)))) (1 2 3 4 5 6)
Еще как назло сроки пождимают, дали только 2 недели. С нетерпением буду ждать ответа (решение). Извините, если назойлива, просто очень очень надо.
Помогите!!!!!
Заранее спасибо!