Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >实现A*算法

实现A*算法
EN

Stack Overflow用户
提问于 2013-03-30 23:15:16
回答 1查看 6.7K关注 0票数 6

所以我用C语言实现了A*算法,下面是程序。

对于所有打开的节点,我使用了使用数组的优先级队列。由于我将有重复的距离,即多个节点具有相同的距离/优先级,因此在PQ中插入节点时,如果所插入节点的父节点具有相同的优先级,我仍然交换这两个节点,以便最新输入的成员保持在顶部(或尽可能高),以便我继续沿着特定的方向前进。此外,在删除时,当我将最上面的元素与最后一个元素交换时,如果交换的最后一个元素与它的一个子元素相同,那么它将被交换到底部。(我不确定这是否会有任何影响)。

现在的问题是,假设我有一个100*100的矩阵,我有从(0,20)到(15,20)的2D阵列的障碍物,我正在其中移动。现在对于开始位置(2,2)和结束位置(16,20),我得到了一条直线,即首先一直向右走,然后向下走到15,然后向右移动一次,我就完成了。

但是,如果我从(2,2)开始,最后作为(12,78),即点被障碍物隔开,路径必须绕过它,我仍然通过(16,20),并且我在(16,20)之后的路径仍然是直的,但我向上到(16,20)的路径是Z字形的,即我向下直走,然后向右,然后向下,然后向右,依此类推,最终到达(16,20),然后直走。

当我的目的地是(16,20)而不是(12,78)时,我可以做些什么来确保我的路径是笔直的,为什么前半段的路径是Z字形的?

谢谢。

代码语言:javascript
运行
AI代码解释
复制
void findPath(array[ROW][COLUMN],sourceX,sourceY,destX,destY) {
  PQ pq[SIZE];
  int x,y;

  insert(pq,sourceX,sourceY);

  while(!empty(pq)) {
    remove(pq);
    if(removedIsDestination)
        break;                  //Path Found
    insertAdjacent(pq,x,y,destX,destY);
  }
}

void insert(PQ pq[SIZE],element){
  ++sizeOfPQ;
  PQ[sizeOfPQ]==element
  int i=sizeOfPQ;
  while(i>0){
    if(pq[i].priority <= pq[(i-1)/2].priority){
      swapWithParent
      i=(i-1)/2;
    }
    else
      break;
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 23:37:32

你应该改变你的计分部分。现在你可以计算绝对距离。而是计算最小移动距离。如果你把每一次移动都算作一次,那么如果你在(x,y)并去(dX,dY),那就是

代码语言:javascript
运行
AI代码解释
复制
distance moved + (max(x,dX) - min(x,dx) + max(y,dY) - min(y,dY))

较低的值被视为较高的分数。

这个试探法是对如果没有任何阻碍的情况下它会采取多少步的猜测。

启发式的好处是你可以改变它来得到你想要的结果,例如,如果你更喜欢按照你的建议在直线上移动,那么你可以做这样的改变:

代码语言:javascript
运行
AI代码解释
复制
= distance moved + (max(x,dX) - min(x,dx) + max(y,dY) - min(y,dY)) 
     + (1 if this is a turn from the last move)

这将使您“找到”倾向于同一方向的解决方案。

如果你想强迫尽可能少的转弯:

代码语言:javascript
运行
AI代码解释
复制
= distance moved + (max(x,dX) - min(x,dx) + max(y,dY) - min(y,dY)) 
     + (1 times the number of turns made)

这就是A*的好处--启发式将通知搜索--你仍然会找到一个解决方案,但如果有不止一个解决方案,你可以影响你首先看哪里--这使得它很适合模拟AI行为。

怀疑:第一种计算方法和第二种计算方法有什么不同?

第一个将较低的优先级放在一个转弯的走法上。第二种方法在转弯较多的道路上设置较低的优先级。在某些情况下(例如,第一个转弯),数值将是相同的,但在所有第二个转弯路径中,会选择转弯尽可能少的路径,而第一个转弯路径可能不会。

另外,如果这是上一步的转弯,假设我的源在左上角,目标在右下角,现在我的路径通常是,left,left,left...down,down,down....。现在,如果这是上一步的转弯,根据这个,当我从左转到下,我会加1吗?

不会使总价值更大,而向下的优先级将会降低。

是的,完全正确。你不想先看那些有转折的选择。这将使它们具有较低的优先级,并且您的算法将研究具有较高优先级的其他选项--这正是您想要的。

当我移动到一个单元格时,如果这是从上一步开始的一个转弯,那是不是与之前处理过的单元格相邻?

或1?唐克斯-

不,我不理解这个问题--我认为在这种情况下没有意义-,所有的移动都必须与前一个单元相邻,对角线移动是不允许的。

,如果你能告诉我第一个和第二个方法会给出不同的答案,我会非常感激。如果可以的话。非常感谢。:):

如果看不到算法的细节就不是那么容易了,但以下方法可能会起作用:

红色的是积木。果岭是我希望第一个人做的,它在当地试图找到最少的转弯。蓝色是最小转数的解决方案。请注意,红色区域彼此之间有多远,以及算法如何影响这一点的细节。正如我上面所说的--在启发式中,多转一圈只需要花费1。所以,如果你想确保这个方法能正常工作,就像下面这样修改启发式:

代码语言:javascript
运行
AI代码解释
复制
= distance moved + (max(x,dX) - min(x,dx) + max(y,dY) - min(y,dY)) 
     + (25 times the number of turns made)

其中25大于通过绿色小路第二个转弯的距离。(因此,在第二个转弯后,将搜索蓝色路径。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15724563

复制
相关文章
为什么我选择使用原型工具来代替纸原型
从毕业到现在的三年设计生涯中,对于设计我有自己的理解。从一开始的伟大梦想——通过我的设计改变世界,到现在的现实需求——设计得让人觉得有用,易用,好用。在大学的时候,导师会叫我们只用纸笔来做原型图,这样能更直观地看出我们的想法和信息架构。刚工作的时候,我也习惯只用纸笔来画原型图,这样能快速地表达我的想法。 纸笔原型毕竟使用的工具很简单,人人都有,只需要纸笔即可。纸原型关注的是流程而不是具体的细节,构建原型很快速,也并不用画的很精美只需要表达出界面的流程和关健信息。纸原型的好处就在于与他人沟通的时候可以进行
奔跑的小鹿
2018/03/16
8030
为什么我选择使用原型工具来代替纸原型
为什么我选择使用原型工具来代替纸原型
从毕业到现在的三年设计生涯中,对于设计我有自己的理解。从一开始的伟大梦想——通过我的设计改变世界,到现在的现实需求——设计得让人觉得有用,易用,好用。在大学的时候,导师会叫我们只用纸笔来做原型图,这样能更直观地看出我们的想法和信息架构。刚工作的时候,我也习惯只用纸笔来画原型图,这样能快速地表达我的想法。
奔跑的小鹿
2019/01/31
7220
为什么我选择使用原型工具来代替纸原型
为什么SQL优化中建议用UNION来代替OR
在SQL优化相关资料中,通常可以看到一个建议:用UNION来代替OR 举例 采用 OR 语句: SELECT * FROM a, b WHERE a.p = b.q or a.x = b.y; 采用 UNION 语句,返回的结果同上面的一样,但是速度要快些: SELECT * FROM a, b WHERE a.p = b.q UNION SELECT * FROM a, b WHERE a.x = b.y UNION 语句中明明是会执行两次查询操作,而 OR语句只有一次查询,OR语句反而
dys
2018/04/02
6.2K0
为什么SQL优化中建议用UNION来代替OR
电脑的 ip 是怎么来的呢?我又没有配置过
显然,这里有两种配置方式,一种是自动获取 ip 地址,一种是我们手动来设置,我相信大部分人都是通过自动获取的方式来得到 ip 的,那么问题来了,它是如何自动获得到的呢?
帅地
2019/06/06
1.3K0
电脑的 ip 是怎么来的呢?我又没有配置过
html是什么?如何正确使用html呢?
html的格式相信大家都经常见到过,但是对html的用途和使用估计有部分的朋友会不了解,html常用于程序编程,静态网页,网页链接等作为标记符号使用,那么具体的html是什么?如何正确使用html呢?对此问题,接下来就为大家做出简单易懂的介绍,想要了解的朋友就过来了解一下吧。
用户8715145
2021/06/17
2.1K0
CPS推广:为什么我的佣金还没有到账呢
CPS推广奖励的佣金,目前无法直接后台提现,需要在次月月结之后,由财务系统统一打款到银行,即推广者后台所填写的银行账号,一般上月佣金,次月月末到账,具体时间以银行到账为准。
腾讯云-推广奖励
2019/11/28
10.8K0
CPS推广:为什么我的佣金还没有到账呢
copykat为什么没有infercnv直观呢
其实 copykat 仅仅是算法判别的时候不如人意,但是可视化的时候仍然是肉眼可以明显区分二倍体正常细胞和非整倍体的癌症细胞,所以我们想看看具体做什么改进,可以绕过这个bug,首选项我们把全部的上皮细胞按照病人进行了拆分,得到如下所示 的每个病人独立的文件夹以及每个文件夹下面的expFile.txt !
生信技能树jimmy
2021/12/04
2.2K0
copykat为什么没有infercnv直观呢
unicloud进阶uni-id入门(一)---uni-id能做什么?
这个专栏就带大家使用uni-id 由于要写毕设和论文 所以会更新很慢 如果你对云开发感兴趣 可以加入交流群 974178910 535620886
代码哈士奇
2021/10/25
7640
unicloud进阶uni-id入门(一)---uni-id能做什么?
为何cytoscape总是说我没有java呢
因为最近自己购置了一个全新的Windows电脑,所以就系统性的配置了全部的生物信息学相关软件,当然是也包括cytoscape啦。但是遇到了报错,如下:
生信技能树
2020/07/30
2.3K0
为何cytoscape总是说我没有java呢
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
搜云库技术团队
2023/10/21
2210
为什么 MyBatis 源码中,没有我那种 if···else
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
一行Java
2023/09/19
2500
为什么 MyBatis 源码中,没有我那种 if···else
HTML中id、name、class 区别
id的用途  1) id是HTML元素的Identity,主要是在客户端脚本里用。
阳光岛主
2019/02/19
2.6K0
hdp 不更新了,有没有办法将 Apache Hadoop 代替 hdp 并集成到 Ambari 中呢?
今天咱来聊一聊 Ambari 如何集成 Apache Hadoop 哈,自从 cloudera 公司将 hortonworks 公司收购后,hdp 就不迭代更新了,这对 Apache Ambari 也产生了很大影响,毕竟 Ambari 与 hdp 耦合性很强。
create17
2022/11/17
3.5K1
使用LocalDateTime来代替Date
在我们使用Date的时候,会发现很多无法理解的返回值,而且有很多方法是已经被弃用了的
挨踢小子部落阁
2020/01/02
1.6K0
Postgre中FDW能做什么?
什么是FDW? FDW是外部数据包装器,早在2003年SQL标准中添加一个访问远程数据的规范,这个称为SQL外部数据管理。PostgreSQL从9.1版本已经开发出了FDW.在PostgreSQL中配
用户4700054
2022/08/17
1.6K0
Postgre中FDW能做什么?
selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘
pycharm新建了一个项目,用于做web自动化测试,直接安装了selenium这个库,发现之前写的Selenium元素定位的代码运行之后会报错,发现是Selenium更新到新版本(4.x版本)后,以前的一些常用的代码的语法发生了改变,当然如果没有更新过或是下载最新版本的Selenium是不受到影响的,还可以使用以前的写法。接下来就是讨论有关于新版本后Selenium定位元素代码的新语法,大家后面别再踩这个坑了。
霍格沃兹测试开发Muller老师
2022/12/01
5.2K0
python中利用try..except来代替if..else
在有些情况下,利用try…except来捕捉异常可以起到代替if…else的作用。 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的
用户7886150
2020/12/20
5630
为什么不用Preact或者Fast-React来代替React ?
戳蓝字“IMWeb前端社区”关注我们哦! 1写在前面 生命在于折腾,Coder的折腾就在于造各种轮子。 React在前端圈大火之后,轮子层出不穷。而其中的一些轮子,由于专注于解决很多人诟病的React过大、过慢的问题(然而不并不觉得),也相当出名。关注最多的莫过于Preact、Inferno等以「轻量化」为特色的库了,Github Star数也超过10000。另外由于React广泛应用于同构应用上,并且 rendertoString,renderToStaticMarkup 也存在同步执行、速度慢等问题,一
用户1097444
2022/06/29
3940
为什么不用Preact或者Fast-React来代替React ?
为什么AlertDialog要使用Builder来构建呢
首先说句废话,因为 AlertDialog 太过复杂,内部参数太多,然后不使用构建者模式那么 AlertDialog 的构造方法就可能是:
开发者
2019/12/26
5330
文章是原创的,为什么网站没有收录呢?
刚进入seo领域就知道原创文章对于网站的收录、展现量、权重等的影响,所以保证网站内容的原创度是seoer的基本功,但往往你的内容是原创的,但网站迟迟没有收录,让很多seoer感到迷茫,其实问题不一定只出现在文章上,你还应做以下分析:
蝙蝠侠IT
2021/05/19
6560
文章是原创的,为什么网站没有收录呢?

相似问题

在派生类C++中访问受保护成员

10

如何延迟C++基类中成员的初始化,直到执行派生类的ctor?

20

派生类中基类委托ctor的c++使用

10

访问派生类中类的受保护成员

24

C++:无法从派生类访问受保护成员

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档