Skip to content

Commit 874efa1

Browse files
committed
custom matrix adapation for 1+1
1 parent c5cbeb0 commit 874efa1

File tree

9 files changed

+79
-37
lines changed

9 files changed

+79
-37
lines changed

include/matrix_adaptation.hpp

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,12 @@ namespace matrix_adaptation
2323
{
2424
}
2525

26-
bool adapt(const parameters::Weights& w, const parameters::Modules& m, const Population& pop,
27-
size_t mu, const parameters::Settings& settings, const parameters::Stats& stats)
28-
{
29-
if (settings.lambda0 == 1 && !stats.has_improved)
30-
return true;
31-
return adapt_matrix(w, m, pop, mu, settings);
32-
}
33-
3426
virtual void adapt_evolution_paths(const Population& pop, const parameters::Weights& w,
3527
const std::shared_ptr<mutation::Strategy>& mutation,
3628
const parameters::Stats& stats, size_t mu, size_t lambda) = 0;
3729

3830
virtual bool adapt_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop,
39-
size_t mu, const parameters::Settings& settings) = 0;
31+
size_t mu, const parameters::Settings& settings, const parameters::Stats& stats) = 0;
4032

4133
virtual void restart(const parameters::Settings& settings) = 0;
4234

@@ -55,7 +47,7 @@ namespace matrix_adaptation
5547
}
5648

5749
bool adapt_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop,
58-
const size_t mu, const parameters::Settings& settings) override
50+
const size_t mu, const parameters::Settings& settings, const parameters::Stats& stats) override
5951
{
6052
return true;
6153
}
@@ -88,17 +80,17 @@ namespace matrix_adaptation
8880
{
8981
}
9082

83+
void adapt_covariance_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop,
84+
size_t mu);
85+
9186
virtual bool perform_eigendecomposition(const parameters::Settings& settings);
9287

9388
void adapt_evolution_paths(const Population& pop, const parameters::Weights& w,
9489
const std::shared_ptr<mutation::Strategy>& mutation, const parameters::Stats& stats,
9590
size_t mu, size_t lambda) override;
9691

97-
void adapt_covariance_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop,
98-
size_t mu);
99-
10092
bool adapt_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop, size_t mu,
101-
const parameters::Settings& settings) override;
93+
const parameters::Settings& settings, const parameters::Stats& stats) override;
10294

10395
void restart(const parameters::Settings& settings) override;
10496

@@ -115,6 +107,22 @@ namespace matrix_adaptation
115107
};
116108

117109

110+
struct OnePlusOneAdaptation: CovarianceAdaptation
111+
{
112+
constexpr static double max_success_ratio = 0.44;
113+
114+
using CovarianceAdaptation::CovarianceAdaptation;
115+
116+
void adapt_evolution_paths(const Population& pop, const parameters::Weights& w,
117+
const std::shared_ptr<mutation::Strategy>& mutation, const parameters::Stats& stats,
118+
size_t mu, size_t lambda) override;
119+
120+
bool adapt_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop, size_t mu,
121+
const parameters::Settings& settings, const parameters::Stats& stats) override;
122+
123+
};
124+
125+
118126
struct MatrixAdaptation final : Adaptation
119127
{
120128
Matrix M;
@@ -131,7 +139,7 @@ namespace matrix_adaptation
131139
size_t mu, size_t lambda) override;
132140

133141
bool adapt_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop, size_t mu,
134-
const parameters::Settings& settings) override;
142+
const parameters::Settings& settings, const parameters::Stats& stats) override;
135143

136144
void restart(const parameters::Settings& settings) override;
137145

@@ -151,6 +159,8 @@ namespace matrix_adaptation
151159
return std::make_shared<None>(dim, x0, expected_z);
152160
case MatrixAdaptationType::SEPERABLE:
153161
return std::make_shared<SeperableAdaptation>(dim, x0, expected_z);
162+
case MatrixAdaptationType::ONEPLUSONE:
163+
return std::make_shared<OnePlusOneAdaptation>(dim, x0, expected_z);
154164
default:
155165
case MatrixAdaptationType::COVARIANCE:
156166
return std::make_shared<CovarianceAdaptation>(dim, x0, expected_z);

include/modules.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ namespace parameters
7272
NONE,
7373
COVARIANCE,
7474
MATRIX,
75-
SEPERABLE
75+
SEPERABLE,
76+
ONEPLUSONE
7677
};
7778

7879
enum class CenterPlacement

include/mutation.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,8 @@ namespace mutation
182182

183183
struct SR : CSA
184184
{
185-
186-
double success_ratio = 2.0 / 11.0;
187-
constexpr static double tgt_success_ratio = 2.0 / 11.0;
188-
constexpr static double max_success_ratio = 0.44;
189-
185+
constexpr static double tgt_success_ratio = 2.0 / 11.0;
186+
190187
using CSA::CSA;
191188

192189
void adapt(const parameters::Weights& w, std::shared_ptr<matrix_adaptation::Adaptation> adaptation, Population& pop,

include/settings.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ namespace parameters
7676
modules.active = false;
7777
modules.weights = RecombinationWeights::EQUAL;
7878
modules.ssa = StepSizeAdaptation::SR;
79+
modules.matrix_adaptation = MatrixAdaptationType::ONEPLUSONE;
80+
cc = 2.0 / (static_cast<double>(dim) + 2.0);
81+
c1 = 2.0 / (pow(static_cast<double>(dim),2) + 6.0);
7982

8083
if (modules.restart_strategy == RestartStrategyType::BIPOP || modules.restart_strategy == RestartStrategyType::IPOP)
8184
modules.restart_strategy = RestartStrategyType::RESTART;

include/stats.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ namespace parameters
1515
Solution current_best = {};
1616
Solution global_best = {};
1717
bool has_improved = false;
18+
double success_ratio = 2.0 / 11.0;
19+
double cs = 1.0 / 12.0;
1820

1921
void update_best(const Vector &x, const double y)
2022
{
@@ -28,6 +30,7 @@ namespace parameters
2830

2931
has_improved = true;
3032
}
33+
success_ratio = (1 - cs) * success_ratio + (cs * has_improved);
3134

3235
}
3336
};

src/main.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,23 @@ struct Timer
4747
int main()
4848
{
4949
rng::set_seed(42);
50-
const size_t dim = 2;
50+
const size_t dim = 10;
5151
parameters::Modules m;
52-
parameters::Settings settings(dim, m, 1e-8, 1000, 1000, 2.0, 1);
53-
auto p = std::make_shared<parameters::Parameters> (settings);
52+
parameters::Settings settings(dim, m, 1e-8, std::nullopt, 1000 * dim, 2.0, 1);
53+
auto p = std::make_shared<parameters::Parameters>(settings);
5454

5555
auto cma = ModularCMAES(p);
5656

5757
FunctionType f = Function();
58-
59-
while(cma.step(f))
58+
59+
while (cma.step(f))
6060
{
61-
std::cout << cma.p->stats << std::endl;
62-
std::cout << cma.p->mutation->sigma << std::endl;
61+
//std::cout << cma.p->stats << std::endl;
62+
//std::cout << cma.p->mutation->sigma << std::endl;
6363
//auto sr = std::dynamic_pointer_cast<mutation::SR>(cma.p->mutation);
6464
//std::cout << "p_succ: " << sr->success_ratio << ", " << sr->max_success_ratio << std::endl;
6565
}
66+
std::cout << cma.p->stats << std::endl;
6667

6768

6869
}

src/matrix_adaptation.cpp

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ namespace matrix_adaptation
1010
}
1111

1212
void CovarianceAdaptation::adapt_evolution_paths(const Population& pop, const Weights& w,
13-
const std::shared_ptr<mutation::Strategy>& mutation,
14-
const Stats& stats, const size_t mu, const size_t lambda)
13+
const std::shared_ptr<mutation::Strategy>& mutation,
14+
const Stats& stats, const size_t mu, const size_t lambda)
1515
{
1616
dm = (m - m_old) / mutation->sigma;
1717
ps = (1.0 - mutation->cs) * ps + (sqrt(mutation->cs * (2.0 - mutation->cs) * w.mueff) * inv_root_C * dm);
@@ -25,7 +25,7 @@ namespace matrix_adaptation
2525
}
2626

2727
void CovarianceAdaptation::adapt_covariance_matrix(const Weights& w, const Modules& m, const Population& pop,
28-
const size_t mu)
28+
const size_t mu)
2929
{
3030
const auto rank_one = w.c1 * pc * pc.transpose();
3131
const auto dhs = (1 - hs) * w.cc * (2.0 - w.cc);
@@ -83,7 +83,7 @@ namespace matrix_adaptation
8383
}
8484

8585
bool CovarianceAdaptation::adapt_matrix(const Weights& w, const Modules& m, const Population& pop, const size_t mu,
86-
const Settings& settings)
86+
const Settings& settings, const parameters::Stats& stats)
8787
{
8888
adapt_covariance_matrix(w, m, pop, mu);
8989
return perform_eigendecomposition(settings);
@@ -108,7 +108,7 @@ namespace matrix_adaptation
108108
return B * (d.asDiagonal() * zi);
109109
}
110110

111-
Vector CovarianceAdaptation::invert_y(const Vector& yi)
111+
Vector CovarianceAdaptation::invert_y(const Vector& yi)
112112
{
113113
return d.cwiseInverse().asDiagonal() * (B.transpose() * yi);
114114
}
@@ -119,6 +119,34 @@ namespace matrix_adaptation
119119
return d.minCoeff() > 0.0;
120120
}
121121

122+
123+
void OnePlusOneAdaptation::adapt_evolution_paths(const Population& pop, const parameters::Weights& w,
124+
const std::shared_ptr<mutation::Strategy>& mutation, const parameters::Stats& stats,
125+
size_t mu, size_t lambda)
126+
{
127+
dm = (m - m_old) / mutation->sigma;
128+
if (!stats.has_improved)
129+
return;
130+
131+
if (stats.success_ratio < max_success_ratio)
132+
pc = ((1.0 - w.cc) * pc) + (std::sqrt(w.cc * (2.0 - w.cc)) * pop.Y.col(0));
133+
else
134+
pc = (1.0 - w.cc) * pc;
135+
}
136+
137+
bool OnePlusOneAdaptation::adapt_matrix(const parameters::Weights& w, const parameters::Modules& m, const Population& pop, size_t mu,
138+
const parameters::Settings& settings, const parameters::Stats& stats)
139+
{
140+
if (!stats.has_improved)
141+
{
142+
return true;
143+
}
144+
return CovarianceAdaptation::adapt_matrix(w, m, pop, mu, settings, stats);
145+
}
146+
147+
148+
149+
122150
void MatrixAdaptation::adapt_evolution_paths(const Population& pop, const Weights& w,
123151
const std::shared_ptr<mutation::Strategy>& mutation,
124152
const Stats& stats, const size_t mu, const size_t lambda)
@@ -131,7 +159,7 @@ namespace matrix_adaptation
131159
}
132160

133161
bool MatrixAdaptation::adapt_matrix(const Weights& w, const Modules& m, const Population& pop, const size_t mu,
134-
const Settings& settings)
162+
const Settings& settings, const parameters::Stats& stats)
135163
{
136164
const auto old_m = (1. - (0.5 * w.c1) - (0.5 * w.cmu)) * M;
137165
const auto scaled_ps = (0.5 * w.c1) * (M * ps) * ps.transpose();

src/mutation.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,7 @@ namespace mutation
174174
Population& pop,
175175
const Population& old_pop, const parameters::Stats& stats, const size_t lambda)
176176
{
177-
success_ratio = (1 - cs) * success_ratio + (cs * stats.has_improved);
178-
sigma *= std::exp((1 / damps) * ((success_ratio - tgt_success_ratio) / (1.0 - tgt_success_ratio)));
177+
sigma *= std::exp((1 / damps) * ((stats.success_ratio - tgt_success_ratio) / (1.0 - tgt_success_ratio)));
179178
}
180179

181180

src/parameters.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ namespace parameters
7878
adaptation->adapt_evolution_paths(pop, weights, mutation, stats, mu, lambda);
7979
mutation->adapt(weights, adaptation, pop, old_pop, stats, lambda);
8080

81-
auto successfull_adaptation = adaptation->adapt(weights, settings.modules, pop, mu, settings, stats);
81+
auto successfull_adaptation = adaptation->adapt_matrix(weights, settings.modules, pop, mu, settings, stats);
8282

8383
if (!successfull_adaptation or invalid_state())
8484
perform_restart(objective);

0 commit comments

Comments
 (0)