advent_of_code_2021/day_15/vendor/blackscorp/astar/readme.md

108 lines
3.1 KiB
Markdown

## A-Star
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/BlackScorp/astar/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/BlackScorp/astar/?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/BlackScorp/astar/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/BlackScorp/astar/?branch=master)
[![Build Status](https://scrutinizer-ci.com/g/BlackScorp/astar/badges/build.png?b=master)](https://scrutinizer-ci.com/g/BlackScorp/astar/build-status/master)
[A-star](https://en.wikipedia.org/wiki/A*_search_algorithm) is a path finding algorithm, written in PHP.
It can find the shortest path between two points in a two dimensional array by using different heuristics.
## Installation
~~~
composer require blackscorp/astar
~~~
## Usage
first create a two dimensional array for your map
~~~php
$map = [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 0],
];
~~~
each key represent the x and y position of the map.
each value of the array represents the costs, A-star tries to find a way with lowest costs.
you can use negative keys if your map requires it.
next convert the array to a Grid, a Grid is a collection of Nodes.
~~~php
$grid = new BlackScorp\Astar\Grid($map);
~~~
now you can fetch nodes from the Grid like so
~~~php
$startPosition = $grid->getPoint(3,1);
$endPosition = $grid->getPoint(0,0);
~~~
at the end pass the grid to the astar and search for the shortests path
~~~php
$astar = new BlackScorp\Astar\Astar($grid);
$nodes = $astar->search($startPosition,$endPosition);
if(count($nodes) === 0){
echo "Path not found";
}else{
foreach($nodes as $node){
echo $node->getY().'/'.$node->getX().'<br/>';
}
}
~~~
## Settings
by default diagonal directions are disabled, they can be enabled like so
~~~php
$astar->enableDiagonal();
~~~
as soon as the diagonal option is enabled, the algorithm use the [Manhattan](http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html) heuristic to find the shortest path.
Manhattan is not precise but the caluclation costs are low, however you can use another heuristics like Diagonal or Euclidean with following code.
~~~php
$astar->setHeuristic(new BlackScorp\Astar\Heuristic\Euclidean());
~~~
you can also create a custom heuristic.
## Block locations
there are cases where you want to block a specific path completly, independant of the costs, you can do so with following code
~~~php
astar->blocked([3,2]);
~~~
this basicly means that in the initial map
~~~php
$map = [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 2, 2, 0, 0],
[0, 3, 0, 1, 1],
[0, 0, 0, 1, 0],
];
~~~
the values 3 and 2 cannot be passed.
## Contribute
Please feel free to make pull requests, there is still place for improvement, the Grid contains a two dimensional array which might be replaced by an SplFixedArray or something similar.
Run the tests to be sure nothing break.
## License
A-Star is free software distributed under the terms of the MIT license.