Skip to content

Commit

Permalink
Fixed scale projection
Browse files Browse the repository at this point in the history
  • Loading branch information
kataklinger committed Mar 14, 2024
1 parent dd630e0 commit c6628a8
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 10 deletions.
12 changes: 8 additions & 4 deletions src/inc/projection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ class none {
// x = rank / (1. - density) (nsga)
template<typename RankTag>
class scale {
private:
inline static constexpr double epsilon = 0.00001;

public:
template<projectable_context<RankTag, double> Context, typename Preserved>
void operator()(
Expand All @@ -51,7 +54,7 @@ class scale {

for (auto&& individual : context.population().individuals()) {
auto front = get_tag<frontier_level_t>(individual).get() - 1;
double density{get_tag<crowd_density_t>(individual)};
auto density = 1. - get_tag<crowd_density_t>(individual).get();

if (multipliers[front] > density) {
multipliers[front] = density;
Expand All @@ -60,13 +63,14 @@ class scale {

for (auto correction = 1.0;
auto&& multiplier : multipliers | std::views::reverse) {
correction *= std::exchange(multiplier, multiplier / correction);
correction /= multiplier > epsilon ? multiplier : epsilon;
multiplier = correction;
}

for (auto&& individual : context.population().individuals()) {
auto front = get_tag<frontier_level_t>(individual).get() - 1;
auto scaled = multipliers[front] * get_tag<RankTag>(individual).get() *
get_tag<crowd_density_t>(individual).get();
auto scaled = multipliers[front] *
(1. - get_tag<crowd_density_t>(individual).get());

individual.eval().set_scaled(scaled_fitness_t{scaled});
}
Expand Down
12 changes: 6 additions & 6 deletions tests/operations/multiobjective/projection_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ TEST_F(projection_tests, scale_scaled_fitness_value) {

// assert
auto values = to_vector(population_.individuals());
EXPECT_NEAR(values[0], 120., 0.0000001);
EXPECT_NEAR(values[1], 80., 0.0000001);
EXPECT_NEAR(values[2], 2.5, 0.0000001);
EXPECT_NEAR(values[3], 1.25, 0.0000001);
EXPECT_NEAR(values[4], 0.00375, 0.0000001);
EXPECT_NEAR(values[5], 0.001875, 0.0000001);
EXPECT_NEAR(values[0], 1.4035, 0.0001);
EXPECT_NEAR(values[1], 2.8070, 0.0001);
EXPECT_NEAR(values[2], 1.0526, 0.0001);
EXPECT_NEAR(values[3], 1.2280, 0.0001);
EXPECT_NEAR(values[4], 0.9999, 0.0001);
EXPECT_NEAR(values[5], 1.0263, 0.0001);
}
TEST_F(projection_tests, translate_scaled_fitness_value) {
// arrange
Expand Down

0 comments on commit c6628a8

Please sign in to comment.