他们说,接受别人说的话,重复一遍是验证概念(理解)基础知识的最佳形式。所以,我一直在读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
答案 0 :(得分:0)
您的伪代码和一个小问题是一个主要问题。
主要问题:
当您找到nTile
时,它可能已在closed
或open
中,并且在您的实施中 - 您忽略它并跳过它。但是,如果它处于关闭或打开状态,您应该检查您刚刚找到的路径费用,然后检查closed
或open
中的路径费用,如果是的,将其从closed
/ open
中移除,然后使用新路径费用将其重新插入open
。
小问题:
有时候会有一个以上的目标节点[有一组目标节点,你正在寻找其中一个目标节点的路径]。因此,您可以检查if targetTile.equals(activeTile)
[假设启发函数为admissible] 或检查if heuristicValue(activeTile) == 0
,而不是if activeTile is in targetStates
。