highflybird 发表于 2024-5-21 19:40:10

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

本帖最后由 highflybird 于 2024-9-13 08:38 编辑

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

这个是dijkstra算法在AutoCAD上的应用。可以看出dijkstra算法效率很高。本程序采用ObjectARX编译,速度很快,代码比较简短。有探讨的朋友可联系我。
下面是演示效果:
https://www.bilibili.com/video/BV1CyuXeGEzz
这里提供arx程序,按CAD相应版本加载即可,命令是:DDD

(程序不再设置时间限制,也不再收取明经币,以前收取的,望见谅!)
其中核心代码是:

void CGraph::dijkstra(CNode& startNode)
{
for (std::set<CNode>::iterator n = allNodes.begin(); n !=allNodes.end (); ++n)
{
    (bool)n->bVisted = false;// true表示到结点i的最短路径已经找到
    (double)n->dist = DBL_MAX;// 记录所有结点到起点的距离
}
pre.resize(allNodes.size());
startNode.dist = 0;      // 起点到自己的距离为0

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

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


flowerson 发表于 2024-5-22 11:22:02

要是可以变成lisp就好了 。

highflybird 发表于 2024-5-21 20:28:18

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:43

是的,很多时候并不需要最近,而是需要最快,距离差不多就行.
并行化的作用是工程化实现,通过数据量自适应速度,
当算法无解的时候就找找硬件加速方案,嘻嘻

你有种再说一遍 发表于 2024-5-21 20:07:15

Astar会比它快,而且dijkstra也可以并行化,嘻嘻

永不言弃 发表于 2024-5-21 21:08:19

牛,就是不懂这个语言

czb203 发表于 2024-5-21 23:46:18

大佬作品必属精品

dcl1214 发表于 2024-5-22 09:33:37

我经常遇到下面的导航计算

Syu 发表于 2024-5-23 08:34:53

学习了!
大佬作品必属精品

emk 发表于 2024-5-23 17:13:18

大佬作品必属精品:lol:lol
页: [1] 2
查看完整版本: 寻找最短路径-dijkstra算法之CAD版(含程序)