rendered paste body(require :cl-graph)
(in-package :cl-graph)
(load "Graph.lisp")
(defun traveling-salesman-problem (graph)
(let ((V '()))
(iterate-vertexes graph #'(lambda (x)
(push x V)))
; (dotimes (i 500)
; (rotatef (elt V (random 128)) (elt V (random 128))))
(let ((min-tour (copy-list V)) (cur nil))
(print (calculate-tour-cost graph min-tour))
(while (< (calculate-tour-cost graph (setf cur (find-min-in-neigh graph min-tour)))
(calculate-tour-cost graph min-tour))
(print "test")
(setf min-tour cur))
(format t "Tour~a~%Cost:~a~%" min-tour (calculate-tour-cost graph min-tour)))))
(defun find-min-in-neigh (graph cur-best)
(let ((min-tour-2 cur-best)
(min-cost (calculate-tour-cost graph cur-best)))
(loop for i from 0 to (- (length cur-best) 2) do
(loop for j from (1+ i) to (1- (length cur-best)) do
(rotatef (elt min-tour-2 i) (elt min-tour-2 j))
(if (< (calculate-tour-cost graph min-tour-2) min-cost)
(setf min-cost (calculate-tour-cost graph cur-best))
(rotatef (elt min-tour-2 i) (elt min-tour-2 j)))))
(print (calculate-tour-cost graph min-tour-2))
min-tour-2))