【问题标题】:backtracking - find optimal path in 2-d grid回溯 - 在二维网格中找到最佳路径
【发布时间】:2018-03-02 14:49:28
【问题描述】:

输入:

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

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

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

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

我的想法是使用回溯,但是到目前为止我只设法找到了一条路径,但这远非最佳。

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;
}

【问题讨论】:

  • 你想要的输出是什么?是路径吗?还是成本?此外,您似乎正在做 DFS,这对我来说是正确的。但是,到目前为止,您似乎并没有通过删除路径中的任何内容来回溯。完成路径后,您只有 path.addFirst 考虑删除最后一个元素。
  • 我想输出路径及其成本。

标签: java recursion optimization path-finding backtracking


【解决方案1】:

看看Dijkstra's algorithm 或其他shortest path problem solutions

解决方案可能是这样的:

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

【讨论】:

  • 嗨,感谢您的回答!我实际上已经尝试过了,但我也想学习回溯
  • @cmplx96 AFAIK 回溯不能真正用于找到最短路径。而且你没有回溯。回溯非常适合解决数独或类似问题。
猜你喜欢
  • 2020-01-11
  • 2016-10-31
  • 2012-09-04
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多