2.0.4 • Published 3 years ago

@remvst/path-finder v2.0.4

Weekly downloads
-
License
UNLICENSED
Repository
-
Last release
3 years ago

Path Finder

Generic path finder implementation. Can be used for paths but also for more general problems.

The best possible path is not guaranteed, but the path finder will try its best to find a path as quickly as possible.

Usage

Generic Problem Solving

const PathFinder = require('@remvst/path-finder');

// Prepare the path finder
const pf = new PathFinder({
    'hash': state => someUniqueString(state)
    'neighbors': state => neighborsOf(state),
    'heuristic': (state, target) => naiveDistanceBetween(state, target),
    'isTarget': (position, target) => equals(position, target),
    'distance': (positionA, positionB) => actualDistanceBetween(positionA, positionB)
});

// Find a path
const result = pf.findPath(
    [possibleSource1, possibleSource2],
    myTarget
);

if (result.found) {
    console.log(result.steps); // path.steps is the list of states to reach the target
}

Maze

const maze = [
    [0, 0, 1, 0, 0, 0, 1, 0],
    [0, 0, 1, 0, 1, 0, 1, 0],
    [0, 0, 1, 0, 1, 0, 1, 0],
    [0, 0, 1, 0, 1, 0, 1, 0],
    [0, 0, 0, 0, 1, 0, 1, 0]
];

function newCell(row, col) {
    return {'row': row, 'col': col};
}

const pf = new PathFinder({
    'hash': position => position.row + '-' + position.col,
    'neighbors': position => {
        return [
            newCell(position.row + 1, position.col),
            newCell(position.row, position.col - 1),
            newCell(position.row, position.col + 1),
            newCell(position.row - 1, position.col)
        ].filter(position => {
            return position.row >= 0 && position.col >= 0 && position.row < maze.length && position.col < maze[0].length;
        }).filter(position => {
            return maze[position.row][position.col] === 0;
        });
    },
    'heuristic': (position, target) => {
        return Math.abs(position.row - target.row) + Math.abs(position.col - target.col);
    },
    'isTarget': (position, target) => {
        return position.row === target.row && position.col === target.col;
    },
    'distance': (positionA, positionB) => {
        return Math.abs(positionA.row - positionB.row) + Math.abs(positionA.col - positionB.col);
    }
});

const result = pf.findPath(
    [newCell(0, 0)],
    newCell(4, 5)
);

if (result.found) {
    console.log(result.steps); // path.steps is the list of states to reach the target
}
2.0.4

3 years ago

2.0.3

3 years ago

2.0.2

3 years ago

2.0.1

3 years ago

2.0.0

3 years ago

1.0.0

5 years ago