找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3244|回复: 39

[研讨] 求 最 远路径的问题。。

[复制链接]
发表于 2013-8-1 11:37:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
     大家无聊的时候来思考下这个问题吧。
1。如图线的转弯处、线与线,线与喷头处均已打断于点,
然后选择起始线,即可得出所有路径中最远的路径,并弄成选择状态以便查看。




最远路径.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-8-1 13:24:11 | 显示全部楼层
首先要限定走过的路不能重复走!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 13:30:29 | 显示全部楼层
zhang8755 发表于 2013-8-1 13:24
首先要限定走过的路不能重复走!

完全一样的路径肯定是走一次就够了。
从起点走到相连线的末端算一个路径。这个图里有很多路径。
要把所有的路径求出来比较才能得出最长的路径。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 13:57:05 | 显示全部楼层
本帖最后由 wowan1314 于 2013-8-1 13:58 编辑

整难了?  大家都不来发言呀!

贴个G版一键选中所有相连的线的代码。G版说这个代码 再 小改就能实现要求。  我对递归理解不好。大家来试试吧。
  1. ;;选择直线相连 By Gu_xl
  2. (defun c:tt(/ gxl-Sel-ReDrawSel gxl-Sel-SSsub gxl-Sel-SSJoin gxl-sel-SSgetLineatPoint getline)
  3.   (defun gxl-Sel-ReDrawSel (Sel mode / m n)
  4.     (setq m (sslength Sel)
  5.    n 0)
  6.     (repeat m
  7. (redraw (ssname Sel n) mode)
  8. (setq n (1+ n))
  9. );repeat
  10.     )
  11.   (defun gxl-Sel-SSsub(ss1 ss2 / ss n)
  12. (cond
  13. ((and ss1 ss2)
  14.   (setq n 0)
  15.   (repeat (sslength ss2)
  16.     (ssdel (ssname ss2 n) ss1)
  17.     (setq n (1+ n))
  18.     )
  19. )
  20. ((and ss1 (not ss2))
  21.   ss1
  22. )
  23. (T
  24.   (setq ss1 nil)
  25. )
  26. )
  27. ss1
  28. )
  29.   (defun gxl-Sel-SSJoin ( ss1 ss2 / ename ss cnt )
  30. (if ss1
  31. (progn
  32. (if (= (type ss1) 'ENAME)
  33. (progn
  34.   (setq
  35.    ename ss1
  36.    ss1   (ssadd)
  37.   )
  38.   (ssadd ename ss1)
  39. ))
  40. ))
  41. (if ss2
  42. (progn
  43. (if (= (type ss2) 'ENAME)
  44. (progn
  45.   (setq
  46.    ename ss2
  47.    ss2   (ssadd)
  48.   )
  49.   (ssadd ename ss2)
  50. ))
  51. ))
  52. (setq ss (ssadd))
  53. (if (and ss1 ss2)
  54. (progn
  55. ;(setq ss ss2 cnt 0)
  56.         (setq  cnt 0)
  57.         (repeat (sslength ss2)
  58.   (ssadd (ssname ss2 cnt) ss)
  59.   (setq cnt (1+ cnt))
  60. )
  61.         (setq  cnt 0)
  62. (repeat (sslength ss1)
  63.   (ssadd (ssname ss1 cnt) ss)
  64.   (setq cnt (1+ cnt))
  65. )
  66. ))
  67. (if (and ss1 (not ss2))
  68. (setq ss ss1))
  69. (if (and ss2 (not ss1))
  70. (setq ss ss2))
  71. (if (> (sslength ss) 0)
  72.   ;;(eval ss)
  73. ss
  74. nil
  75. )
  76. )
  77.   (defun gxl-sel-SSgetLineatPoint (pt jd /  px py px0 px1 py0 py1 ss  pz)
  78. (setq px (car pt)
  79.       px0 (- px jd)
  80.       px1 (+ px jd)
  81.       py (cadr pt)
  82.       py0 (- py jd)
  83.       py1 (+ py jd)
  84.       pz (caddr pt)
  85.       )
  86.   (setq ss
  87. (ssget "x" (list '(0 . "line")
  88.    '(-4 . "<or")

  89.    '(-4 . "<and")
  90.    '(-4 . ">=,>=,=")
  91.    (list 10 px0 py0 pz)
  92.    '(-4 . "<=,<=,=")
  93.    (list 10 px1 py1 pz)
  94.    '(-4 . "and>")
  95.    
  96.    '(-4 . "<and")
  97.    '(-4 . ">=,>=,=")
  98.    (list 11 px0 py0 pz)
  99.    '(-4 . "<=,<=,=")
  100.    (list 11 px1 py1 pz)
  101.    '(-4 . "and>")
  102.    
  103.    '(-4 . "or>")
  104.    )
  105.        )
  106.   )
  107.   (if ss(GXL-SEL-REDRAWSEL ss 3))
  108.   ss
  109.   )
  110.   (defun getline (pt jd / s s1 n p1 p2)
  111.    
  112.     (setq s (gxl-sel-SSgetLineatPoint pt jd))
  113.     (if s
  114.       (progn
  115. (setq s1 (GXL-SEL-SSSUB s ssrtl)
  116.        ssrtl (GXL-SEL-SSJOIN ssrtl s1)
  117.        )

  118. (if s1
  119.    (progn
  120.      (setq n 0)
  121.      (repeat (sslength s1)
  122.        (setq p1 (cdr (assoc 10 (entget (ssname s1 n))))
  123.       p2 (cdr (assoc 11 (entget (ssname s1 n))))
  124.       )
  125.        (getline p2 jd)
  126.        (getline p1 jd)
  127.        (setq n (1+ n))
  128.        )
  129.      )
  130.    )
  131. )
  132.       )
  133.    
  134.     )
  135.   ;;;程序开始
  136.     (princ "\n选择直线:")
  137.   (setq enline (car (entsel)))
  138.   (initget 5 "  ")
  139.   (setq jd (getreal "输入容差精度:<0.001>"))
  140.   (if (= jd "")(setq jd 0.001))
  141.   (setq pt1 (cdr (assoc 10 (entget enline))))
  142.   (setq pt2 (cdr (assoc 11 (entget enline))))
  143. (setq ssrtl (ssadd enline))
  144.   (getline pt1 jd)
  145.   (getline pt2 jd)
  146.   ssrtl
  147.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-1 14:37:40 | 显示全部楼层
这个主题好,是GIS里面的路径问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-1 16:15:01 | 显示全部楼层
弄个附图上来啊。

点评

附图。 其实自己随便画也快。  详情 回复 发表于 2013-8-1 18:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-8-1 16:46:36 | 显示全部楼层
我有wiika的最短路径的代码,在其基础上改为A星算法,最长还没考虑过。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 18:26:41 | 显示全部楼层
zhang8755 发表于 2013-8-1 16:46
我有wiika的最短路径的代码,在其基础上改为A星算法,最长还没考虑过。

不清楚他的代码的意思是否与我这个要求一样。
如果路径都是如上面图一样的支状管网,那么能求最短路径当然也能求最长路径。

点评

不一样,求最短路径不用控制重复路径问题。最长路径要过滤一下。  详情 回复 发表于 2013-8-2 12:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 18:28:04 | 显示全部楼层
newer 发表于 2013-8-1 16:15
弄个附图上来啊。

附图。 其实自己随便画也快。





测试图.zip

12.42 KB, 下载次数: 1, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-8-2 12:38:31 | 显示全部楼层
wowan1314 发表于 2013-8-1 18:26
不清楚他的代码的意思是否与我这个要求一样。
如果路径都是如上面图一样的支状管网,那么能求最短路径 ...

不一样,求最短路径不用控制重复路径问题。最长路径要过滤一下。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-8-2 19:27:53 | 显示全部楼层
这个问题还没解决吗?

点评

解决了。只是发上来活跃下论坛气氛撒。  发表于 2013-8-2 19:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-8-2 19:46:47 | 显示全部楼层
那也是,说不定还有更好的思路

点评

话说你被禁言,我都看不到那些代码。 你再发一份都这个论坛吧。 其实解决问题对我是次要的,这个题目我主要是想学习的。 因为我就想到一种方法,结果代码还是你写出来的。  详情 回复 发表于 2013-8-2 19:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-2 19:50:53 | 显示全部楼层
哪个是解决的代码? 二楼的吗?

点评

地板的代码是G版的 一个程序。G版说这个代码稍加改造就可以。我还没想明白怎么弄。  发表于 2013-8-2 19:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-2 19:53:07 | 显示全部楼层
ayl1004 发表于 2013-8-2 19:46
那也是,说不定还有更好的思路

话说你被禁言,我都看不到那些代码。 你再发一份都这个论坛吧。
其实解决问题对我是次要的,这个题目我主要是想学习的。

因为我就想到一种方法,结果代码还是你写出来的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-8-2 20:05:09 | 显示全部楼层
本帖最后由 ayl1004 于 2013-8-2 22:27 编辑

  1. <P>(defun GetAllPath (SPnt PntLst / PtLst0 PtLst1)
  2.   (setq        PtLst1 (vl-remove-if-not
  3.                  (function (lambda (x) (member SPnt x)))
  4.                  PntLst
  5.                ) ;_ 所有包含SPnt点的点对表
  6.         PtLst0 (vl-remove SPnt (apply 'append PtLst1)) ;_ 和点SPnt相连的所有点
  7.   )
  8.   (cond
  9.     ((not SPnt) nil)
  10.     ;;找到一条线路,停止搜索
  11.     ((not PtLst0) (list (list SPnt)))
  12.     ;;核心代码,批量递归
  13.     (T
  14.      (mapcar
  15.        (function (lambda (x) (cons SPnt x)))
  16.        (apply
  17.          'append
  18.          (mapcar
  19.            'GetAllPath
  20.            PtLst0</P>
  21. <P>           ;;在PntLst中移除PtLst0点表中点对应的直线,作为第二个参数进入下一步递归运算
  22.            (mapcar (function (lambda (x) (vl-remove x PntLst))) PtLst1)
  23.          )
  24.        )
  25.      )
  26.     )
  27.   )
  28. )</P>

点评

哇,这个代码很简洁啊,能不能再提供一个求最短路径的函数?  详情 回复 发表于 2013-8-2 20:16
解释下楼上的代码: 这个代码是在点取起点线段后, 获得所有与之相连线段的两点表((P1 P2)(P2 P3)(P2 P4) (P4 P5) (P3 P6)....)后。 再使用楼上的代码就可求出所有路径的点表链。 然后对比即可知道最  详情 回复 发表于 2013-8-2 20:13

评分

参与人数 2D豆 +10 收起 理由
Lispboy + 5
wowan1314 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-1 18:43 , Processed in 0.504012 second(s), 69 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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