Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 回溯-在二维网格中找到最优路径_Java_Recursion_Optimization_Path Finding_Backtracking - Fatal编程技术网

Java 回溯-在二维网格中找到最优路径

Java 回溯-在二维网格中找到最优路径,java,recursion,optimization,path-finding,backtracking,Java,Recursion,Optimization,Path Finding,Backtracking,输入: 目标是找到从起点(S)到目标(G)的最佳路径 我们可以向上、向下、向左和向右移动 成本是路径上所有元素的总和 我的想法是使用回溯,但到目前为止,我只找到了一条路径,但它远远不是最优的 3,4,8,7,3 5,S,7,2,3, 8,5,5,8,10 9,3,3,8,7 6,10,3,G,1 public List getneights(点p,int[][]网格){ 列表邻居=新建LinkedList(); 如果(p.getX()>0){ 添加(新位置(p.getX()-1,p.getY(

输入:

目标是找到从起点(S)到目标(G)的最佳路径

我们可以向上、向下、向左和向右移动

成本是路径上所有元素的总和

我的想法是使用回溯,但到目前为止,我只找到了一条路径,但它远远不是最优的

3,4,8,7,3
5,S,7,2,3,
8,5,5,8,10
9,3,3,8,7
6,10,3,G,1
public List getneights(点p,int[][]网格){
列表邻居=新建LinkedList();
如果(p.getX()>0){
添加(新位置(p.getX()-1,p.getY());
}
if(p.getX()0){
add(新点(p.getX(),p.getY()-1));
}
if(p.getY()
看一下或其他一些

解决方案可以是这样的:

  • 网格中的每个节点都将有两个额外字段-从起点开始的最小成本和到起点的最近节点(在最小成本路径上)
  • 计算可直接从
    S
    访问的所有节点的新字段值,然后移动到成本值最低的节点。有关动画示例,请参见
  • 当您计算所有节点的值时,您也将获得
    G
    的值,并且您可以使用新字段跟踪成本最低的路径

  • 您想要的输出是什么?是这条路吗?还是成本?另外,你似乎正在做DFS,这对我来说是正确的。但似乎你们并没有回溯到目前为止移除路径中存在的任何东西。您只有
    路径。addFirst
    在使用路径时,请考虑删除最后一个元素。我想输出路径及其成本。您好,谢谢您的回答!实际上我已经试过了,但我想学习回溯also@cmplx96AFAIK回溯实际上不能用于找到最短路径。而且你没有回溯。回溯适用于解决数独或类似问题。
    public List<Point> getNeighbours(Point p, int[][] grid) {
        List<Point> neighbours = new LinkedList<>();
        if (p.getX() > 0) {
            neighbours.add(new Position(p.getX() - 1, p.getY()));
        }
        if (p.getX() < grid.length - 1) {
            neighbours.add(new Position(p.getX() + 1, p.getY()));
        }
        if (p.getY() > 0) {
            neighbours.add(new Point(p.getX(), p.getY() - 1));
        }
        if (p.getY() < grid[p.getX()].length - 1) {
            neighbours.add(new Point(p.getX(), p.getY() + 1));
        }
        return neighbours;
    }
    
    private class IntBox {
        int value;
    
        public IntBox(int value) {
            this.value = value;
        }
    
    }
    
    private boolean findPath(int[][] grid, Point current, Point goal LinkedList<Point> path, Set<Point> visited, IntBox minDist, int dist) {
        if (current.getX() == goal.getX() && current.getY() == goal.getY()) {
            minDist.value = Math.min(dist, minDist.value);
            return true;
        }
        for (Point neighbour : getNeighbours(current, grid)) {
            if (visited.contains(neighbour)) {
                continue;
            }
            visited.add(nachbar);
            if (findPath(grid, neighbour, goal, path, visited, minDist, dist+grid[neighbour.getX()][neighbour.getY()])) {
                path.addFirst(nachbar);
                return true;
            }
        }
        return false;
    }