Program Listing for File main.cpp

Return to documentation for file (main/main.cpp)

#include <iostream>
#include <random>

#include "path_planning/a_star.hpp"
#include "path_planning/ant_colony.hpp"
#include "path_planning/d_star_lite.hpp"
#include "path_planning/dijkstra.hpp"
#include "path_planning/genetic_algorithm.hpp"
#include "path_planning/jump_point_search.hpp"
#include "path_planning/lpa_star.hpp"
#include "path_planning/rrt.hpp"
#include "path_planning/rrt_star.hpp"

int main() {
  constexpr int n = 21;
  std::vector<std::vector<int>> grid(n, std::vector<int>(n, 0));
  MakeGrid(grid);

  std::random_device rd;   // obtain a random number from hardware
  std::mt19937 eng(rd());  // seed the generator
  std::uniform_int_distribution<int> distr(0, n - 1);  // define the range

  Node start(distr(eng), distr(eng), 0, 0, 0, 0);
  Node goal(distr(eng), distr(eng), 0, 0, 0, 0);

  start.id_ = start.x_ * n + start.y_;
  start.pid_ = start.x_ * n + start.y_;
  goal.id_ = goal.x_ * n + goal.y_;
  start.h_cost_ = abs(start.x_ - goal.x_) + abs(start.y_ - goal.y_);
  // Make sure start and goal are not obstacles and their ids are correctly
  // assigned.
  grid[start.x_][start.y_] = 0;
  grid[goal.x_][goal.y_] = 0;
  PrintGrid(grid);

  // Store points after algorithm has run
  std::vector<std::vector<int>> main_grid = grid;

  // Variables for RRT and RRTStar
  constexpr double threshold = 2;
  constexpr int max_iter_x_factor = 20;

  // Variables for Ant Colony Optimization
  constexpr int n_ants = 10;
  constexpr int iterations = 50;
  constexpr double alpha = 1;
  constexpr double beta = 0.7;
  constexpr double evap_rate = 0.3;
  constexpr double Q = 10;

  // Variables for Genetic Algorithm
  constexpr int generations = 10000;
  constexpr int popsize = 30;
  constexpr double c = 1.05;
  constexpr bool shorten_chromosome = true;
  constexpr int path_length_x_factor = 4;

  // Resetting grid
  // Create object for the algorithm
  // Run algorithm
  // Print the final grid using the path_vector

  // clang-format off
  std::cout << "--------------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: DIJKSTRA ---------------------" << '\n'
            << "--------------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  Dijkstra dijkstra(grid);
  {
    const auto [path_found, path_vector] = dijkstra.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  // clang-format off
  std::cout << "--------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: A* ---------------------" << '\n'
            << "--------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  AStar a_star(grid);
  {
    const auto [path_found, path_vector] = a_star.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  // clang-format off
  std::cout << "-----------------------------------------------------------------------" << '\n';
  std::cout << "--------------------- ALGORITHM: Jump Point Search ---------------------" << '\n';
  std::cout << "-----------------------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  JumpPointSearch jump_point_search(grid);
  {
    const auto [path_found, path_vector] = jump_point_search.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  // clang-format off
  std::cout << "--------------------------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: Lifelong Planning A* ---------------------" << '\n'
            << "--------------------------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  LPAStar lpa_star(grid);
  {
    const auto [path_found, path_vector] = lpa_star.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }
  // NOTE: The PrintPath function will not be to show the updated grid for the
  //       live run of LPA* including obstacles discovered during execution.


  // clang-format off
  std::cout << "---------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: RRT ---------------------" << '\n'
            << "---------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  RRT rrt(grid);
  rrt.SetParams(threshold, max_iter_x_factor);
  {
    const auto [path_found, path_vector] = rrt.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  // clang-format off
  std::cout << "----------------------------------------------------------" << '\n';
  std::cout << "--------------------- ALGORITHM: RRT* ---------------------" << '\n';
  std::cout << "----------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  RRTStar rrt_star(grid);
  rrt_star.SetParams(threshold, max_iter_x_factor);
  {
    const auto [path_found, path_vector] = rrt_star.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  // clang-format off
  std::cout << "-------------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: D* Lite ---------------------" << '\n'
            << "-------------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  DStarLite d_star_lite(grid);
  {
    const auto [path_found, path_vector] = d_star_lite.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }
  // NOTE: The PrintPath function will not be to show the updated grid for the
  //       live run of D* Lite including obstacles discovered during execution.

  // clang-format off
  std::cout << "-----------------------------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: Ant Colony Optimization ---------------------" << '\n'
            << "-----------------------------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  AntColony ant_colony(grid);
  ant_colony.SetParams(n_ants, alpha, beta, evap_rate, iterations, Q);
  {
    const auto [path_found, path_vector] = ant_colony.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  // clang-format off
  std::cout << "-----------------------------------------------------------------------" << '\n'
            << "--------------------- ALGORITHM: Genetic Algorithm ---------------------" << '\n'
            << "-----------------------------------------------------------------------" << '\n';
  // clang-format on
  grid = main_grid;
  GeneticAlgorithm genetic_algorithm(grid);
  genetic_algorithm.SetParams(generations, popsize, c, shorten_chromosome,
    static_cast<int>(path_length_x_factor * start.h_cost_));
  {
    const auto [path_found, path_vector] = genetic_algorithm.Plan(start, goal);
    PrintPath(path_vector, start, goal, grid);
  }

  return 0;
}