首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的a-star实现中不必要的移动

我的a-star实现中不必要的移动
EN

Stack Overflow用户
提问于 2013-12-31 18:06:52
回答 1查看 131关注 0票数 0

我用欧几里得启发式算法做了一个a-star实现,它是有效的,但在某些情况下会做不必要的移动。

这是屏幕截图:http://clip2net.com/s/6v2iU4

路径从蓝色的圆圈开始,理论上,它右边的单元格的F(移动成本+启发式成本)较小,因此a-star优先使用它,但它最终不是构建最短路径。

我该如何解决这个问题呢?或者a-star应该以这种方式工作,而我不需要做任何事情?

我的代码:http://pastebin.com/02u33jY6 (h + cpp)

EN

回答 1

Stack Overflow用户

发布于 2013-12-31 19:03:02

您的算法的问题是,当您的实现在openList中找到目的地时,它会返回路径。

当目的节点在closedList中,而不是在开放列表中时,A*应该终止。

代码语言:javascript
复制
// check if there is dst node on the closed list
for ( unsigned int i = 0; i < closedList.size(); i++ )
{
    if ( closedList.at( i ).getIndex() == dstTileIndex )
    {
        GSPathFinderNode* backtrackNode = &closedList.at( i );
        resultPathNodes->insert( resultPathNodes->begin(), GSCommonMapNode( backtrackNode->getIndex(),
                                                                           backtrackNode->getPosX(),
                                                                           backtrackNode->getPosY() ) );

        while ( 1 )
        {
            for ( unsigned int j = 0; j < closedList.size(); j++ )
            {
                if ( closedList.at( j ).getIndex() == backtrackNode->getParentNodeIndex() )
                {
                    backtrackNode = &closedList.at( j );
                    resultPathNodes->insert( resultPathNodes->begin(), GSCommonMapNode( backtrackNode->getIndex(),
                                                                                       backtrackNode->getPosX(),
                                                                                       backtrackNode->getPosY() ) );

                    if ( backtrackNode->getIndex() == srcTileIndex )
                        return true; // success
                }
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20855544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档