<?php
require_once('params.php');
require_once('Graph.php');
require_once('PathFinder.php');
require_once('Sylvane.php');
/**
* Returns the unvisited nearest bin.
*
* @param string $start
* The starting point of the bin.
* @param array $bins
* The array of subset of the bins.
* @param array $visited
* The array of visited bins.
* @param array $distances
* The distance between all pairs in the graph.
* @param array $bin_mapping
* The associaitve array of mapping bin to the node id.
*/
function getNearestBin($start, $bins, $visited, $distances, $bin_mapping) {
// Get the index of the bin in the graph.
$start_node_id = $bin_mapping[$start];
// Get all the unvisited bins.
$unvisited_bins = array_values(array_diff($bins, $visited));
// Select the first bin as the nearest.
$nearest = $unvisited_bins[0];
// Get the index of the nearest bin.
$nearest_node_id = $bin_mapping[$nearest];
// Get the distance of the bin from the start to the nearest bin.
$dist = $distances[$start_node_id][$nearest_node_id];
for($i = 0; $i < count($unvisited_bins); $i++) {
// Get the bin at ith index.
$bin = $unvisited_bins[$i];
// If a shortest distance bin is found then update the nearest bin.
if($distances[$start_node_id][$bin_mapping[$bin]] < $dist) {
$nearest = $bin;
$nearest_node_id = $bin_mapping[$nearest];
$dist = $distances[$start_node_id][$nearest_node_id];
}
}
return $nearest;
}
// Instantiate the graph.
$graph = new Graph ( $num_nodes );
// Setup the graph by adding edges and nodes.
foreach ($edges as $edge) {
$graph->addEdge ( $edge[0], $edge[1] );
}
// Get all the bins.
$bins = array_keys( $bin_mapping );
$bins = array_diff( $bins, ['start'] );
// Initialize the Sylvance class object.
$sylvane = new Sylvane( $bins );
// Get 12 random bins.
$random_bins = $sylvane->getRandomBins ( 12 );
// Instantiate the PathFinder class object.
$path_finder = new PathFinder ( $graph );
// Get all distances.
$distances = $path_finder->getDistances();
// Get all paths.
$paths = $path_finder->getPaths();
// Initally no bin is visited.
$visited = [];
// Start from the start position in the warehouse.
$current_node = 'start';
// Store the final path.
$final_path = ['start'];
// Store the path in the graph with node ids.
$exact_path = [14];
while(count($visited) <= 12) {
if(count($visited) < 12) {
// Get the nearest bin.
$nearest = getNearestBin($current_node, $random_bins, $visited, $distances, $bin_mapping);
} else {
$nearest = 'start';
}
// Mark the nearest bin as visited.
$visited[] = $nearest;
// Get the path from the current node to the nearest bin.
$current_path = $paths[$bin_mapping[$current_node]][$bin_mapping[$nearest]];
// Add the path to the exact path.
for($i = 1; $i < count($current_path); $i++) {
$exact_path[] = $current_path[$i];
}
// Update the current node.
$current_node = $nearest;
// Add the nearest bin to the final path.
$final_path[] = $nearest;
}
echo "Random Bins selected are:\n---\n";
foreach($random_bins as $bin) {
echo $bin . "\n";
}
echo "\n\nThe optimal bin visiting order is as follows:\n---\n";
$i = 0;
foreach($final_path as $bin) {
echo $bin;
if($i == count($final_path) - 1) {
echo "\n";
} else {
echo " -> ";
}
$i++;
}
echo "\n\nThe exact path in the graph is as follows with a total distance of " . count($exact_path) . " steps:\n---\n";
$i = 0;
foreach($exact_path as $node) {
echo $node;
if($i == count($exact_path) - 1) {
echo "\n";
} else {
echo " -> ";
}
$i++;
}
// Random Bins selected are:
// ---
// B1
// B4
// A6
// A7
// A10
// C1
// C5
// C11
// F2
// F9
// E11
// G5
// The optimal bin visiting order is as follows:
// ---
// start -> C1 -> C5 -> C11 -> E11 -> F9 -> F2 -> B1 -> B4 -> A6 -> A7 -> A10 -> G5 -> start
// The exact path in the graph is as follows with a total distance of 73 steps:
// ---
// 14 -> 15 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 60 -> 61 -> 38 -> 37 -> 36 -> 35 -> 34 -> 33 -> 32 -> 31 -> 30 -> 29 -> 28 -> 27 -> 26 -> 55 -> 54 -> 13 -> 53 -> 52 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 58 -> 59 -> 25 -> 60 -> 61 -> 38 -> 62 -> 63 -> 51 -> 50 -> 49 -> 48 -> 47 -> 46 -> 45 -> 44 -> 43 -> 42 -> 41 -> 40 -> 39 -> 57 -> 56 -> 26 -> 55 -> 54 -> 13 -> 14
|