TCPSPSuite
grasp.hpp
1 #ifndef GRASP_HPP
2 #define GRASP_HPP
3 
4 #include "instance/instance.hpp"
5 #include "instance/solution.hpp"
6 #include "manager/timer.hpp"
7 #include "datastructures/maybe.hpp"
8 #include "db/storage.hpp"
9 #include "util/solverconfig.hpp"
10 #include "util/log.hpp"
11 #include "../manager/solvers.hpp"
12 #include "../datastructures/skyline.hpp"
13 #include "../instance/resource.hpp"
14 #include "../algorithms/graphalgos.hpp"
15 
16 #include <queue>
17 #include <random>
18 
19 #include <typeinfo>
20 
21 namespace grasp {
22  namespace detail {
23  class GraspRandom {
24  public:
25  GraspRandom(const Instance& instance, const SolverConfig& sconf);
26 
27  std::vector<const Job*> operator()();
28 
29  static std::string getName();
30 
31  private:
32  std::mt19937 random;
33  std::vector<const Job*> jobs;
34  };
35 
36  class GraspSorted {
37  public:
38  GraspSorted(const Instance& instance, const SolverConfig& sconf);
39 
40  std::vector<const Job*> operator()();
41 
42  static std::string getName();
43 
44  private:
45  std::vector<const Job*> jobs;
46  };
47  }
48 
49  namespace implementation {
50  class GraspArray {
51  public:
52  GraspArray(const Instance& in, const SolverConfig& sconf, const Timer & timer_in);
53 
54  void operator()(std::vector<const Job*>& jobs, std::vector<unsigned int>& starts);
55 
56  static std::string getName();
57 
58  private:
59  const Instance& instance;
60  const Timer & timer;
61  double timelimit;
62 
63  const unsigned int graspSelection;
64  const unsigned int graspSamples;
65 
66  std::mt19937 random;
67  std::vector<ResVec> usage;
68 
69  void updateUsage(std::vector<unsigned int>& s);
70  };
71 
72  class GraspSkyline {
73  public:
74  GraspSkyline(const Instance& in, const SolverConfig& sconf, const Timer & timer_in);
75 
76  void operator()(std::vector<const Job*>& jobs, std::vector<unsigned int>& starts);
77 
78  static std::string getName();
79 
80  private:
81  const Instance& instance;
82  const Timer & timer;
83  double timelimit;
84 
85  const unsigned int graspSelection;
86  const unsigned int graspSamples;
87 
88  std::mt19937 random;
89  ds::SkyLine usage;
90 
91  void updateUsage(std::vector<unsigned int>& s);
92  };
93  }
94 
95  template<typename GraspAlgorithm = detail::GraspRandom, typename GraspImplementation = implementation::GraspArray>
96  class GRASP {
97  private:
98  const Instance &instance;
99  AdditionalResultStorage& storage;
100  double bestCosts;
101  std::vector<unsigned int> bestStarts;
102  std::vector<unsigned int> starts;
103  Timer timer;
104  double timelimit;
105  Log l;
106 
107  static const Traits required_traits;
108 
109  GraspAlgorithm graspAlgorithm;
110  GraspImplementation graspImplementation;
111 
112  const unsigned int weightedSelections;
113  const unsigned int weightedIterations;
114  const unsigned int uniformSelections;
115  const unsigned int uniformIterations;
116 
117  const unsigned int graspSelection;
118  const unsigned int graspSamples;
119 
120  const unsigned int resetCount;
121  unsigned int nextReset;
122 
123  /* Writing intermediate solutions */
124  const double writeIntermediateInterval;
125  double lastIntermediateTime;
126  const bool writeTempResult;
127 
128  std::mt19937 random;
129  std::vector<unsigned int> permutation;
130 
131  public:
147  GRASP(const Instance& instance_in, AdditionalResultStorage& additional, const SolverConfig& sconf);
148 
152  void run();
153 
159  Solution get_solution();
160 
166  static std::string get_id();
167 
173  Maybe<double> get_lower_bound();
174 
180  static const Traits &get_requirements();
181 
182  private:
183 
184  void grasp();
185  double hillClimber();
186  std::vector<ResVec> resourceUsage(std::vector<unsigned int>& s);
187 
188  };
189 
190  template<typename GraspAlgorithm, typename GraspImplementation>
191  const Traits GRASP<GraspAlgorithm, GraspImplementation>::required_traits = Traits(
192  Traits::LAGS_ONLY_POSITIVE | Traits::LAGS_DAG | Traits::NO_WINDOW_EXTENSION |
193  Traits::NO_DRAIN | Traits::FLAT_AVAILABILITY,
194  std::numeric_limits<unsigned int>::max(),
195  {}, {});
196 }
197 
198 
199 
200 // Register the solvers
201 namespace solvers {
202 
203 // grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspArray>
204 template <>
205 struct registry_hook<solvers::get_free_N<grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspArray>>()>
206 {
207  constexpr static unsigned int my_N = solvers::get_free_N<grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspArray>>();
208 
209  auto
210  operator()()
211  {
212  return solvers::register_class < grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspArray>, my_N > {}();
213  }
214 };
215 
216 // grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspArray>
217 template <>
218 struct registry_hook<solvers::get_free_N<grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspArray>>()>
219 {
220  constexpr static unsigned int my_N = solvers::get_free_N<grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspArray>>();
221 
222  auto
223  operator()()
224  {
225  return solvers::register_class < grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspArray>, my_N > {}();
226  }
227 };
228 
229 // grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspSkyline>
230 template <>
231 struct registry_hook<solvers::get_free_N<grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspSkyline>>()>
232 {
233  constexpr static unsigned int my_N = solvers::get_free_N<grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspSkyline>>();
234 
235  auto
236  operator()()
237  {
238  return solvers::register_class < grasp::GRASP<grasp::detail::GraspRandom, grasp::implementation::GraspSkyline>, my_N > {}();
239  }
240 };
241 
242 // grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspSkyline>
243 template <>
244 struct registry_hook<solvers::get_free_N<grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspSkyline>>()>
245 {
246  constexpr static unsigned int my_N = solvers::get_free_N<grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspSkyline>>();
247 
248  auto
249  operator()()
250  {
251  return solvers::register_class < grasp::GRASP<grasp::detail::GraspSorted, grasp::implementation::GraspSkyline>, my_N > {}();
252  }
253 };
254 
255 }
256 
257 #endif
Instance
a TCPSP instance
Definition: instance.hpp:24
Solution
a soultion for a TCPSP instance
Definition: solution.hpp:17