明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3451|回复: 19

[讨论] (求助) 最长路径怎么求?。

[复制链接]
发表于 2013-3-27 20:36:50 | 显示全部楼层 |阅读模式
本帖最后由 wowan1314 于 2013-4-4 12:30 编辑

如图,图中线为LINE线,圆心与线交点  及 线与线的交点处已经打断于点(当然如果您觉的不用打断那更好)。
鼠标点取A处直线 求出沿图中相连接的线的路径中,即A-B A-C A-D A-E A-F A-G那段路径最长?图中A-G最长


或者我已通过点取A处直线然后由程序得到与之相连直线的点表。

格式为:((P1 P2)(p2 p3)(p2 p4)(p4 p5)(p3 p6)(p6 p7).......) 如何求出(P1 P2 P3 P6 P7...)(P1 P2 P4 P5...)..这样的结果?

请各位不吝赐教。  放弃了。头疼想不明白

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-5-13 19:42:49 | 显示全部楼层
  1. (defun AYL-GetAllPath (SttPnt EndPnt PtsLst / AllPathLst CurPnt CurPathLst TestLst TmpLst DPtLst NxtPnt CurPathLst-s)
  2.   (setq AllPathLst nil)
  3.   (setq CurPathLst (List SttPnt))
  4.   (setq TestLst (list (list SttPnt CurPathLst PtsLst)))
  5.   (while TestLst
  6.     (setq TmpLst (car TestLst))
  7.     (setq TestLst (cdr TestLst))
  8.     (setq CurPnt (car TmpLst))
  9.     (setq CurPathLst (cadr TmpLst))
  10.     (setq PtsLst (caddr TmpLst))
  11.    
  12.     (setq TmpLst (vl-remove-if-not (function (lambda (Pts) (member CurPnt Pts))) PtsLst))
  13.     (while TmpLst
  14.       (setq DPtLst (car TmpLst))
  15.       (setq TmpLst (cdr TmpLst))
  16.       (if (equal (car DPtLst) CurPnt)
  17.         (setq NxtPnt (cadr DPtLst))
  18.         (setq NxtPnt (car DPtLst))
  19.       )
  20.       (setq CurPathLst-s (cons NxtPnt CurPathLst))
  21.       (setq TestLst (cons (list NxtPnt CurPathLst-s (vl-remove DPtLst PtsLst)) TestLst))
  22.       (if (equal NxtPnt EndPnt)
  23.         (setq AllPathLst (cons (reverse CurPathLst-s) AllPathLst))
  24.       )
  25.     )
  26.   )
  27.   (princ "\n")
  28.   (princ (length AllPathLst))
  29.   (princ "\n")
  30.   AllPathLst
  31. )
发表于 2013-3-28 13:20:50 | 显示全部楼层
将点对的列表按点的长度排序不就行了?
(distance '(0 0) '(1 1))
vl-sort
用这样的函数

点评

排序完呢? 如何得出各段路径?  发表于 2013-3-28 13:59
发表于 2013-3-28 13:31:59 | 显示全部楼层

点评

已学习。没得到启发!主要是中间有分支的情况下怎么逐个再算一次  发表于 2013-3-28 14:14
 楼主| 发表于 2013-3-28 13:51:11 | 显示全部楼层
本帖最后由 wowan1314 于 2013-3-28 13:58 编辑

我也做了个函数计算。不过如果中间有分支的情况就只能算一条。
比如只求了A-B  A-C A-G 三条。 A-D A-E A-F就漏掉了
;|
(SETQ LST '(((1 1 0) (2 2 0)) ((2 2 0) (4 4 0)) ((4 4 0) (5 5 0)) ((2 2 0) (6 6 0))((7 7 0) (2 2 0)) ((7 7 0) (8 8 0))))
(YY_321 '(((1 1 0) (2 2 0))) LST)
|;
(defun YY_321 (LST1 Lst / LstNew LST2 I PT1 PT2 _LstItem)

(SETQ I 0 LST3 LST1)
(WHILE
  (SETQ LST2 (NTH I (reverse LST1)))
  (SETQ PT1 (CAR LST2))
  (SETQ PT2 (CADR LST2))
  (vl-member-if
   '(lambda(_LstItem)
     (if  (AND
            (vl-member-if '(lambda(x) (equal (distance X PT2) 0.0 0.1)) _LstItem)
            (NOT(vl-member-if '(lambda(x) (equal (distance X PT1) 0.0 0.1)) _LstItem))
          )
         (PROGN
           (IF (equal (distance (CAR _LstItem) PT2) 0.0 0.1)
               (setq LST1 (CONS (SETQ _LstItem2 _LstItem) LST1));
               (setq LST1 (CONS (SETQ _LstItem2 (reverse _LstItem)) LST1))
           );
           (IF (= I 0)(SETQ _LstItem1 _LstItem))
          )
     )
    )
   Lst)
  (SETQ I (1+ I))
  );;END WHILE

;;;点表算几次的情况怎么处理?
;|
(SETQ PT1 (CAR _LstItem2) PT2 (CADR _LstItem2))
  (foreach _LstIt1 Lst
    (if  (AND
            (vl-member-if '(lambda(x) (equal (distance X PT2) 0.0 0.1)) _LstIt1)
            (NOT(vl-member-if '(lambda(x) (equal (distance X PT1) 0.0 0.1)) _LstIt1))
          )
               (setq LST1 (CONS _LstIt1 LSTX))
    )
  )
(IF (> (LENGTH LSTX) 2)
  (SETQ LST (vl-remove _LstItem1 LST))
)
|;
  ;;此处把算过的点表删除;;但是有些点表要算几次怎么办?如何更新LST?
  (SETQ LST (vl-remove _LstItem1 LST))

  (setq leng 0.0)
  (IF (> (LENGTH LST1) 1)
  (PROGN
  (PRINC LST1)
  (foreach point LST1 (setq leng (+ leng (distance (cAr point) (cAdr point)))))
  (princ leng)
  (princ ">>>>")
  (YY_321 LST3 LST)))
)
发表于 2013-3-28 21:49:23 | 显示全部楼层
  1. (defun FindNextSubList (Pn Lst)
  2.   (if Lst
  3.     (if (= (car (car Lst)) Pn)
  4.       (cons (car Lst) (FindNextSubList (cadr (car Lst)) (cdr Lst)))
  5.       (FindNextSubList Pn (cdr Lst))
  6.     )
  7.   )
  8. )
  9. (defun AddTorNil (NLst MLst)
  10.   (if NLst
  11.     (if (member (cadr (car NLst)) (mapcar 'car MLst))
  12.       (if (member (cadr (car NLst)) (cdr (member (cadr (car NLst)) (mapcar 'car MLst))))
  13.         (cons (append (car NLst) '(T)) (AddTorNil (cdr NLst) MLst))
  14.         (cons (append (car NLst) '(nil)) (AddTorNil (cdr NLst) MLst))
  15.       )
  16.       (cons (append (car NLst) '(nil)) (AddTorNil (cdr NLst) MLst))
  17.     )
  18.   )
  19. )
  20. (defun RemoveIsNilLast (NLst MLst)
  21.   (if (and NLst MLst)
  22.     (if (not (caddr (car NLst)))
  23.       (RemoveIsNilLast (cdr NLst) (vl-remove (list (car (car NLst)) (cadr (car NLst))) MLst))
  24.       MLst
  25.     )
  26.     MLst
  27.   )
  28. )
  29. (defun func (Lst0 / Lst1 Lst2 Lst3 Lst4 ReLst)
  30.   (setq Lst3 Lst0
  31.         Lst2 '((T T T))
  32.         ReLst nil
  33.         )
  34.   (while (member 'T (mapcar 'caddr Lst2))
  35.     (setq Lst1  (cons (car Lst3) (FindNextSubList (cadr (car Lst3)) (cdr Lst3)))
  36.           Lst4  (cons (car (car Lst1)) (mapcar 'cadr Lst1))
  37.           ReLst (cons Lst4 ReLst)
  38.           Lst2  (reverse (AddTorNil Lst1 Lst3))
  39.           Lst3  (RemoveIsNilLast Lst2 Lst3)
  40.     )
  41.   )
  42.   (reverse ReLst)
  43. )

也不知道行不行

点评

好像不行哦  发表于 2013-3-29 09:46
 楼主| 发表于 2013-3-28 23:57:57 来自手机 | 显示全部楼层
nzl1116 发表于 2013-3-28 21:49
也不知道行不行

明天测试下!感谢!!!
发表于 2013-3-29 09:44:51 | 显示全部楼层
wowan1314 发表于 2013-3-28 23:57
明天测试下!感谢!!!

汗,有一处毛病,把"="改成"equal"就行了

点评

如我代码中的LST 你的代码也有漏掉的路径  发表于 2013-3-29 09:53

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1

查看全部评分

发表于 2013-3-29 09:52:21 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mo ... id=83780&page=1
7楼代码稍加修改即可满足楼主要求!

点评

已学习。我已稍加修改以便选择PL线。但却不明如何改才可满足现在的问题!? 望明显。  发表于 2013-3-29 10:02

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 很给力!

查看全部评分

发表于 2013-3-29 10:26:17 | 显示全部楼层
Gu_xl 发表于 2013-3-29 09:52
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=83780&page=1
7楼代码稍加修改即可满足楼主要求!

每次递归结束便是完成一条线路,所有路线搜索完成后,比较一下便知!
发表于 2013-3-29 20:04:31 | 显示全部楼层
这样应该可以了
  1. (defun FindNextSubList (Pnt sLst / sLst0 sLst1 sLst2 Pmt)
  2.   (setq sLst0 sLst
  3.         Pmt   Pnt
  4.         sLst1 nil
  5.   )
  6.   (while (setq sLst2 (car (vl-member-if '(lambda (x) (member Pmt x)) sLst0)))
  7.     (setq sLst0 (vl-remove sLst2 sLst0))
  8.     (if (equal (cadr sLst2) Pmt)
  9.       (setq sLst2 (reverse sLst2))
  10.     )
  11.     (setq sLst1 (append sLst1 (list sLst2))
  12.           Pmt    (cadr sLst2)
  13.     )
  14.   )
  15.   sLst1
  16. )
  17. (defun AddTorNil (NLst MLst / n m RetLst AddLst SecondI Return)
  18.   (setq        n      0
  19.         m      (length NLst)
  20.         RetLst nil
  21.   )
  22.   (while (< n m)
  23.     (setq AddLst  (nth n NLst)
  24.           SecondI (cadr AddLst)
  25.           Return  (cdr (vl-member-if '(lambda (x) (member SecondI x)) MLst))
  26.           Return  (cdr (vl-member-if '(lambda (x) (member SecondI x)) Return))
  27.           Return  (vl-member-if '(lambda (x) (member SecondI x)) Return)
  28.     )
  29.     (if        Return
  30.       (setq AddLst (append AddLst '(T)))
  31.       (setq AddLst (append AddLst '(nil)))
  32.     )
  33.     (setq RetLst (append RetLst (list AddLst))
  34.           n         (1+ n)
  35.     )
  36.   )
  37.   RetLst
  38. )
  39. (defun RemoveIsNilLast (NLst MLst)
  40.   (if (and NLst MLst)
  41.     (if        (not (caddr (car NLst)))
  42.       (RemoveIsNilLast
  43.         (cdr NLst)
  44.         (vl-remove (if (member (vl-remove 'nil (car NLst)) MLst)
  45.                      (vl-remove 'nil (car NLst))
  46.                      (reverse (vl-remove 'nil (car NLst)))
  47.                    )
  48.                    MLst
  49.         )
  50.       )
  51.       MLst
  52.     )
  53.     MLst
  54.   )
  55. )
  56. (defun GetAllPathAtStartPt (Pt aLst / aLst1 aLst2 aLst3 aLst4 ReLst)
  57.   (setq aLst3 aLst
  58.         aLst2 '((T T T))
  59.         ReLst nil
  60.   )
  61.   (while (member 'T (mapcar 'caddr aLst2))
  62.           ;;获取一条线路链
  63.     (setq aLst1  (FindNextSubList Pt aLst3)
  64.           ;;将线路链以线的方式转化成以点的方式
  65.           aLst4  (cons Pt (mapcar 'cadr aLst1))
  66.           ;;添加到表中
  67.           ReLst        (append ReLst (list aLst4))
  68.           ;;给线路链的各条线添加一个符号,如果此线后面有分支,就添加T,否则添加nil。
  69.           aLst2        (reverse (AddTorNil aLst1 aLst3))
  70.           ;;在主表中移除线路链后面的分支
  71.           aLst3        (RemoveIsNilLast aLst2 aLst3)
  72.     )
  73.   )
  74.   ReLst
  75. )
  76. (defun funct (Lst / Lst0 Lst1 n m Pn Lst2 ReVal)
  77.   ;;第一步,寻找线路链的一个起点
  78.   (setq        Lst0  (apply 'append Lst)
  79.         ;;所有端点的表
  80.         Lst1  (vl-remove-if
  81.                 '(lambda (x) (member x (cdr (member x Lst0))))
  82.                 Lst0
  83.               )
  84.         n     0
  85.         ;;最后一个端点不用运算
  86.         m     (1- (length Lst1))
  87.         ReVal nil
  88.   )
  89.   (while (< n m)
  90.     (setq Pn    (nth n Lst1)
  91.           Lst2  (GetAllPathAtStartPt Pn Lst)
  92.           Lst2  (vl-remove-if '(lambda (x) (member (reverse x) ReVal)) Lst2)
  93.           ReVal (append ReVal Lst2)
  94.           n     (1+ n)
  95.     )
  96.   )
  97.   ReVal
  98. )

点评

应该差不多了。我再消化消化。  发表于 2013-3-29 22:06

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-6 07:10 , Processed in 0.194447 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表