00001
00040
00041
00042
00043
00044 #ifndef __CHROMOSOME_H
00045 #define __CHROMOSOME_H
00046
00047 #ifdef _WIN32
00048
00049
00050 #pragma warning(disable: 4786)
00051
00052
00053 #pragma warning(disable: 4804)
00054 #endif
00055
00056 #include <string>
00057 #include <vector>
00058 #include <SharkDefs.h>
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 class Individual;
00070 class Population;
00071 class IndividualMOO;
00072 class PopulationMOO;
00073
00074
00078 class Chromosome
00079 {
00080 friend class Individual;
00081 friend class Population;
00082 friend class IndividualMOO;
00083 friend class PopulationMOO;
00084
00085 public:
00086 bool sameType(const Chromosome& c) const
00087 {
00088 return strcmp(typeOfAlleles(), c.typeOfAlleles()) == 0;
00089 }
00090
00091 virtual ~Chromosome()
00092 { }
00093 virtual const char* typeOfAlleles() const = 0;
00094 virtual unsigned size() const = 0;
00095 virtual Chromosome& operator = (const Chromosome&) = 0;
00096
00097 virtual unsigned sizeOfAlleles() const = 0;
00098
00099
00100
00101
00102
00103 virtual void resize(unsigned n) = 0;
00104
00105 virtual void duplicate(unsigned start,
00106 unsigned stop,
00107 unsigned dest) = 0;
00108 virtual void invert(unsigned start,
00109 unsigned stop,
00110 unsigned granularity = 1) = 0;
00111 virtual void transcribe(unsigned start,
00112 unsigned stop,
00113 const Chromosome& chrom) = 0;
00114 virtual void swap(unsigned i, unsigned j) = 0;
00115 virtual void shuffle() = 0;
00116 virtual void replace(unsigned i,
00117 const Chromosome& chrom) = 0;
00118 virtual void insert(unsigned i,
00119 const Chromosome& chrom) = 0;
00120 virtual void append(const Chromosome& chrom) = 0;
00121 virtual void remove (unsigned i) = 0;
00122 virtual void remove (unsigned from, unsigned to) = 0;
00123 virtual void rotateRight(unsigned n = 1) = 0;
00124 virtual void rotateLeft(unsigned n = 1) = 0;
00125
00126 #ifndef _WIN32
00127
00128
00129
00130 virtual void crossover
00131 (
00132 const Chromosome& dad,
00133 const Chromosome& mom,
00134 const std::vector< unsigned >& points
00135 ) = 0;
00136 virtual void crossover
00137 (
00138 Chromosome& mate,
00139 const std::vector< unsigned >& points
00140 ) = 0;
00141 #endif // !_WIN32
00142
00143 virtual void crossover
00144 (
00145 const Chromosome& dad,
00146 const Chromosome& mom,
00147 const std::vector< bool >& pos
00148 ) = 0;
00149 virtual void crossover
00150 (
00151 Chromosome& mate,
00152 const std::vector< bool >& pos
00153 ) = 0;
00154 virtual void crossover
00155 (
00156 const Chromosome& dad,
00157 const Chromosome& mom,
00158 unsigned npoints,
00159 unsigned align = 1,
00160 bool chromswap = 0
00161 ) = 0;
00162 virtual void crossover
00163 (
00164 Chromosome& mate,
00165 unsigned npoints,
00166 unsigned align = 1,
00167 bool chromswap = 0
00168
00169 ) = 0;
00170 virtual void crossover
00171 (
00172 const Chromosome& dad,
00173 const Chromosome& mom,
00174 const Chromosome& pos
00175 ) = 0;
00176 virtual void crossover
00177 (
00178 Chromosome& mate,
00179 const Chromosome& pos
00180 ) = 0;
00181 virtual void crossoverUniform
00182 (
00183 const Chromosome& dad,
00184 const Chromosome& mom,
00185 const std::vector< bool >& pos
00186 ) = 0;
00187 virtual void crossoverUniform
00188 (
00189 Chromosome& mate,
00190 const std::vector< bool >& pos
00191 ) = 0;
00192 virtual void crossoverUniform
00193 (
00194 const Chromosome& dad,
00195 const Chromosome& mom
00196 ) = 0;
00197 virtual void crossoverUniform
00198 (
00199 Chromosome& mate
00200 ) = 0;
00201 virtual void crossoverUniform
00202 (
00203 const Chromosome& dad,
00204 const Chromosome& mom,
00205 const Chromosome& pos
00206 ) = 0;
00207
00208
00209 virtual void recombineDiscrete(const Chromosome& dad,
00210 const Chromosome& mom) = 0;
00211 virtual void recombineDiscrete(Chromosome& mate) = 0;
00212
00213
00214 virtual bool operator < (const Chromosome& c) const;
00215 virtual bool operator == (const Chromosome& c) const;
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 typedef unsigned uint;
00232
00234 virtual void init();
00235
00237 virtual void init(const char* filename);
00238
00240 virtual void mutate();
00241
00242 #ifdef EALIB_REGISTER_INDIVIDUAL
00243
00247 virtual void registerIndividual(const Individual& i, uint you);
00248 #endif
00249
00255 virtual void appendToIndividual(Individual& i);
00256
00258 virtual int pvm_pkchrom();
00259
00261 virtual int pvm_upkchrom();
00262
00263
00264
00265
00266 protected:
00267 virtual Chromosome* clone() const = 0;
00268 virtual Chromosome* empty() const = 0;
00269
00270 #ifndef __NO_GENERIC_IOSTREAM
00271 virtual void writeTo(std::ostream&) const = 0;
00272 virtual void readFrom(std::istream&) = 0;
00273
00274 friend inline std::istream& operator >> (std::istream& is, Chromosome& c)
00275 {
00276 c.readFrom(is);
00277 IO_CHECK(is)
00278 return is;
00279 }
00280
00281 friend inline std::ostream& operator << (std::ostream& os, const Chromosome& c)
00282 {
00283 c.writeTo(os);
00284 IO_CHECK(os)
00285 return os;
00286 }
00287 #endif // !__NO_GENERIC_IOSTREAM
00288 };
00289
00290
00291
00292 #endif
00293