digitsensitive / astar-typescript

A* search algorithm in TypeScript
MIT License
87 stars 18 forks source link

Feature Request: "Get as close as possible" option when the path is blocked #10

Closed sefabaser closed 1 year ago

sefabaser commented 4 years ago

Sample Code

let finder = new AStarFinder({
  grid: {
    matrix: [
      [0, 0, 0, 0],
      [0, 1, 1, 0],
      [0, 1, 0, 1],
      [0, 1, 1, 0]
    ]
  },
  heuristic: 'Manhatten',
  diagonalAllowed: false
});

console.log(finder.findPath({ x: 0, y: 0 }, { x: 3, y: 3 }));

Current Behaviour

Because the path is blocked to target there is no path is found. output: []

Expected Behaviour

Having an option "getAsCloseAsPossible". Which will find to the path to x: 3, y: 1 position. output: [[1, 0], [2, 0], [3, 0], [3, 1]]

Note: It is, of course, possible to find an alternative target position manually. But the next available position to the target is the position x: 2, y: 2 which is also not reachable. The complexity of finding the closest available position is lower on finding it in the shortest path algorithm.

sefabaser commented 2 years ago

Still, this feature is needed, any progress?

digitsensitive commented 1 year ago

@sefabaser Thank you for your input. The Feature was implemented in the latest version 1.2.7. Maybe you can check it out and see if it works for you?

thilidric commented 9 months ago

It does not work.

sefabaser commented 2 months ago

Unfortunately, it does not work. It is giving wrong results.

Sample 1:

    let finder = new AStarFinder({
      grid: {
        matrix: [
          [0, 0, 0, 0],
          [0, 1, 1, 0],
          [0, 1, 0, 1],
          [0, 1, 1, 0]
        ]
      },
      heuristic: 'Manhatten',
      diagonalAllowed: false,
      allowPathAsCloseAsPossible: true
    });
    console.log(finder.findPath({ x: 0, y: 0 }, { x: 3, y: 3 }));

Output: [ [ 0, 0 ], [ 0, 1 ], [ 0, 2 ] ] Expected: [[ 0, 0 ], [1, 0], [2, 0], [3, 0], [3, 1]]

Sample 2:

    let finder = new AStarFinder({
      grid: {
        matrix: [
          [0, 0, 0, 0, 0],
          [0, 1, 1, 1, 0],
          [0, 1, 1, 1, 0],
          [0, 1, 0, 1, 1],
          [0, 1, 1, 0, 0]
        ]
      },
      heuristic: 'Manhatten',
      diagonalAllowed: false,
      allowPathAsCloseAsPossible: true
    });
    console.log(finder.findPath({ x: 0, y: 0 }, { x: 3, y: 3 }));

Output: [] Expected: [[0, 0], [1, 0], [2, 0], [3, 0], [4, 0], [4, 1], [4, 2]]