feat update eval foundry for fastga

This commit is contained in:
Amine Aziz-Alaoui 2020-09-30 15:06:48 +02:00 committed by nojhan
commit 560dedbef0

View file

@ -55,31 +55,37 @@ public:
eoAlgoFoundryFastGA<SUB>& foundry, eoAlgoFoundryFastGA<SUB>& foundry,
eoInit<SUB>& subpb_init, eoInit<SUB>& subpb_init,
eoPopEvalFunc<SUB>& subpb_eval, eoPopEvalFunc<SUB>& subpb_eval,
const typename SUB::Fitness penalization const typename SUB::Fitness penalization,
const bool normalized = false
) : ) :
_subpb_init(subpb_init), _subpb_init(subpb_init),
_subpb_eval(subpb_eval), _subpb_eval(subpb_eval),
_foundry(foundry), _foundry(foundry),
_penalization(penalization), _penalization(penalization),
i_cont(foundry.continuators.index()), _normalized(normalized),
i_crat(foundry.crossover_rates.index()), i_crat(foundry.crossover_rates.index()),
i_crsl(foundry.crossover_selectors.index()),
i_cros(foundry.crossovers.index()), i_cros(foundry.crossovers.index()),
i_afcr(foundry.aftercross_selectors.index()),
i_mrat(foundry.mutation_rates.index()), i_mrat(foundry.mutation_rates.index()),
i_musl(foundry.mutation_selectors.index()),
i_muta(foundry.mutations.index()), i_muta(foundry.mutations.index()),
i_sele(foundry.selectors.index()), i_repl(foundry.replacements.index()),
i_pops(foundry.pop_sizes.index()), i_cont(foundry.continuators.index()),
i_repl(foundry.replacements.index()) i_pops(foundry.pop_sizes.index())
{ } { }
protected: protected:
const size_t i_cont;
const size_t i_crat; const size_t i_crat;
const size_t i_crsl;
const size_t i_cros; const size_t i_cros;
const size_t i_afcr;
const size_t i_mrat; const size_t i_mrat;
const size_t i_musl;
const size_t i_muta; const size_t i_muta;
const size_t i_sele;
const size_t i_pops;
const size_t i_repl; const size_t i_repl;
const size_t i_cont;
const size_t i_pops;
public: public:
@ -96,27 +102,32 @@ public:
*/ */
std::vector<size_t> decode( const EOT& sol ) const std::vector<size_t> decode( const EOT& sol ) const
{ {
// Denormalize if(_normalized) {
// size_t cont = static_cast<size_t>(std::ceil( sol[i_cont] * _foundry.continuators .size() )); size_t crat = static_cast<size_t>(std::ceil( sol[i_crat] * _foundry.crossover_rates.size() )),
// size_t crat = static_cast<size_t>(std::ceil( sol[i_crat] * _foundry.crossover_rates.size() )); size_t crsl = static_cast<size_t>(std::ceil( sol[i_crsl] * _foundry.crossover_selectors.size() )),
// size_t cros = static_cast<size_t>(std::ceil( sol[i_cros] * _foundry.crossovers .size() )); size_t cros = static_cast<size_t>(std::ceil( sol[i_cros] * _foundry.crossovers.size() )),
// size_t mrat = static_cast<size_t>(std::ceil( sol[i_mrat] * _foundry.mutation_rates .size() )); size_t afcr = static_cast<size_t>(std::ceil( sol[i_afcr] * _foundry.aftercross_selectors.size() )),
// size_t muta = static_cast<size_t>(std::ceil( sol[i_muta] * _foundry.mutations .size() )); size_t mrat = static_cast<size_t>(std::ceil( sol[i_mrat] * _foundry.mutation_rates.size() )),
// size_t sele = static_cast<size_t>(std::ceil( sol[i_sele] * _foundry.selectors .size() )); size_t musl = static_cast<size_t>(std::ceil( sol[i_musl] * _foundry.mutation_selectors.size() )),
// size_t pops = static_cast<size_t>(std::ceil( sol[i_pops] * _foundry.pop_sizes .size() )); size_t muta = static_cast<size_t>(std::ceil( sol[i_muta] * _foundry.mutations.size() )),
// size_t repl = static_cast<size_t>(std::ceil( sol[i_repl] * _foundry.replacements .size() )); size_t repl = static_cast<size_t>(std::ceil( sol[i_repl] * _foundry.replacements.size() )),
size_t cont = static_cast<size_t>(std::ceil( sol[i_cont] * _foundry.continuators.size() )),
size_t pops = static_cast<size_t>(std::ceil( sol[i_pops] * _foundry.pop_sizes.size() ))
// Direct encoding } else {
size_t cont = static_cast<size_t>(std::ceil( sol[i_cont] )); size_t crat = static_cast<size_t>(std::ceil( sol[i_crat] ));
size_t crat = static_cast<size_t>(std::ceil( sol[i_crat] )); size_t crsl = static_cast<size_t>(std::ceil( sol[i_crsl] ));
size_t cros = static_cast<size_t>(std::ceil( sol[i_cros] )); size_t cros = static_cast<size_t>(std::ceil( sol[i_cros] ));
size_t mrat = static_cast<size_t>(std::ceil( sol[i_mrat] )); size_t afcr = static_cast<size_t>(std::ceil( sol[i_afcr] ));
size_t muta = static_cast<size_t>(std::ceil( sol[i_muta] )); size_t mrat = static_cast<size_t>(std::ceil( sol[i_mrat] ));
size_t sele = static_cast<size_t>(std::ceil( sol[i_sele] )); size_t musl = static_cast<size_t>(std::ceil( sol[i_musl] ));
size_t pops = static_cast<size_t>(std::ceil( sol[i_pops] )); size_t muta = static_cast<size_t>(std::ceil( sol[i_muta] ));
size_t repl = static_cast<size_t>(std::ceil( sol[i_repl] )); size_t repl = static_cast<size_t>(std::ceil( sol[i_repl] ));
size_t cont = static_cast<size_t>(std::ceil( sol[i_cont] ));
size_t pops = static_cast<size_t>(std::ceil( sol[i_pops] ));
return {cont, crat, cros, mrat, muta, sele, pops, repl}; }
return {crat, crsl, cros, afcr, mrat, musl, muta, repl, cont, pops};
} }
/** Perform a sub-problem search with the configuration encoded in the given solution /** Perform a sub-problem search with the configuration encoded in the given solution
@ -129,27 +140,30 @@ public:
if(not sol.invalid()) { if(not sol.invalid()) {
return; return;
} }
auto config = decode(sol); auto config = decode(sol);
double cont = config[i_cont];
double crat = config[i_crat]; double crat = config[i_crat];
double crsl = config[i_crsl];
double cros = config[i_cros]; double cros = config[i_cros];
double afcr = config[i_afcr];
double mrat = config[i_mrat]; double mrat = config[i_mrat];
double musl = config[i_musl];
double muta = config[i_muta]; double muta = config[i_muta];
double sele = config[i_sele];
double pops = config[i_pops];
double repl = config[i_repl]; double repl = config[i_repl];
double cont = config[i_cont];
double pops = config[i_pops];
if( if(
0 <= cont and cont < _foundry.continuators .size() 0 <= crat and crat < _foundry.crossover_rates.size()
and 0 <= crat and crat < _foundry.crossover_rates.size() and 0 <= crsl and crsl < _foundry.crossover_selectors.size()
and 0 <= cros and cros < _foundry.crossovers .size() and 0 <= cros and cros < _foundry.crossovers.size()
and 0 <= mrat and mrat < _foundry.mutation_rates .size() and 0 <= afcr and afcr < _foundry.aftercross_selectors.size()
and 0 <= muta and muta < _foundry.mutations .size() and 0 <= mrat and mrat < _foundry.mutation_rates.size()
and 0 <= sele and sele < _foundry.selectors .size() and 0 <= musl and musl < _foundry.mutation_selectors.size()
and 0 <= pops and pops < _foundry.pop_sizes .size() and 0 <= muta and muta < _foundry.mutations.size()
and 0 <= repl and repl < _foundry.replacements .size() and 0 <= repl and repl < _foundry.replacements.size()
) { and 0 <= cont and cont < _foundry.continuators.size()
and 0 <= pops and pops < _foundry.pop_sizes.size()
) {
_foundry.select(config); _foundry.select(config);
// FIXME should pop_size belong to this eval and moved out from the foundry? // FIXME should pop_size belong to this eval and moved out from the foundry?
@ -174,6 +188,7 @@ protected:
eoPopEvalFunc<SUB>& _subpb_eval; eoPopEvalFunc<SUB>& _subpb_eval;
eoAlgoFoundryFastGA<SUB>& _foundry; eoAlgoFoundryFastGA<SUB>& _foundry;
const typename EOT::Fitness _penalization; const typename EOT::Fitness _penalization;
const bool _normalized;
}; };
/** Helper function to instanciate an eoEvalFoundryFastGA without having to indicate the template for the sub-problem encoding. /** Helper function to instanciate an eoEvalFoundryFastGA without having to indicate the template for the sub-problem encoding.
@ -187,9 +202,10 @@ eoEvalFoundryFastGA<EOT,SUB>&
eoInit<SUB>& subpb_init, eoInit<SUB>& subpb_init,
eoPopEvalFunc<SUB>& subpb_eval, eoPopEvalFunc<SUB>& subpb_eval,
eoAlgoFoundryFastGA<SUB>& foundry, eoAlgoFoundryFastGA<SUB>& foundry,
const typename SUB::Fitness penalization ) const typename SUB::Fitness penalization,
const bool normalized = false )
{ {
return *(new eoEvalFoundryFastGA<EOT,SUB>(subpb_init, subpb_eval, foundry, penalization)); return *(new eoEvalFoundryFastGA<EOT,SUB>(subpb_init, subpb_eval, foundry, penalization, normalized));
} }
#endif // _eoEvalFoundryFastGA_H_ #endif // _eoEvalFoundryFastGA_H_