diff --git a/eo/src/eoInt.h b/eo/src/eoInt.h new file mode 100644 index 00000000..2742edaa --- /dev/null +++ b/eo/src/eoInt.h @@ -0,0 +1,58 @@ +/* + eoInt.h +// (c) Marc Schoenauer, Maarten Keijzer and GeNeura Team, 2000 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Contact: thomas.legrand@lifl.fr + todos@geneura.ugr.es, http://geneura.ugr.es + mkeijzer@dhi.dk +*/ + +#ifndef eoInt_h +#define eoInt_h + +//----------------------------------------------------------------------------- + +#include // std::ostream, std::istream +#include // std::string + +#include + +/** eoInt: implementation of simple integer-valued chromosome. + * based on eoVector class +*/ +template class eoInt: public eoVector +{ + public: + + /** + * (Default) Constructor. + * @param size Size of the std::vector + */ + eoInt(unsigned size = 0, int value = 0): + eoVector(size, value) {} + + /// My class name. + virtual std::string className() const + { + return "eoInt"; + } + +}; + +//----------------------------------------------------------------------------- + +#endif diff --git a/eo/src/eoShiftMutation.h b/eo/src/eoShiftMutation.h new file mode 100644 index 00000000..612cf4d4 --- /dev/null +++ b/eo/src/eoShiftMutation.h @@ -0,0 +1,88 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// eoShiftMutation.h +// (c) GeNeura Team, 2000 - EEAAX 2000 - Maarten Keijzer 2000 +// (c) INRIA Futurs - Dolphin Team - Thomas Legrand 2007 +/* + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Contact: todos@geneura.ugr.es, http://geneura.ugr.es + thomas.legrand@lifl.fr + Marc.Schoenauer@polytechnique.fr + mak@dhi.dk + */ +//----------------------------------------------------------------------------- + +#ifndef eoShiftMutation_h +#define eoShiftMutation_h + +//----------------------------------------------------------------------------- + + +/** + * Shift two components of a chromosome. + */ +template class eoShiftMutation: public eoMonOp +{ + public: + + typedef typename EOT::AtomType GeneType; + + /// CTor + eoShiftMutation(){} + + + /// The class name. + virtual std::string className() const { return "eoShiftMutation"; } + + + /** + * Shift two components of the given eoosome. + * @param eo The cromosome which is going to be changed. + */ + bool operator()(EOT& _eo) + { + + unsigned i, j, from, to; + GeneType tmp; + + // generate two different indices + i=eo::rng.random(_eo.size()); + do j = eo::rng.random(_eo.size()); while (i == j); + + // indexes + from=std::min(i,j); + to=std::max(i,j); + + // keep the first component to change + tmp=_eo[to]; + + // shift + for(unsigned int k=to ; k > from ; k--) + _eo[k]=_eo[k-1]; + + // shift the first component + _eo[from]=tmp; + + return true; + } + +}; + + +//----------------------------------------------------------------------------- +#endif + diff --git a/eo/src/eoSwapMutation.h b/eo/src/eoSwapMutation.h new file mode 100644 index 00000000..0eda6416 --- /dev/null +++ b/eo/src/eoSwapMutation.h @@ -0,0 +1,79 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// eoSwapMutation.h +// (c) GeNeura Team, 2000 - EEAAX 2000 - Maarten Keijzer 2000 +// (c) INRIA Futurs - Dolphin Team - Thomas Legrand 2007 +/* + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Contact: todos@geneura.ugr.es, http://geneura.ugr.es + thomas.legrand@lifl.fr + Marc.Schoenauer@polytechnique.fr + mak@dhi.dk + */ +//----------------------------------------------------------------------------- + +#ifndef eoSwapMutation_h +#define eoSwapMutation_h + +//----------------------------------------------------------------------------- + + +/** + * Swap two components of a chromosome. + */ +template class eoSwapMutation: public eoMonOp +{ + public: + + /// CTor + eoSwapMutation(const unsigned _howManySwaps=1): howManySwaps(_howManySwaps) + { + // consistency check + if(howManySwaps < 1) + throw std::runtime_error("Invalid number of swaps in eoSwapMutation"); + } + + /// The class name. + virtual std::string className() const { return "eoSwapMutation"; } + + /** + * Swap two components of the given chromosome. + * @param chrom The cromosome which is going to be changed. + */ + bool operator()(Chrom& chrom) + { + unsigned i, j; + + for(unsigned int swap = 0; swap < howManySwaps; swap++) + { + // generate two different indices + i=eo::rng.random(chrom.size()); + do j = eo::rng.random(chrom.size()); while (i == j); + + // swap + std::swap(chrom[i],chrom[j]); + } + return true; + } + + private: + unsigned int howManySwaps; +}; + +//----------------------------------------------------------------------------- +#endif + diff --git a/eo/src/eoTwoOptMutation.h b/eo/src/eoTwoOptMutation.h new file mode 100644 index 00000000..d6e27ca0 --- /dev/null +++ b/eo/src/eoTwoOptMutation.h @@ -0,0 +1,80 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// eoTwoOptMutation.h +// (c) GeNeura Team, 2000 - EEAAX 2000 - Maarten Keijzer 2000 +// (c) INRIA Futurs - Dolphin Team - Thomas Legrand 2007 +/* + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Contact: todos@geneura.ugr.es, http://geneura.ugr.es + thomas.legrand@lifl.fr + Marc.Schoenauer@polytechnique.fr + mak@dhi.dk + */ +//----------------------------------------------------------------------------- + +#ifndef eoTwoOptMutation_h +#define eoTwoOptMutation_h + +//----------------------------------------------------------------------------- + + +/** + * Especially designed for combinatorial problem such as the TSP. + */ +template class eoTwoOptMutation: public eoMonOp +{ + public: + + typedef typename EOT::AtomType GeneType; + + /// CTor + eoTwoOptMutation(){} + + + /// The class name. + virtual std::string className() const { return "eoTwoOptMutation"; } + + + /** + * + * @param eo The cromosome which is going to be changed. + */ + bool operator()(EOT& _eo) + { + unsigned i,j,from,to; + + // generate two different indices + i=eo::rng.random(_eo.size()); + do j = eo::rng.random(_eo.size()); while (i == j); + + from=std::min(i,j); + to=std::max(i,j); + int idx =(to-from)/2; + + // inverse between from and to + for(unsigned int k = 0; k <= idx ;k++) + std::swap(_eo[from+k],_eo[to-k]); + + return true; + } + +}; + + +//----------------------------------------------------------------------------- +#endif +