From 3249e1b3921f8a88684253ccb6b82a4bf15176d9 Mon Sep 17 00:00:00 2001 From: awenjb <126257927+awenjb@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:22:13 +0100 Subject: [PATCH] Add Sorting Strategy - add shuffle as basic sorting strategy - add getter to Solution --- CMakeLists.txt | 1 + .../operators/destruction/random_destroy.h | 4 +- src/lns/operators/sorting_strategy.cpp | 13 +++++++ src/lns/operators/sorting_strategy.h | 37 +++++++++++++++++++ src/lns/solution/solution.cpp | 10 +++++ src/lns/solution/solution.h | 2 + src/utils.cpp | 12 +++++- src/utils.h | 5 ++- 8 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/lns/operators/sorting_strategy.cpp create mode 100644 src/lns/operators/sorting_strategy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2edbfcd..80c9ac9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(pdptw src/mains/main.cpp src/lns/modification/route/insert_route.cpp src/lns/modification/route/remove_route.cpp src/output/solution_checker.cpp + src/lns/operators/sorting_strategy.cpp src/lns/operators/destruction/random_destroy.cpp src/lns/operators/selector/operator_selection.cpp src/utils.cpp diff --git a/src/lns/operators/destruction/random_destroy.h b/src/lns/operators/destruction/random_destroy.h index c7e6185..5c813a5 100644 --- a/src/lns/operators/destruction/random_destroy.h +++ b/src/lns/operators/destruction/random_destroy.h @@ -5,9 +5,7 @@ class RandomDestroy : public DestructionOperator { public: - explicit RandomDestroy(int numberOfPairsToDestroy) - : numberOfPairsToDestroy(numberOfPairsToDestroy) - {} + explicit RandomDestroy(int numberOfPairsToDestroy) : numberOfPairsToDestroy(numberOfPairsToDestroy) {} /** * This operator removes numberOfPairsToDestroy pairs randomly in the solution. diff --git a/src/lns/operators/sorting_strategy.cpp b/src/lns/operators/sorting_strategy.cpp new file mode 100644 index 0000000..08a1629 --- /dev/null +++ b/src/lns/operators/sorting_strategy.cpp @@ -0,0 +1,13 @@ +#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 diff --git a/src/lns/operators/sorting_strategy.h b/src/lns/operators/sorting_strategy.h new file mode 100644 index 0000000..55f46b4 --- /dev/null +++ b/src/lns/operators/sorting_strategy.h @@ -0,0 +1,37 @@ +#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 diff --git a/src/lns/solution/solution.cpp b/src/lns/solution/solution.cpp index f996203..f24844f 100644 --- a/src/lns/solution/solution.cpp +++ b/src/lns/solution/solution.cpp @@ -83,6 +83,16 @@ Solution::PairBank const &Solution::getBank() const return pairBank; } +Solution::PairBank const &Solution::getPairBank() const +{ + return pairBank; +} + +Solution::PairBank &Solution::getPairBank() +{ + return pairBank; +} + std::vector<Route> const &Solution::getRoutes() const { return routes; diff --git a/src/lns/solution/solution.h b/src/lns/solution/solution.h index 31affb5..d5c1cd5 100644 --- a/src/lns/solution/solution.h +++ b/src/lns/solution/solution.h @@ -54,6 +54,8 @@ public: PairBank const &getBank() const; + PairBank const &getPairBank() const; + PairBank &getPairBank(); std::vector<Route> const &getRoutes() const; Route const &getRoute(int routeIndex) const; PDPTWData const &getData() const; diff --git a/src/utils.cpp b/src/utils.cpp index 6ab381b..9b61c3f 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1,4 +1,5 @@ #include "utils.h" + #include "config.h" #include <random> @@ -10,7 +11,6 @@ namespace// anonymous namespace std::uniform_real_distribution<> distribution(0, 1); }// namespace - double util::getRandom() { if (!seedSet) [[unlikely]] @@ -30,3 +30,13 @@ unsigned int util::getRandomInt(unsigned int min, unsigned int max) } return std::uniform_int_distribution<>(min, max)(randomGenerator); } + +std::mt19937_64 &util::getRawRandom() +{ + if (!seedSet) [[unlikely]] + { + randomGenerator.seed(RANDOM_SEED); + seedSet = true; + } + return randomGenerator; +} diff --git a/src/utils.h b/src/utils.h index 323fe4f..f5048cd 100644 --- a/src/utils.h +++ b/src/utils.h @@ -19,6 +19,9 @@ namespace util * @return a random integer number between min (included) and max (included) */ 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 -- GitLab