Find the shortest path to retrieve all the objects in the own location
composer require ggggino/warehouse-path
use GGGGino\WarehousePath\Warehouse;
public static function getSampleData()
{
return array(
array(array('weight' => 2), array('weight' => 1), array('weight' => 100), array('weight' => 1), array('weight' => 2), array('weight' => 1)),
array(array('weight' => 2), array('weight' => 1), array('weight' => 100), array('weight' => 1), array('weight' => 2), array('weight' => 1)),
array(array('weight' => 2), array('weight' => 1), array('weight' => 100), array('weight' => 1), array('weight' => 2), array('weight' => 1)),
array(array('weight' => 2), array('weight' => 2), array('weight' => 2), array('weight' => 2), array('weight' => 2), array('weight' => 1))
);
}
/** @var Warehouse $warehouse */
$warehouse = Warehouse::createFromMatrix(self::getSampleData());use GGGGino\WarehousePath\Warehouse;
$loc1 = new Location('L1');
$loc2 = new Location('L2');
$loc3 = new Location('L3');
$corridor1 = new Location('C1');
$loc1->setBottomRef($loc2);
$loc1->setRightRef($loc3);
$loc3->setBottomRef($loc3);
$arrayPlaces = array($loc1, $loc2, $loc3, $corridor1);
/** @var Warehouse $warehouse */
$warehouse = Warehouse::createFromTree($arrayPlaces);Look here and Here for a correct json used to build the warehouse
use GGGGino\WarehousePath\Warehouse;
/** @var Warehouse $warehouse */
$warehouse = Warehouse::createFromJson(getcwd() . "/resources/simpleWarehouse.json")// Instantiate a place collector that contain the type of available places
$placesCollector = new PlacesCollector();
// optionally add the baseplace types (Location, Corridor, Wall)
$placesCollector->addBasePlaceTypes();
// Istantiate the Parser to prepare the places in an array
$wm = new MatrixParser($param, $placesCollector);
// Istantiate a customizable Breadcrumb buider
$breadcrumbBuilder = new BreadthFirstBreadcrumb($placesCollector);
$instance = new Warehouse($placesCollector, $wm, $breadcrumbBuilder);
$instance->setPlaces($wm->parse());/** @var Place $nodeStart */
$nodeStart = $calculatedArray[4];
$warehouse->getPath($nodeStart);Call the Warehouse::getPath for every single location passed in the array
/** @var Place[] $arrayNodes array of the places to touch */
$arrayNodes = [...]
$matrix = $warehouse->getMultiplePath($arrayNodes);Calculate the best path to touch every location from the matrix of proximity
/** @var Place[] $arrayNodes array of the places to touch */
$arrayNodes = [...]
$arrayNodeSorted = $warehouse->calculate($arrayNodes, $matrix);With this function you get the best path to follow to touch every location in the warehouse/matrix.
Places are the main factor for calculating the best path from a Point A to B.
A warehouse can be seen as a matrix of Place that every item has own weight. From this, the program can create the best path:
Lx = Location - Weight 1
Wx = Wall - Weight 100
Cx = Corridor - Weight 2
| L1 | W1 | L8 |
|---|---|---|
| L2 | W2 | L7 |
| L3 | C1 | L6 |
| L4 | C2 | L5 |
Imagine you start from the Place "L1", the best path to "L7" will be:
L1 -> L2 -> L3 -> C1 -> L6 -> L7
So the distance, adding all the weight in the path, will be:
1 + 1 + 1 + 2 + 1 = 6
This library starts with these three places:
| Name | Weight | Walkable |
|---|---|---|
| Corridor | 2 | true |
| Location | 1 | true |
| Wall | 100 | false |
You can add as many type of Place as you want.
Read the complete doc about Places
The breadcrumb builder aim to create a matrix from the array of all places. This matrix will be passed to the calculator that calculate the correct order which is the correct path to touch all the places with the less cost possible.
With this method I map the wharehouse expanding the area and keep in mind the previous state on every step. In this way I can realize a wharehouse that every place knows the shortest path to specific point
Read the complete doc about Breadcrumb
The calculator is the method that choose the best order to touch every location listed. At the moment only one type of calculation is available.
In the matrix builded from the distance between every location, I chose for every location the closer location.
