A-star的曼哈顿启发式函数(A*)我在这里找到了这个算法。我有一个问题,我似乎无法理解如何设置和通过我的启发式方法。staticpublicPathAStar(TNodestart,TNodedestination,Funcdistance,Funcestimate)whereTNode:IHasNeighbours{varclosed=newHashSet();varqueue=newPriorityQueue();queue.Enqueue(0,新路径(开始));while(!queue.IsEmpty){varpath=queue.Dequeue();如果(closed.Contains(path.LastStep))继续;如果(path.LastStep.Equals(destination))返回路径;关闭。添加(路径。最后一步);foreach(TNodeninpath.LastStep.Neighbours){doubled=distance(path.LastStep,n);varnewPath=path.AddStep(n,d);queue.Enqueue(newPath.TotalCost+estimate(n),newPath);}}返回空值;如您所见,它接受2个函数,一个距离函数和一个估计函数。使用受曼哈顿启发的距离函数,我需要采用2个参数。我是否需要修改他的来源并将其更改为接受TNode的2个参数,以便我可以将曼哈顿估计传递给它?这意味着第4个参数将类似于:Funcestimate)whereTNode:IHasNeighbours并将估计函数更改为:queue.Enqueue(newPath.TotalCost+estimate(n,path.LastStep),newPath);对于我的曼哈顿函数是的:privatefloatmanhattanHeuristic(Vector3newNode,Vector3end){return(Math.Abs??(newNode.X-end.X)+Math.Abs??(newNode.Y-end.Y));}好问题。我同意这篇文章令人困惑。我已经更新它来解决你的问题。首先,回答您提出的问题:您是否应该修改给定的代码以采用不同的功能?如果您愿意,当然可以,但是您当然不必这样做。我的建议是传递算法需要的功能,因为这就是它所需要的。为什么要传递算法不需要的信息?怎么做?我给出的A*算法有两个作用。第一个函数给出了两个给定相邻节点之间的确切距离。第二个函数给出给定节点和目标节点之间的估计距离。这是您没有的第二个功能。如果您有一个函数可以给出两个给定节点之间的估计距离,并且您需要一个函数可以给出给定节点和目标节点之间的估计距离,只需构建该函数:FuncestimatedDistanceBetweenTwoNodes=whatever;FuncestimatedDistanceToDestination=n=>estimatedDistanceBetweenTwoNodes(n,destination);你完成了。现在您拥有了所需的功能。这种通过将一个参数固定为某个值来将双参数函数变成单参数函数的技术称为“偏函数应用”,在函数式编程中非常常见。这一切都清楚了吗?现在是第二个更严重的问题。正如我在我的文章中所描述的,算法的正确操作是基于对函数的保守估计。你能保证到曼哈顿的距离永远不会被高估吗?这似乎不太可能。如果网格中的任何地方都有“对角线”街道,那么曼哈顿距离就会高估两点之间的最佳距离,A*算法将无法找到它。大多数人使用欧氏距离(也称为L2范数)作为A*算法,因为根据定义,两点之间的最短距离不会被高估。你为什么使用曼哈顿距离?我很困惑为什么你认为这是个好主意。是的,你需要修改你的代码,因为没有必要使用带有两个TNode参数的估计方法。以上就是C#学习教程:A-star的曼哈顿启发式函数(A*)分享的全部内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: