该问题本质上是旅行商问题(即沿着最短路径访问所有节点)。以下是实现最近邻贪婪算法的解决方案-请注意,这种方法不会产生最佳结果:
- (defun sortentlist ( lst / foo rtn )
- (setq foo
- (lambda ( x l / a d r )
- (setq d (distance (caddr x) (cadar l))
- r (car l)
- )
- (foreach y (cdr l)
- (if (< (setq a (distance (cadr y) (caddr x))) d)
- (setq d a r y)
- )
- )
- r
- )
- )
- (setq lst (mapcar '(lambda ( x ) (list x (vlax-curve-getstartpoint x) (vlax-curve-getendpoint x))) lst)
- rtn (list (car lst))
- lst (cdr lst)
- )
- (while lst
- (setq rtn (cons (foo (car rtn) lst) rtn)
- lst (vl-remove (car rtn) lst)
- )
- )
- (reverse (mapcar 'car rtn))
- )
该算法也可以使用排序来实现,但效率较低:
- (defun sortentlist ( lst / rtn )
- (setq lst (mapcar '(lambda ( x ) (list x (vlax-curve-getstartpoint x) (vlax-curve-getendpoint x))) lst)
- rtn (list (car lst))
- lst (cdr lst)
- )
- (while lst
- (setq lst (vl-sort lst '(lambda ( a b ) (< (distance (caddar rtn) (cadr a)) (distance (caddar rtn) (cadr b)))))
- rtn (cons (car lst) rtn)
- lst (vl-remove (car rtn) lst)
- )
- )
- (reverse (mapcar 'car rtn))
- )
|