明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 893|回复: 13

寻找最短路径-dijkstra算法之CAD版(含程序)

[复制链接]
发表于 2024-5-21 19:40 | 显示全部楼层 |阅读模式
本帖最后由 highflybird 于 2024-5-25 13:58 编辑

弄了一个 寻找最短路径-dijkstra算法之CAD版。

这个是dijkstra算法在AutoCAD上的应用。可以看出dijkstra算法效率很高。本程序采用ObjectARX编译,速度很快,代码比较简短。有探讨的朋友可联系我。
下面是演示效果:

这里提供arx程序,按CAD相应版本加载即可,命令是:DDD


其中核心代码是:
  1. void CGraph::dijkstra(CNode& startNode)
  2. {
  3.   for (std::set<CNode>::iterator n = allNodes.begin(); n !=allNodes.end (); ++n)
  4.   {
  5.     (bool)n->bVisted = false;  // true表示到结点i的最短路径已经找到
  6.     (double)n->dist = DBL_MAX;  // 记录所有结点到起点的距离
  7.   }
  8.   pre.resize(allNodes.size());
  9.   startNode.dist = 0;        // 起点到自己的距离为0

  10.   // 优先队列,存结点信息
  11.   priority_queue<pair<double, CNode*>, vector<pair<double, CNode*>>, greater<pair<double, CNode*>>> Q;
  12.   Q.push(make_pair(0,&startNode));// 起点入队
  13.   while(!Q.empty())
  14.   {
  15.     CNode* u = Q.top().second;  // pop出距离起点s最小的节点u
  16.     Q.pop();
  17.     if (u->bVisted) continue;  // 丢弃已经找到最短路径的结点,即集合A中的结点
  18.     u->bVisted = true;
  19.     for (std::set<CEdge>::iterator e = u->edges.begin(); e != u->edges.end(); ++e)// 检查结点u的所有邻居
  20.     {
  21.       CNode* v = e->pNext->isEqualTo(*u,actol) ? (e->pNode) : ( e->pNext); // 邻居对应的节点
  22.       if (v->bVisted) continue;// 丢弃已经找到最短路径的邻居结点  
  23.       double d = e->length+u->dist;
  24.       if (v->dist > d)
  25.       {
  26.         v->dist = d;
  27.         Q.push(make_pair(d,v));// 扩展新的邻居,放到优先队列中
  28.         pre[v->index].index = u->index ; // 记录节点
  29.         pre[v->index].edge = *e;         // 记录路径
  30.       }
  31.     }
  32.   }
  33. }


代码参考了:https://zhuanlan.zhihu.com/p/615138731

本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +4 收起 理由
bloodtempt + 1
tigcat + 1 大师就是大师!
飞雪神光 + 1 赞一个!
dtucad + 1 很给力!

查看全部评分

发表于 2024-5-22 11:22 | 显示全部楼层
要是可以变成lisp就好了 。

点评

支持,方便不会ARX编程的绘图人使用  发表于 2024-5-22 17:34
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-5-21 20:28 | 显示全部楼层
A星算法不太了解,但据:路径规划之 A* 算法 - 知乎 (zhihu.com)
里面介绍,
上面已经提到,启发函数会影响A*算法的行为。
  • 在极端情况下,当启发函数h(n)始终为0,则将由g(n)决定节点的优先级,此时算法就退化成了Dijkstra算法。
  • 如果h(n)始终小于等于节点n到终点的代价,则A*算法保证一定能够找到最短路径。但是当h(n)的值越小,算法将遍历越多的节点,也就导致算法越慢。
  • 如果h(n)完全等于节点n到终点的代价,则A*算法将找到最佳路径,并且速度很快。可惜的是,并非所有场景下都能做到这一点。因为在没有达到终点之前,我们很难确切算出距离终点还有多远。
  • 如果h(n)的值比节点n到终点的代价要大,则A*算法不能保证找到最短路径,不过此时会很快。
  • 在另外一个极端情况下,如果h()n相较于g(n)大很多,则此时只有h(n)产生效果,这也就变成了最佳优先搜索。

似乎A*算法可能不准确?
如果要用到Dijkstra的并行算,估计图形数据量很大吧。



发表于 2024-5-21 22:40 | 显示全部楼层
是的,很多时候并不需要最近,而是需要最快,距离差不多就行.
并行化的作用是工程化实现,通过数据量自适应速度,
当算法无解的时候就找找硬件加速方案,嘻嘻
发表于 2024-5-21 20:07 | 显示全部楼层
Astar会比它快,而且dijkstra也可以并行化,嘻嘻
发表于 2024-5-21 21:08 | 显示全部楼层
牛,就是不懂这个语言
发表于 2024-5-21 23:46 | 显示全部楼层
大佬作品必属精品
发表于 2024-5-22 09:33 | 显示全部楼层
我经常遇到下面的导航计算

本帖子中包含更多资源

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

x
发表于 2024-5-23 08:34 | 显示全部楼层
学习了!
大佬作品必属精品
发表于 2024-5-23 17:13 | 显示全部楼层
大佬作品必属精品
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-16 12:18 , Processed in 0.145654 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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