30 #ifndef SHARK_ALGORITHMS_DIRECT_SEARCH_STEADYSTATEMOCMA 31 #define SHARK_ALGORITHMS_DIRECT_SEARCH_STEADYSTATEMOCMA 42 #include <boost/foreach.hpp> 53 template<
typename Indicator=HypervolumeIndicator>
63 m_individualSuccessThreshold = 0.44;
74 return "SteadyStateMOCMA";
77 std::size_t
mu()
const{
85 return m_initialSigma;
88 return m_initialSigma;
92 return m_notionOfSuccess;
95 return m_notionOfSuccess;
99 archive >> BOOST_SERIALIZATION_NVP(
m_parents);
100 archive >> BOOST_SERIALIZATION_NVP(m_mu);
101 archive >> BOOST_SERIALIZATION_NVP(
m_best);
103 archive >> BOOST_SERIALIZATION_NVP(m_selection);
104 archive >> BOOST_SERIALIZATION_NVP(m_notionOfSuccess);
105 archive >> BOOST_SERIALIZATION_NVP(m_individualSuccessThreshold);
106 archive >> BOOST_SERIALIZATION_NVP(m_initialSigma);
109 archive << BOOST_SERIALIZATION_NVP(
m_parents);
110 archive << BOOST_SERIALIZATION_NVP(m_mu);
111 archive << BOOST_SERIALIZATION_NVP(
m_best);
113 archive << BOOST_SERIALIZATION_NVP(m_selection);
114 archive << BOOST_SERIALIZATION_NVP(m_notionOfSuccess);
115 archive << BOOST_SERIALIZATION_NVP(m_individualSuccessThreshold);
116 archive << BOOST_SERIALIZATION_NVP(m_initialSigma);
121 if(!
function.canProposeStartingPoint())
122 throw SHARKEXCEPTION(
"Objective function does not propose a starting point");
123 std::vector<RealVector> points(
mu());
124 for(std::size_t i = 0; i !=
mu(); ++i){
125 points[i] =
function.proposeStartingPoint();
127 init(
function,points);
137 std::vector<SearchPointType>
const& initialSearchPoints
140 std::vector<RealVector> values(initialSearchPoints.size());
141 for(std::size_t i = 0; i != initialSearchPoints.size(); ++i){
142 if(!
function.isFeasible(initialSearchPoints[i]))
143 throw SHARKEXCEPTION(
"[SteadyStateMOCMA::init] starting point(s) not feasible");
144 values[i] =
function.eval(initialSearchPoints[i]);
157 penalizingEvaluator(
function, offspring.begin(), offspring.end() );
165 std::vector<SearchPointType>
const& initialSearchPoints,
166 std::vector<ResultType>
const& functionValues,
177 std::size_t noVariables = initialSearchPoints[0].size();
180 std::size_t numPoints = 0;
181 if(initialSearchPoints.size()<=
mu){
182 numPoints = initialSearchPoints.size();
183 for(std::size_t i = 0; i != numPoints; ++i){
185 m_parents[i].searchPoint() = initialSearchPoints[i];
186 m_parents[i].penalizedFitness() = functionValues[i];
187 m_parents[i].unpenalizedFitness() = functionValues[i];
191 for(std::size_t i = numPoints; i !=
mu; ++i){
192 std::size_t index =
discrete(*mpe_rng, 0,initialSearchPoints.size()-1);
194 m_parents[i].searchPoint() = initialSearchPoints[index];
195 m_parents[i].penalizedFitness() = functionValues[index];
196 m_parents[i].unpenalizedFitness() = functionValues[index];
199 for(std::size_t i = 0; i !=
mu; ++i){
204 sortRankOneToFront();
209 std::size_t maxIdx = 0;
210 for (; maxIdx <
m_parents.size(); maxIdx++) {
215 std::size_t parentId =
discrete(*mpe_rng, 0, maxIdx-1);
216 std::vector<IndividualType> offspring;
217 offspring.push_back(
m_parents[parentId]);
218 offspring[0].mutate(*mpe_rng);
219 offspring[0].parent() = parentId;
227 IndividualType& offspring =
m_parents.back();
243 for(std::size_t i = 0; i !=
mu(); ++i){
253 sortRankOneToFront();
263 double m_individualSuccessThreshold;
264 double m_initialSigma;
267 void sortRankOneToFront(){
268 std::size_t start = 0;
269 std::size_t end =
mu()-1;
271 if(m_parents[start].rank() == 1){
273 }
else if(m_parents[end].rank() != 1){
276 swap(m_parents[start],m_parents[end]);