32 #ifndef SHARK_ALGORITHMS_DIRECT_SEARCH_REAL_CODED_NSGA_II_H 33 #define SHARK_ALGORITHMS_DIRECT_SEARCH_REAL_CODED_NSGA_II_H 59 template<
typename Indicator>
73 return "RealCodedNSGAII";
78 return m_crossoverProbability;
82 return m_crossoverProbability;
87 return m_mutation.
m_nm;
91 return m_mutation.
m_nm;
95 return m_crossover.
m_nc;
99 return m_crossover.
m_nc;
103 std::size_t
mu()
const{
118 return m_selection.indicator();
122 return m_selection.indicator();
126 archive >> BOOST_SERIALIZATION_NVP(
m_parents);
127 archive >> BOOST_SERIALIZATION_NVP(m_mu);
128 archive >> BOOST_SERIALIZATION_NVP(
m_best);
130 archive >> BOOST_SERIALIZATION_NVP(m_selection);
131 archive >> BOOST_SERIALIZATION_NVP(m_crossover);
132 archive >> BOOST_SERIALIZATION_NVP(m_mutation);
133 archive >> BOOST_SERIALIZATION_NVP(m_crossoverProbability);
136 archive << BOOST_SERIALIZATION_NVP(
m_parents);
137 archive << BOOST_SERIALIZATION_NVP(m_mu);
138 archive << BOOST_SERIALIZATION_NVP(
m_best);
140 archive << BOOST_SERIALIZATION_NVP(m_selection);
141 archive << BOOST_SERIALIZATION_NVP(m_crossover);
142 archive << BOOST_SERIALIZATION_NVP(m_mutation);
143 archive << BOOST_SERIALIZATION_NVP(m_crossoverProbability);
154 std::vector<SearchPointType>
const& initialSearchPoints
157 std::vector<RealVector> values(initialSearchPoints.size());
158 for(std::size_t i = 0; i != initialSearchPoints.size(); ++i){
159 SHARK_RUNTIME_CHECK(
function.isFeasible(initialSearchPoints[i]),
"Starting point(s) not feasible");
160 values[i] =
function.eval(initialSearchPoints[i]);
163 std::size_t dim =
function.numberOfVariables();
164 RealVector lowerBounds(dim, -1E20);
165 RealVector upperBounds(dim, 1E20);
166 if (
function.hasConstraintHandler() &&
function.getConstraintHandler().isBoxConstrained()) {
168 ConstraintHandler
const& handler =
static_cast<ConstraintHandler const&
>(
function.getConstraintHandler());
170 lowerBounds = handler.
lower();
171 upperBounds = handler.upper();
174 !
function.isConstrained(),
"Algorithm does only allow box constraints" 187 penalizingEvaluator(
function, offspring.begin(), offspring.end() );
195 std::vector<SearchPointType>
const& initialSearchPoints,
196 std::vector<ResultType>
const& functionValues,
197 RealVector
const& lowerBounds,
198 RealVector
const& upperBounds,
202 double crossover_prob
208 m_crossoverProbability = crossover_prob;
212 std::size_t numPoints = 0;
213 if(initialSearchPoints.size()<=
mu){
214 numPoints = initialSearchPoints.size();
215 for(std::size_t i = 0; i != numPoints; ++i){
216 m_parents[i].searchPoint() = initialSearchPoints[i];
217 m_parents[i].penalizedFitness() = functionValues[i];
218 m_parents[i].unpenalizedFitness() = functionValues[i];
222 for(std::size_t i = numPoints; i !=
mu; ++i){
224 m_parents[i].searchPoint() = initialSearchPoints[index];
225 m_parents[i].penalizedFitness() = functionValues[index];
226 m_parents[i].unpenalizedFitness() = functionValues[index];
229 for(std::size_t i = 0; i !=
mu; ++i){
233 m_crossover.
init(lowerBounds,upperBounds);
234 m_mutation.
init(lowerBounds,upperBounds);
243 std::vector<IndividualType> offspring(
mu());
252 for( std::size_t i = 0; i <
mu()-1; i+=2 ) {
254 m_crossover(*
mpe_rng,offspring[i], offspring[i +1] );
257 for( std::size_t i = 0; i <
mu(); i++ ) {
258 m_mutation(*
mpe_rng, offspring[i] );
268 std::partition(
m_parents.begin(),
m_parents.end(), [](IndividualType
const& ind){
return ind.selected();});
272 for (std::size_t i = 0; i <
mu(); i++) {
288 double m_crossoverProbability;