我正在编写一个程序的一小部分,我必须编写一个寻路算法。该函数接收所谓的“路径”,每个路径定义2D空间中的起点和终点。该算法需要找到最短且最有效(在某种程度上)的路径(从原点)来通过这些路线,从而最大限度地减少总体行进距离。
我做了一些研究,开始了一条我认为可行的道路。到目前为止,我已经将路线转换为有向图,所有这些图都被链接起来,好像它是一个理想化的路线图。然后我尝试在此图表上执行A *搜索。我使用的启发式算法计算了剩余行进的“路线”的总距离,并且使用的起点(G)值的距离仅仅是到达当前点的累积距离。这适用于某些输入,但其他人根本没有返回任何路径,我似乎无法找出原因。
我的启发式是否有可能是错误的,这会导致某处错误计算,或者A *程序本身错误的可能性更大?或者我在这里完全错误的轨道?
我将把getPath函数放在下面(用Java编写)以防万一。
提前致谢。
public ArrayList<Vector2> getPath()
{
PriorityQueue<SearchNode> openList = new PriorityQueue<SearchNode>(10, new SearchNodeComparator());
ArrayList<SearchNode> closedList = new ArrayList<SearchNode>();
map.startJobs();
searchDepth = 0;
SearchNode start = searchableGraph.getNode(new Vector2(0, 0));
int goalsLeft = map.getJobCount();
start.setDistanceTraveled(0);
openList.add(start);
while (openList.size() > 0)
{
SearchNode current = openList.peek();
searchDepth++;
if (map.isJobEndPoint(current.getValue()))
{
map.completeJob(current.getValue());
goalsLeft--;
}
if (reachedGoalState(current, searchableGraph.getNodes().size()))
{
return getFinalPath(current);
}
else
{
ArrayList<SearchNode> neighbours = getNeighbours(current);
for (int i = 0; i < neighbours.size(); i++)
{
SearchNode node = neighbours.get(i);
System.out.print("Inspecting node" + node.getValue().toString());
float distanceTraveled = current.getDistanceTraveled() + getDistance(current.getValue(), node.getValue());
float heuristic = heuristic(node);
if (!openList.contains(node) && !closedList.contains(node))
{
node.setDistanceTraveled(distanceTraveled);
node.setDistanceToGoal(distanceTraveled + heuristic);
node.setParent(current);
openList.add(node);
}
else if(openList.contains(node))
{
if (node.getDistanceTraveled() <= distanceTraveled)
{
node.setDistanceToGoal(distanceTraveled + heuristic);
node.setParent(current);
}
}
}
openList.remove(current);
closedList.add(current);
}
}
return new ArrayList<Vector2>();
}
答案 0 :(得分:0)
我使用的启发式算法计算了剩余行程的“路线”的总距离
A *使用的启发式必须是admissible;也就是说,它必须永远不会超过估计距离结束的距离。
如果我理解你的描述正确,你的启发式不可接受,所以不能保证工作。