From 18b87239d1d6b1fa90748b71b9a23f1b6258ead2 Mon Sep 17 00:00:00 2001 From: Severin Lochschmidt Date: Tue, 11 Mar 2025 12:01:29 +0100 Subject: [PATCH] Normalize and test summing of objective scores --- include/simulation/SolverResult.hpp | 4 ++-- src/simulation/Objectives.cpp | 2 +- src/simulation/RoutingSolver.cpp | 10 ++++++---- src/simulation/SolverResult.cpp | 15 +++++++-------- test/test_simulation.cpp | 13 +++++++++---- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/include/simulation/SolverResult.hpp b/include/simulation/SolverResult.hpp index 2f2783b53..e3fdabb73 100644 --- a/include/simulation/SolverResult.hpp +++ b/include/simulation/SolverResult.hpp @@ -13,8 +13,8 @@ struct ScoreSet { double get_score() const; double get_collision_score() const; - double get_stop_score() const; - double get_destination_score() const; + double get_norm_stop_score() const; + double get_norm_destination_score() const; }; class SolverResult { diff --git a/src/simulation/Objectives.cpp b/src/simulation/Objectives.cpp index f84a22833..87ec75fb6 100644 --- a/src/simulation/Objectives.cpp +++ b/src/simulation/Objectives.cpp @@ -14,7 +14,7 @@ double cda_rail::sim::collision_penalty(const TrainTrajectorySet& traj_set) { * Train position is assumed to be the center of the train * * @param traj_set Set of train trajectories - * @return Normalized penalty score from 0 to 1, lower is better + * @return Penalty score, lower is better */ constexpr double safety_distance = 100; diff --git a/src/simulation/RoutingSolver.cpp b/src/simulation/RoutingSolver.cpp index 83ad20b98..dafa9821c 100644 --- a/src/simulation/RoutingSolver.cpp +++ b/src/simulation/RoutingSolver.cpp @@ -9,8 +9,9 @@ void cda_rail::sim::ScoreHistory::export_csv( for (auto it = begin(); it != end(); it++) { const ScoreSet& set = std::get<1>(*it); csvfile << std::get<0>(*it).count() << "," << set.get_score() << "," - << set.get_collision_score() << "," << set.get_destination_score() - << "," << set.get_stop_score() << "," << std::endl; + << set.get_collision_score() << "," + << set.get_norm_destination_score() << "," + << set.get_norm_stop_score() << "," << std::endl; } csvfile.close(); @@ -26,8 +27,9 @@ void cda_rail::sim::ScoreHistoryCollection::export_csv( for (auto it = (*hist_it).begin(); it != (*hist_it).end(); it++) { const ScoreSet& set = std::get<1>(*it); csvfile << std::get<0>(*it).count() << "," << set.get_score() << "," - << set.get_collision_score() << "," << set.get_destination_score() - << "," << set.get_stop_score() << "," << std::endl; + << set.get_collision_score() << "," + << set.get_norm_destination_score() << "," + << set.get_norm_stop_score() << "," << std::endl; } } diff --git a/src/simulation/SolverResult.cpp b/src/simulation/SolverResult.cpp index 63ab8292b..49159dbce 100644 --- a/src/simulation/SolverResult.cpp +++ b/src/simulation/SolverResult.cpp @@ -14,8 +14,7 @@ cda_rail::sim::SolverResult::SolverResult(const SimulationInstance& instance, "Solutions and Trajectories are not the same size"); for (auto const& [train_name, traj] : trajectories.get_map()) { - double pen = stop_penalty(traj); - scores.stop_scores.insert_or_assign(train_name, pen); + scores.stop_scores.insert_or_assign(train_name, stop_penalty(traj)); } for (auto const& [train_name, traj] : trajectories.get_map()) { @@ -54,8 +53,8 @@ double cda_rail::sim::ScoreSet::get_score() const { double score_sum = 0; score_sum += get_collision_score(); - score_sum += get_destination_score(); - score_sum += get_stop_score(); + score_sum += get_norm_destination_score(); + score_sum += get_norm_stop_score(); return score_sum; } @@ -64,22 +63,22 @@ double cda_rail::sim::ScoreSet::get_collision_score() const { return collision_score; } -double cda_rail::sim::ScoreSet::get_stop_score() const { +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; + return score_sum / (double)stop_scores.size(); } -double cda_rail::sim::ScoreSet::get_destination_score() const { +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; + return score_sum / (double)stop_scores.size(); } const cda_rail::sim::ScoreSet& diff --git a/test/test_simulation.cpp b/test/test_simulation.cpp index 5fd1041b0..449df044e 100644 --- a/test/test_simulation.cpp +++ b/test/test_simulation.cpp @@ -230,9 +230,15 @@ TEST(Simulation, Penalties) { for (int i = 0; i < 100; i++) { sim::RoutingSolutionSet solution_set{instance, rng_engine}; sim::TrainTrajectorySet traj{instance, solution_set}; - sim::collision_penalty(traj); - sim::destination_penalty(traj); - sim::stop_penalty(traj); + sim::SolverResult res{instance, solution_set}; + sim::ScoreSet scores = res.get_score_set(); + ASSERT_DOUBLE_EQ(sim::collision_penalty(traj), + scores.get_collision_score()); + ASSERT_DOUBLE_EQ(sim::destination_penalty(traj), + scores.get_norm_destination_score()); + ASSERT_DOUBLE_EQ(sim::stop_penalty(traj), scores.get_norm_stop_score()); + ASSERT_DOUBLE_EQ(sim::combined_objective(traj), scores.get_score()); + traj.export_csv("tmp/test_traj_penalty.csv"); } } @@ -263,7 +269,6 @@ TEST(Simulation, SolverResult) { sim::RoutingSolution round_sol{instance, train, rng_engine}; sim::TrainTrajectory round_traj{instance, train, round_sol}; result.insert_or_assign(round_sol, round_traj); - ASSERT_GE(result.get_score_set().get_score(), previous_score); } } }