A *寻路 - 我想我用伪代码把它弄下来,需要验证

时间:2012-02-16 22:35:52

标签: algorithm pseudocode path-finding a-star

他们说,接受别人说的话,重复一遍是验证概念(理解)基础知识的最佳形式。所以,我一直在读A *并将其翻译成伪代码,我想我得到了它。任何人都可以验证和/或提供有关此实施是否有效的提示吗?

对不起,如果这很匆忙,我正在休息工作;)

openList.ClearTiles
closeList.clearTiles
path.clearTiles

openList.Add startTile

While openList.Count > 0 and PathFound = false
    activeTile = openList.GetTileWithLowestPathCost
    openList.remove activeTile
    closeList.add activeTile

    if targetTile.equals(activeTile)
       pathFound = true
    else
       for each activeTile.neighbors as nTile
           if nTile not in openList and not in closeList and IsMovable
              nTile.parent = activeTile
              nTile.hueristic = computeHeuristic
              nTile.movementCost = computeMovementCost
              nTile.pathCost = nTile.hueristic + nTile.movementCost

              openList.add nTile
           elseif isMovable = false
              closelist.add nTile
           endif
       next
    endif
endwhile

if pathFound = true        
   while activeTile.parent is not nothing
       path.insertAtZero activeTile
       activeTile = activeTile.parent
   endwhile
endif

1 个答案:

答案 0 :(得分:0)

您的伪代码和一个小问题是一个主要问题。

主要问题:
当您找到nTile时,它可能已在closedopen中,并且在您的实施中 - 您忽略它并跳过它。但是,如果它处于关闭或打开状态,您应该检查您刚刚找到的路径费用,然后检查closedopen中的路径费用,如果是的,将其从closed / open中移除,然后使用新路径费用将其重新插入open

小问题:
有时候会有一个以上的目标节点[有一组目标节点,你正在寻找其中一个目标节点的路径]。因此,您可以检查if targetTile.equals(activeTile) [假设启发函数为admissible] 或检查if heuristicValue(activeTile) == 0,而不是if activeTile is in targetStates