added permut components

This commit is contained in:
tlegrand 2007-11-12 15:41:09 +00:00
commit ec112ae2f2
4 changed files with 305 additions and 0 deletions

58
eo/src/eoInt.h Normal file
View file

@ -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 <iostream> // std::ostream, std::istream
#include <string> // std::string
#include <eoVector.h>
/** eoInt: implementation of simple integer-valued chromosome.
* based on eoVector class
*/
template <class FitT> class eoInt: public eoVector<FitT, int>
{
public:
/**
* (Default) Constructor.
* @param size Size of the std::vector
*/
eoInt(unsigned size = 0, int value = 0):
eoVector<FitT, int>(size, value) {}
/// My class name.
virtual std::string className() const
{
return "eoInt";
}
};
//-----------------------------------------------------------------------------
#endif

88
eo/src/eoShiftMutation.h Normal file
View file

@ -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 EOT> class eoShiftMutation: public eoMonOp<EOT>
{
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

79
eo/src/eoSwapMutation.h Normal file
View file

@ -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 Chrom> class eoSwapMutation: public eoMonOp<Chrom>
{
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

80
eo/src/eoTwoOptMutation.h Normal file
View file

@ -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 EOT> class eoTwoOptMutation: public eoMonOp<EOT>
{
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