私はここでこのアルゴリズムを見つけました。
問題があります。ヒューリスティック関数を設定して渡す方法が理解できないようです。
static public Path<TNode> AStar<TNode>(TNode start, TNode destination,
Func<TNode, TNode, double> distance,
Func<TNode, double> estimate) where TNode : IHasNeighbours<TNode>
{
var closed = new HashSet<TNode>();
var queue = new PriorityQueue<double, Path<TNode>>();
queue.Enqueue(0, new Path<TNode>(start));
while (!queue.IsEmpty)
{
var path = queue.Dequeue();
if (closed.Contains(path.LastStep))
continue;
if (path.LastStep.Equals(destination))
return path;
closed.Add(path.LastStep);
foreach (TNode n in path.LastStep.Neighbours)
{
double d = distance(path.LastStep, n);
var newPath = path.AddStep(n, d);
queue.Enqueue(newPath.TotalCost + estimate(n), newPath);
}
}
return null;
}
ご覧のとおり、距離関数と推定関数の2つの関数を受け入れます。
マンハッタンヒューリスティック距離関数を使用して、2つのパラメーターを取得する必要があります。彼のソースを変更して、マンハッタンの見積もりを渡すことができるように、TNodeの2つのパラメーターを受け入れるように変更する必要がありますか?これは、4番目のパラメータが次のようになることを意味します。
Func<TNode, TNode, double> estimate) where TNode : IHasNeighbours<TNode>
推定関数を次のように変更します。
queue.Enqueue(newPath.TotalCost + estimate(n, path.LastStep), newPath);
私のマンハッタン関数は次のとおりです。
private float manhattanHeuristic(Vector3 newNode, Vector3 end)
{
return (Math.Abs(newNode.X - end.X) + Math.Abs(newNode.Y - end.Y));
}