36 #ifndef SHARK_ALGORITHMS_DIRECT_SEARCH_SMS_EMOA_H 37 #define SHARK_ALGORITHMS_DIRECT_SEARCH_SMS_EMOA_H 50 #include <boost/foreach.hpp> 66 m_mutator.
m_nm = 20.0;
67 m_crossover.
m_nc = 20.0;
68 m_crossoverProbability = 0.9;
78 return m_crossoverProbability;
82 return m_mutator.
m_nm;
86 return m_crossover.
m_nc;
89 unsigned int mu()
const{
98 archive & BOOST_SERIALIZATION_NVP(
m_parents );
99 archive & BOOST_SERIALIZATION_NVP( m_mu );
100 archive & BOOST_SERIALIZATION_NVP(
m_best );
102 archive & BOOST_SERIALIZATION_NVP( m_selection );
103 archive & BOOST_SERIALIZATION_NVP( m_crossover );
104 archive & BOOST_SERIALIZATION_NVP( m_mutator );
105 archive & BOOST_SERIALIZATION_NVP( m_crossoverProbability );
108 archive & BOOST_SERIALIZATION_NVP(
m_parents );
109 archive & BOOST_SERIALIZATION_NVP( m_mu );
110 archive & BOOST_SERIALIZATION_NVP(
m_best );
112 archive & BOOST_SERIALIZATION_NVP( m_selection );
113 archive & BOOST_SERIALIZATION_NVP( m_crossover );
114 archive & BOOST_SERIALIZATION_NVP( m_mutator );
115 archive & BOOST_SERIALIZATION_NVP( m_crossoverProbability );
127 std::vector<SearchPointType>
const& initialSearchPoints
130 std::vector<RealVector> values(initialSearchPoints.size());
131 for(std::size_t i = 0; i != initialSearchPoints.size(); ++i){
132 if(!
function.isFeasible(initialSearchPoints[i]))
133 throw SHARKEXCEPTION(
"[SMS-EMOA::init] starting point(s) not feasible");
134 values[i] =
function.eval(initialSearchPoints[i]);
137 std::size_t dim =
function.numberOfVariables();
138 RealVector lowerBounds(dim, -1E20);
139 RealVector upperBounds(dim, 1E20);
140 if (
function.hasConstraintHandler() &&
function.getConstraintHandler().isBoxConstrained()) {
142 ConstraintHandler
const& handler =
static_cast<ConstraintHandler const&
>(
function.getConstraintHandler());
144 lowerBounds = handler.
lower();
145 upperBounds = handler.upper();
147 throw SHARKEXCEPTION(
"[SMS-EMOA::init] Algorithm does only allow box constraints");
160 penalizingEvaluator(
function, offspring.begin(), offspring.end() );
168 std::vector<SearchPointType>
const& initialSearchPoints,
169 std::vector<ResultType>
const& functionValues,
170 RealVector
const& lowerBounds,
171 RealVector
const& upperBounds,
175 double crossover_prob
181 m_crossoverProbability = crossover_prob;
185 std::size_t numPoints = 0;
186 if(initialSearchPoints.size()<=
mu){
187 numPoints = initialSearchPoints.size();
188 for(std::size_t i = 0; i != numPoints; ++i){
189 m_parents[i].searchPoint() = initialSearchPoints[i];
190 m_parents[i].penalizedFitness() = functionValues[i];
191 m_parents[i].unpenalizedFitness() = functionValues[i];
195 for(std::size_t i = numPoints; i !=
mu; ++i){
196 std::size_t index =
discrete(*mpe_rng,0,initialSearchPoints.size()-1);
197 m_parents[i].searchPoint() = initialSearchPoints[index];
198 m_parents[i].penalizedFitness() = functionValues[index];
199 m_parents[i].unpenalizedFitness() = functionValues[index];
202 for(std::size_t i = 0; i !=
mu; ++i){
208 m_crossover.
init(lowerBounds,upperBounds);
209 m_mutator.
init(lowerBounds,upperBounds);
213 std::vector<IndividualType> offspring(1);
224 for(std::size_t i = 0; i !=
mu(); ++i){
239 IndividualType createOffspring(
240 std::vector<IndividualType>::const_iterator begin,
241 std::vector<IndividualType>::const_iterator end
245 IndividualType mate1( *selection(*mpe_rng, begin, end ) );
246 IndividualType mate2( *selection(*mpe_rng, begin, end) );
248 if(
coinToss(*mpe_rng, m_crossoverProbability ) ) {
249 m_crossover(*mpe_rng, mate1, mate2 );
253 m_mutator(*mpe_rng, mate1 );
256 m_mutator(*mpe_rng, mate2 );
267 double m_crossoverProbability;