找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: wowan1314

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

[复制链接]
 楼主| 发表于 2013-8-2 20:13:56 | 显示全部楼层

解释下楼上的代码:

   这个代码是在点取起点线段后,
获得所有与之相连线段的两点表((P1  P2)(P2 P3)(P2 P4) (P4 P5) (P3 P6)....)后。

再使用楼上的代码就可求出所有路径的点表链。 然后对比即可知道最长路径的点表链.

点评

你说的是G版的那段代码,还是G版来解释吧  详情 回复 发表于 2013-8-2 20:24
那葛老能不能根据上面的函数,给大家写一个算最大路径和最短路径的通用函数?  详情 回复 发表于 2013-8-2 20:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-8-2 20:16:52 | 显示全部楼层

哇,这个代码很简洁啊,能不能再提供一个求最短路径的函数?

点评

我这是根据点对表,按起点返回所有路径,最长最短都在里面了。如果回路比较复杂,就不适合了,毕竟用了递归。  详情 回复 发表于 2013-8-2 20:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-8-2 20:17:40 | 显示全部楼层
wowan1314 发表于 2013-8-2 20:13
解释下楼上的代码:

   这个代码是在点取起点线段后,

那葛老能不能根据上面的函数,给大家写一个算最大路径和最短路径的通用函数?

点评

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

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-8-2 20:24:30 | 显示全部楼层
wowan1314 发表于 2013-8-2 20:13
解释下楼上的代码:

   这个代码是在点取起点线段后,

你说的是G版的那段代码,还是G版来解释吧

点评

我说的是 你的那个代码使用的条件。。 而G的代码,很好理解。根据得到的线段的两点得到与之相连的下一段,并又到得到两点。然后就是递归得到所有相连的线。  详情 回复 发表于 2013-8-2 20:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-8-2 20:27:54 | 显示全部楼层
Lispboy 发表于 2013-8-2 20:16
哇,这个代码很简洁啊,能不能再提供一个求最短路径的函数?

我这是根据点对表,按起点返回所有路径,最长最短都在里面了。如果回路比较复杂,就不适合了,毕竟用了递归。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-2 20:29:23 | 显示全部楼层
ayl1004 发表于 2013-8-2 20:24
你说的是G版的那段代码,还是G版来解释吧

我说的是 你的那个代码使用的条件。。

而G的代码,很好理解。根据得到的线段的两点得到与之相连的下一段,并又到得到两点。然后就是递归得到所有相连的线。

点评

G版这思路好,就象搜文件夹一样啊,把我这个函数的点改成直线,参数表去掉,变量PntLst1不要了,PntLst2就是和上一条直线相连的所有直线的表, 这样更简单了。  详情 回复 发表于 2013-8-2 20:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-8-2 20:36:55 | 显示全部楼层
wowan1314 发表于 2013-8-2 20:29
我说的是 你的那个代码使用的条件。。

而G的代码,很好理解。根据得到的线段的两点得到与之相连的下一 ...

G版这思路好,就象搜文件夹一样啊,把我这个函数的点改成直线,参数表去掉,变量PntLst1不要了,PntLst2就是和上一条直线相连的所有直线的表,
这样更简单了。

点评

东西多了那只能套循环了  详情 回复 发表于 2013-8-2 20:55
都喜欢玩递归,我去看看实际工作中线段会不会超过10000.  发表于 2013-8-2 20:44

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 你怎么一下就看出来了! 我表示没搜索过文.

查看全部评分

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

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-8-2 20:55:51 | 显示全部楼层
ayl1004 发表于 2013-8-2 20:36
G版这思路好,就象搜文件夹一样啊,把我这个函数的点改成直线,参数表去掉,变量PntLst1不要了,PntLst2 ...

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

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

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

楼主是说我的代码没看明白吗?
还是举个例子更能说明问题
比如起点是:P1
和它相连的点有:P2 P3 P4
那么:PntLst  '((P1 P2) (P1 P3) (P1 P4)...)
          PtLst0  '(P2 P3 P4)
          PtLst1  '((P1 P2) (P1 P3) (P1 P4))
因此,递归调用的参数是
P2 对应的是 '((P1 P3) (P1 P4)...) 其中子表 '(P1 P2) 被移除了
P3 对应的是 '((P1 P2) (P1 P4)...) 其中子表 '(P1 P3) 被移除了
P4 对应的是 '((P1 P2) (P1 P3)...) 其中子表 '(P1 P4) 被移除了
等等...   以此类推。


不知道说清楚了没有???

点评

我现在对递归理解不透彻。等把递归理解先  发表于 2013-8-3 09:51

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 说的很详细了。谢谢了。

查看全部评分

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

使用道具 举报

发表于 2013-8-3 07:08:58 来自手机 | 显示全部楼层
想到一种算法,选择集转表,并加编号索引,类似求交点,用两个循环,找出每个线相连的编号线(顺序向后,不重复),最后根据索引编号合并出路径来自: Android客户端

点评

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

使用道具 举报

 楼主| 发表于 2013-8-3 09:54:07 | 显示全部楼层
本帖最后由 wowan1314 于 2013-8-3 09:57 编辑
Free-Lancer 发表于 2013-8-3 07:08
想到一种算法,选择集转表,并加编号索引,类似求交点,用两个循环,找出每个线相连的编号线(顺序向后,不 ...

感谢回复。。  等我先把递归搞明白先。



下面是我用递归的样子。。 呵呵。 拿出来让大家 笑话下。
  1. ;(subst# 'm 'b '(a b (a b c) d D))
  2. ;最多套三层....
  3. (defun subst# (a b c / a b c d e)
  4.     (defun subst3# (a b c / d )
  5.         (cond
  6.             ((setq d (car c))
  7.                 (cond
  8.                     ((atom d)
  9.                         (cond
  10.                             ((eq d b)
  11.                                 (setq g (cons a g))
  12.                                 (subst3# a b (cdr c))
  13.                             )
  14.                             (t (setq g(cons d g))(subst3# a b (cdr c))
  15.                             )
  16.                         )
  17.                     )
  18.                 )
  19.             )
  20.         )
  21.         g
  22.     )
  23.     (defun subst2# (a b c / d g)
  24.         (cond
  25.             ((setq d (car c))
  26.                 (cond
  27.                     ((atom d)
  28.                         (cond
  29.                             ((eq d b)
  30.                                 (setq f(cons a f))
  31.                                 (subst2# a b (cdr c))
  32.                             )
  33.                             (t (setq f(cons d f))(subst2# a b (cdr c))
  34.                             )
  35.                         )
  36.                     )
  37.                     (t (setq f (cons (subst3# a b d) f))(subst2# a b (cdr c))
  38.                     )
  39.                 )
  40.             )
  41.         )
  42.         f
  43.     )
  44.     (defun subst1# (a b c / d f)
  45.         (cond
  46.             ((setq d (car c))
  47.                 (cond
  48.                     ((atom d)
  49.                         (cond
  50.                             ((eq d b)
  51.                                 (setq e(cons a e))
  52.                                 (subst1# a b (cdr c))
  53.                             )
  54.                             (t (setq e(cons d e))(subst1# a b (cdr c))
  55.                             )
  56.                         )
  57.                     )
  58.                     (t (setq e (cons (subst2# a b d) e))(subst1# a b (cdr c))
  59.                     )
  60.                 )
  61.             )
  62.         )
  63.         e
  64.     )
  65.     (subst1# a b c)
  66. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-8-3 09:58:54 | 显示全部楼层
套循环不知道楼主搞定了没有,其实也很简单
  1. (defun GetMaxPath (ent / Lst0 Lst1 Lst2 Lst3 Val0 Val1)
  2.   (setq Lst0 (list (list ent))
  3.         Val0 0
  4.         Lst3 nil
  5.   )
  6.   (while Lst0
  7.     (setq Lst2 (car Lst0)
  8.           Lst0 (cdr Lst0)
  9.     )
  10.     ;;自定义一下GetLines函数
  11.     ;;获取给定直线图元连接的所有直线
  12.     (if        (setq Lst1 (GetLines (car Lst2)))
  13.       (setq Lst0
  14.              (append Lst0
  15.                      (mapcar (function (lambda (x) (cons x Lst2))) Lst1)
  16.              )
  17.       )
  18.       (if (< Val0
  19.              (setq Val1
  20.                     (apply '+
  21.                            (mapcar (function (lambda (x)
  22.                                                (vlax-curve-GetDistAtPoint
  23.                                                  x
  24.                                                  (vlax-curve-GetEndPoint x)
  25.                                                )
  26.                                              )
  27.                                    )
  28.                                    Lst2
  29.                            )
  30.                     )
  31.              )
  32.           )
  33.         (setq Val0 Val1
  34.               Lst3 Lst2
  35.         )
  36.       )
  37.     )
  38.   )
  39.   (mapcar (function (lambda (x) (redraw x 3))) Lst3)
  40.   (princ Val0)
  41.   (getpoint)
  42.   (mapcar (function (lambda (x) (redraw x 4))) Lst3)
  43.   (princ)
  44. )
前面要再加个entsel,就可以当命令使用了

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 今天有事。改天得拿一天时间出来好好学习你.

查看全部评分

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

使用道具 举报

发表于 2013-8-3 15:25:03 | 显示全部楼层
贴几个准备函数
  1.   (defun ln&ln (l1 l2)
  2.     (or (or (equal (caadr l1) (caadr l2) 1e-6)
  3.      (equal (caadr l1) (cadadr l2) 1e-6)
  4. )
  5. (or (equal (cadadr l1) (caadr l2) 1e-6)
  6.      (equal (cadadr l1) (cadadr l2) 1e-6)
  7. )
  8.     )
  9.   )
  10.   (defun ss->els (ss / sl i els e )
  11.     (setq sl (sslength ss)
  12.    i  sl
  13.     )
  14.     (repeat sl
  15.       (setq e (ssname ss (setq i (1- i))))
  16.       (setq els (cons (list i
  17.        (list (vlax-curve-getstartpoint e)
  18.       (vlax-curve-getendpoint e)
  19.        )
  20.        e
  21.         )
  22.         els
  23.   )
  24.       )
  25.     )
  26.     els
  27.   )
  28.   (defun els->ss (l / s)
  29.     (setq s (ssadd))
  30.     (mapcar '(lambda (x) (ssadd (last x) s)) l)
  31.     s
  32.   )

点评

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

使用道具 举报

 楼主| 发表于 2013-8-3 18:48:36 | 显示全部楼层

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-4 08:39:47 | 显示全部楼层
本帖最后由 st788796 于 2013-8-4 08:41 编辑

  1. ;;看了下28#代码, 思路应该是每个线形成一个表 (编号 (起点 终点) 线实体)
  2. ;;ln&ln 判断两个线是否相连
  3. ;;ss->els 对选择集构造实体表  ((1 (sp1 ep1) ln1) (2 (sp2 ep2) ln2) ... (n (spn epn) lnn))
  4. ;;els->ss 将构造的路径生成选择集
  5. ;;这个算法可以生成选择集内的所有路径,虽然效率未知,好在都是表操作,应该可以接受的
  6. ;;下面按Freelancer思路续写一个在线表中找出与给定线相连线的函数
  7. ;;这个算法还可以在选择集中任意指定一个线找出通过该线的所有路径
  8. (defun ln&lns (e el / l)
  9.   (while el
  10.     (if (ln&ln e (car el))
  11.       (setq l (cons (car el) l))
  12.     )
  13.     (setq el (cdr el))
  14.   )
  15.   (if l
  16.     (cons (car e) (cons e l))
  17.     (cons (car e) e)
  18.   )
  19. )

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 闻弦歌而知雅意!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 14:25 , Processed in 0.221650 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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