【问题标题】:unnecessary movements in my a-star implementation我的 a-star 实施中不必要的动作
【发布时间】:2013-12-31 10:06:51
【问题描述】:

我使用欧几里得启发式算法做了一个一流的实现,它可以工作,但在某些情况下会产生不必要的动作。

截图如下: http://clip2net.com/s/6v2iU4

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

我该如何解决这个问题? 或者a-star应该这样工作,我不需要做任何事情?

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

【问题讨论】:

  • 您的代码中存在错误,或者您的启发式方法不正确(如果启发式方法高估了路径的距离,A* 可能会返回不正确的路径)。没有看到代码,我们无法说出问题所在。
  • 您是否忘记更改找到更好路径的节点的父节点?
  • 好的,生病继续搜索我的代码中的错误,我还添加了代码链接。是的,我(至少我认为是这样)更新父母

标签: path-finding a-star


【解决方案1】:

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

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

// 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
                }
            }
        }
    }
}

【讨论】:

  • 谢谢,但这只会影响路径的结尾,而且我一开始就有问题。似乎我的部分代码应该更新父母以更好的路径只是不起作用))iv在那里放置了一个断点并且它没有停止
  • iv 发现了我的问题所在:我完全误解了 G 成本的概念。 )))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多