-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathSolverResult.cpp
87 lines (67 loc) · 2.78 KB
/
SolverResult.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "simulation/SolverResult.hpp"
cda_rail::sim::SolverResult::SolverResult(const SimulationInstance& instance)
: solutions(RoutingSolutionSet{}),
trajectories(TrainTrajectorySet(instance)) {}
cda_rail::sim::SolverResult::SolverResult(const SimulationInstance& instance,
const RoutingSolutionSet& solutions)
: solutions(solutions),
trajectories(TrainTrajectorySet(instance, solutions)) {
if (solutions.solutions.size() != trajectories.size())
throw std::invalid_argument(
"Solutions and Trajectories are not the same size");
for (auto const& [train_name, traj] : trajectories.get_map()) {
scores.stop_scores.insert_or_assign(train_name, stop_penalty(traj));
}
for (auto const& [train_name, traj] : trajectories.get_map()) {
scores.destination_scores.insert_or_assign(train_name,
destination_penalty(traj));
}
scores.collision_score = collision_penalty(trajectories);
}
void cda_rail::sim::SolverResult::insert_or_assign(
const RoutingSolution& solution, const TrainTrajectory& trajectory) {
solutions.solutions.insert_or_assign(trajectory.get_train().name, solution);
trajectories.insert_or_assign(trajectory.get_train().name, trajectory);
scores.stop_scores.insert_or_assign(trajectory.get_train().name,
stop_penalty(trajectory));
scores.destination_scores.insert_or_assign(trajectory.get_train().name,
destination_penalty(trajectory));
// TODO: don't need to recompute all pairs for new train
scores.collision_score = collision_penalty(trajectories);
}
const cda_rail::sim::RoutingSolutionSet&
cda_rail::sim::SolverResult::get_solutions() const {
return solutions;
}
const cda_rail::sim::TrainTrajectorySet&
cda_rail::sim::SolverResult::get_trajectories() const {
return trajectories;
}
double cda_rail::sim::ScoreSet::get_score() const {
double score_sum = 0;
score_sum += get_collision_score();
score_sum += get_norm_destination_score();
score_sum += get_norm_stop_score();
return score_sum;
}
double cda_rail::sim::ScoreSet::get_collision_score() const {
return collision_score;
}
double cda_rail::sim::ScoreSet::get_norm_stop_score() const {
double score_sum = 0;
for (auto const& [train_name, score] : stop_scores) {
score_sum = score_sum + score;
}
return score_sum / (double)stop_scores.size();
}
double cda_rail::sim::ScoreSet::get_norm_destination_score() const {
double score_sum = 0;
for (auto const& [train_name, score] : destination_scores) {
score_sum = score_sum + score;
}
return score_sum / (double)stop_scores.size();
}
const cda_rail::sim::ScoreSet&
cda_rail::sim::SolverResult::get_score_set() const {
return scores;
}