Skip to content
Snippets Groups Projects
Commit 3249e1b3 authored by awenjb's avatar awenjb
Browse files

Add Sorting Strategy

- add shuffle as basic sorting strategy
- add getter  to Solution
parent 54e16ee5
No related branches found
No related tags found
No related merge requests found
...@@ -34,6 +34,7 @@ add_executable(pdptw src/mains/main.cpp ...@@ -34,6 +34,7 @@ add_executable(pdptw src/mains/main.cpp
src/lns/modification/route/insert_route.cpp src/lns/modification/route/insert_route.cpp
src/lns/modification/route/remove_route.cpp src/lns/modification/route/remove_route.cpp
src/output/solution_checker.cpp src/output/solution_checker.cpp
src/lns/operators/sorting_strategy.cpp
src/lns/operators/destruction/random_destroy.cpp src/lns/operators/destruction/random_destroy.cpp
src/lns/operators/selector/operator_selection.cpp src/lns/operators/selector/operator_selection.cpp
src/utils.cpp src/utils.cpp
......
...@@ -5,9 +5,7 @@ ...@@ -5,9 +5,7 @@
class RandomDestroy : public DestructionOperator class RandomDestroy : public DestructionOperator
{ {
public: public:
explicit RandomDestroy(int numberOfPairsToDestroy) explicit RandomDestroy(int numberOfPairsToDestroy) : numberOfPairsToDestroy(numberOfPairsToDestroy) {}
: numberOfPairsToDestroy(numberOfPairsToDestroy)
{}
/** /**
* This operator removes numberOfPairsToDestroy pairs randomly in the solution. * This operator removes numberOfPairsToDestroy pairs randomly in the solution.
......
#include "sorting_strategy.h"
#include "utils.h"
#include <algorithm>
#include <ranges>
std::vector<int> const &sorting_strategy::Shuffle::sortRequests() const
{
auto &bank = getSolution().getPairBank();
std::ranges::shuffle(bank, util::getRawRandom());
return bank;
}
\ No newline at end of file
#pragma once
#include "lns/solution/solution.h"
namespace sorting_strategy
{
/**
* Interface for sorting the requests in the request bank. Does modify directly the solution request bank
*/
class SortingStrategy
{
public:
explicit SortingStrategy(Solution &solution) : solution(solution) {}
Solution &getSolution() const { return solution; }
virtual std::vector<int> const &sortRequests() const = 0;
virtual ~SortingStrategy() = default;
private:
// non const to sort in place
Solution &solution;
};
/**
* Shuffle the requests
*/
class Shuffle : public SortingStrategy
{
using SortingStrategy::SortingStrategy;
public:
std::vector<int> const &sortRequests() const override;
};
}// namespace sorting_strategy
\ No newline at end of file
...@@ -83,6 +83,16 @@ Solution::PairBank const &Solution::getBank() const ...@@ -83,6 +83,16 @@ Solution::PairBank const &Solution::getBank() const
return pairBank; return pairBank;
} }
Solution::PairBank const &Solution::getPairBank() const
{
return pairBank;
}
Solution::PairBank &Solution::getPairBank()
{
return pairBank;
}
std::vector<Route> const &Solution::getRoutes() const std::vector<Route> const &Solution::getRoutes() const
{ {
return routes; return routes;
......
...@@ -54,6 +54,8 @@ public: ...@@ -54,6 +54,8 @@ public:
PairBank const &getBank() const; PairBank const &getBank() const;
PairBank const &getPairBank() const;
PairBank &getPairBank();
std::vector<Route> const &getRoutes() const; std::vector<Route> const &getRoutes() const;
Route const &getRoute(int routeIndex) const; Route const &getRoute(int routeIndex) const;
PDPTWData const &getData() const; PDPTWData const &getData() const;
......
#include "utils.h" #include "utils.h"
#include "config.h" #include "config.h"
#include <random> #include <random>
...@@ -10,7 +11,6 @@ namespace// anonymous namespace ...@@ -10,7 +11,6 @@ namespace// anonymous namespace
std::uniform_real_distribution<> distribution(0, 1); std::uniform_real_distribution<> distribution(0, 1);
}// namespace }// namespace
double util::getRandom() double util::getRandom()
{ {
if (!seedSet) [[unlikely]] if (!seedSet) [[unlikely]]
...@@ -30,3 +30,13 @@ unsigned int util::getRandomInt(unsigned int min, unsigned int max) ...@@ -30,3 +30,13 @@ unsigned int util::getRandomInt(unsigned int min, unsigned int max)
} }
return std::uniform_int_distribution<>(min, max)(randomGenerator); return std::uniform_int_distribution<>(min, max)(randomGenerator);
} }
std::mt19937_64 &util::getRawRandom()
{
if (!seedSet) [[unlikely]]
{
randomGenerator.seed(RANDOM_SEED);
seedSet = true;
}
return randomGenerator;
}
...@@ -19,6 +19,9 @@ namespace util ...@@ -19,6 +19,9 @@ namespace util
* @return a random integer number between min (included) and max (included) * @return a random integer number between min (included) and max (included)
*/ */
unsigned int getRandomInt(unsigned int min, unsigned int max); unsigned int getRandomInt(unsigned int min, unsigned int max);
/**
* @return the random generator directly, it is a deterministic random
*/
std::mt19937_64 &getRawRandom();
}// namespace util }// namespace util
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment