Skip to content

Commit

Permalink
Inverting density value when mapping to fitness
Browse files Browse the repository at this point in the history
  • Loading branch information
kataklinger committed Mar 13, 2024
1 parent c76b9d4 commit 097ab8d
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 26 deletions.
17 changes: 11 additions & 6 deletions src/inc/projection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class none {
}
};

// x = f(rank) / (1 - density) (nsga)
// x = rank / (1. - density) (nsga)
template<typename RankTag>
class scale {
public:
Expand Down Expand Up @@ -73,7 +73,7 @@ class scale {
}
};

// x = f(rank) + g(density) (spea-ii)
// x = rank + (1. - density) (spea-ii)
template<typename RankTag>
class translate {
public:
Expand All @@ -86,7 +86,7 @@ class translate {

for (auto&& individual : context.population().individuals()) {
auto rank = get_tag<RankTag>(individual).get();
auto density = get_tag<crowd_density_t>(individual).get();
auto density = 1. - get_tag<crowd_density_t>(individual).get();

individual.eval().set_scaled(scaled_fitness_t{rank + density});
}
Expand All @@ -109,7 +109,7 @@ class merge {

for (auto&& individual : context.population().individuals()) {
auto rank = get_tag<RankTag>(individual).get();
auto density = get_tag<crowd_density_t>(individual).get();
auto density = 1. - get_tag<crowd_density_t>(individual).get();

individual.eval().set_scaled(scaled_fitness_t{rank, density});
}
Expand All @@ -130,13 +130,18 @@ namespace details {

for (auto&& individual : population.individuals()) {
auto value = static_cast<double>(get_tag<Tag>(individual).get());

if constexpr (std::is_same_v<Tag, crowd_density_t>) {
value = 1. - value;
}

individual.eval().set_scaled(scaled_fitness_t{value});
}
}

} // namespace details

// x = rank or x = density (pesa, paes)
// x = rank or x = 1. - density (pesa, paes)
template<typename SelectedTag>
class truncate {
public:
Expand All @@ -155,7 +160,7 @@ concept alternateable_context =
population_tagged_with<typename Context::population_t, crowd_density_t> &&
stats::tracked_models<typename Context::statistics_t, stats::generation>;

// x0 = rank, x1 = density, ... (rdga)
// x0 = rank, x1 = 1. - density, ... (rdga)
template<typename RankTag>
class alternate {
public:
Expand Down
40 changes: 20 additions & 20 deletions tests/operations/multiobjective/projection_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,12 @@ TEST_F(projection_tests, translate_scaled_fitness_value) {

// assert
auto values = to_vector(population_.individuals());
EXPECT_NEAR(values[0], 1.75, 0.000001);
EXPECT_NEAR(values[0], 1.25, 0.000001);
EXPECT_NEAR(values[1], 1.5, 0.000001);
EXPECT_NEAR(values[2], 2.25, 0.000001);
EXPECT_NEAR(values[3], 2.125, 0.000001);
EXPECT_NEAR(values[4], 3.049999, 0.000001);
EXPECT_NEAR(values[5], 3.024999, 0.000001);
EXPECT_NEAR(values[2], 2.75, 0.000001);
EXPECT_NEAR(values[3], 2.875, 0.000001);
EXPECT_NEAR(values[4], 3.95, 0.000001);
EXPECT_NEAR(values[5], 3.975, 0.000001);
}

TEST_F(projection_tests, truncate_ranking_scaled_fitness_value) {
Expand Down Expand Up @@ -130,12 +130,12 @@ TEST_F(projection_tests, truncate_density_scaled_fitness_value) {

// assert
auto values = to_vector(population_.individuals());
EXPECT_NEAR(values[0], 0.75, 0.0001);
EXPECT_NEAR(values[0], 0.25, 0.0001);
EXPECT_NEAR(values[1], 0.5, 0.0001);
EXPECT_NEAR(values[2], 0.25, 0.0001);
EXPECT_NEAR(values[3], 0.125, 0.0001);
EXPECT_NEAR(values[4], 0.05, 0.0001);
EXPECT_NEAR(values[5], 0.025, 0.0001);
EXPECT_NEAR(values[2], 0.75, 0.0001);
EXPECT_NEAR(values[3], 0.875, 0.0001);
EXPECT_NEAR(values[4], 0.95, 0.0001);
EXPECT_NEAR(values[5], 0.975, 0.0001);
}

TEST_F(projection_tests, alternate_ranking_scaled_fitness_value) {
Expand Down Expand Up @@ -167,12 +167,12 @@ TEST_F(projection_tests, alternate_density_scaled_fitness_value) {

// assert
auto values = to_vector(population_.individuals());
EXPECT_NEAR(values[0], 0.75, 0.0001);
EXPECT_NEAR(values[0], 0.25, 0.0001);
EXPECT_NEAR(values[1], 0.5, 0.0001);
EXPECT_NEAR(values[2], 0.25, 0.0001);
EXPECT_NEAR(values[3], 0.125, 0.0001);
EXPECT_NEAR(values[4], 0.05, 0.0001);
EXPECT_NEAR(values[5], 0.025, 0.0001);
EXPECT_NEAR(values[2], 0.75, 0.0001);
EXPECT_NEAR(values[3], 0.875, 0.0001);
EXPECT_NEAR(values[4], 0.95, 0.0001);
EXPECT_NEAR(values[5], 0.975, 0.0001);
}

TEST_F(projection_tests, custom_scaled_fitness_value) {
Expand Down Expand Up @@ -243,12 +243,12 @@ TEST_F(merge_tests, merge_scaled_fitness_value) {
EXPECT_EQ(std::get<0>(values[4]), 3);
EXPECT_EQ(std::get<0>(values[5]), 3);

EXPECT_NEAR(std::get<1>(values[0]), 0.75, 0.000001);
EXPECT_NEAR(std::get<1>(values[0]), 0.25, 0.000001);
EXPECT_NEAR(std::get<1>(values[1]), 0.5, 0.000001);
EXPECT_NEAR(std::get<1>(values[2]), 0.25, 0.000001);
EXPECT_NEAR(std::get<1>(values[3]), 0.125, 0.000001);
EXPECT_NEAR(std::get<1>(values[4]), 0.05, 0.000001);
EXPECT_NEAR(std::get<1>(values[5]), 0.025, 0.000001);
EXPECT_NEAR(std::get<1>(values[2]), 0.75, 0.000001);
EXPECT_NEAR(std::get<1>(values[3]), 0.875, 0.000001);
EXPECT_NEAR(std::get<1>(values[4]), 0.95, 0.000001);
EXPECT_NEAR(std::get<1>(values[5]), 0.975, 0.000001);
}

} // namespace tests::projection

0 comments on commit 097ab8d

Please sign in to comment.