A*寻路算法,通过选取节点的优化减少节点访问数量

// 通过优化节点选取,减少节点访问数量 // 额外的思考:只要节点的f最小就直接拿来做当前节点这里可以做个优化。如果多个节点的f值相同,哪个节点的g最大,优先用来做当前节点。因为f相同,g越大,h越小,此节点距离目标更近些。 //好比两条路到目的地的距离相同,但我在其中一条已经走了一大半了,当然选择已经走了一段的路继续走。更早到达目的地的概率大些。 private static Grid findMinGird(ArrayList<Grid> openList) { //优化后的选取,根据生活经验,在f最小的的节点中,应该选择g更大的。 List<Grid> minFGrids = new ArrayList<Grid>(); Grid tempGrid = openList.get(0); minFGrids.add(tempGrid); for (Grid grid : openList) { if (grid.f < tempGrid.f) { tempGrid = grid; minFGrids.clear(); minFGrids.add(grid); } if (grid.f == tempGrid.f && grid != tempGrid) { minFGrids.add(grid); } } Grid[] array = minFGrids.stream().sorted(new Comparator<Grid>() { @Override public int compare(Grid o1, Grid o2) { return o2.g - o1.g; } }).toArray(Grid[]::new); return array[0]; //优化前,只是找一个f最小的 // Grid tempGrid = openList.get(0); // for (Grid grid : openList) { // if (grid.f < tempGrid.f) { // tempGrid = grid; // } // } // return tempGrid; }

原文地址:https://www.cnblogs.com/wllhq/p/14782156.html