2012-02-16 20 views
1

誰かが言ったことを取り返してそれを繰り返すことは、コンセプトの基礎を理解する最良の方法です。だから、私はA *を読んで擬似コードに変換しています。私はそれを得たと思います。誰でもこの実装が機能するかどうかを確認したり、ヒントを書いたりできますか?あなたの擬似コードと1つのマイナーな問題で)*パスファインディング - 私は疑似コードでそれを持っていると思う、検証が必要だと思う。

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

まあ一つの大きな問題は、これが殺到した場合

申し訳ありませんが、私は仕事で休憩に思います。

大きな問題:あなたはnTileを見つけたら
、それはclosed中、またはすでにopenに、そしてあなたの実装であるかもしれない - あなたはそれを無視して、それをスキップ。しかし、それが閉じているか開いている場合はの場合は、見つかったパスコストがで、パスコストがclosedまたはopenであるかどうかを確認してください。それがある場合は、closed/openから削除して再度挿入してくださいそれは新しいパスコストでopenになります。

マイナーな問題:
ターゲットノードが複数ある場合があります[ターゲットノードのセットがあり、それらのいずれかのパスを探しています]。したがって、if targetTile.equals(activeTile)の代わりに、if heuristicValue(activeTile) == 0 [ヒューリスティック関数がadmissible]またはif activeTile is in targetStatesであると仮定してチェックすることができます。

+0

Oohはどちらも簡単に修正できます。ありがとう、これは私が基本的な考えを落としたので、今実装するのがはるかに簡単になるはずです! –

関連する問題