Paradiseo-eo sources added

git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@40 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
legrand 2006-12-12 14:49:08 +00:00
commit c3aec878e5
3609 changed files with 342772 additions and 0 deletions

View file

@ -0,0 +1,343 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>EO: eoBitOp.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.9.1 -->
<div class="qindex"> <form class="search" action="search.php" method="get">
<a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a> | <span class="search"><u>S</u>earch&nbsp;for&nbsp;<input class="search" type="text" name="query" value="" size="20" accesskey="s"/></span></form></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a>&nbsp;/&nbsp;<a class="el" href="dir_000013.html">ga</a></div>
<h1>eoBitOp.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-</span>
00002
00003 <span class="comment">//-----------------------------------------------------------------------------</span>
00004 <span class="comment">// eoBitOp.h</span>
00005 <span class="comment">// (c) GeNeura Team, 2000 - EEAAX 2000 - Maarten Keijzer 2000</span>
00006 <span class="comment">/* </span>
00007 <span class="comment"> This library is free software; you can redistribute it and/or</span>
00008 <span class="comment"> modify it under the terms of the GNU Lesser General Public</span>
00009 <span class="comment"> License as published by the Free Software Foundation; either</span>
00010 <span class="comment"> version 2 of the License, or (at your option) any later version.</span>
00011 <span class="comment"></span>
00012 <span class="comment"> This library is distributed in the hope that it will be useful,</span>
00013 <span class="comment"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00014 <span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
00015 <span class="comment"> Lesser General Public License for more details.</span>
00016 <span class="comment"></span>
00017 <span class="comment"> You should have received a copy of the GNU Lesser General Public</span>
00018 <span class="comment"> License along with this library; if not, write to the Free Software</span>
00019 <span class="comment"> Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
00020 <span class="comment"></span>
00021 <span class="comment"> Contact: todos@geneura.ugr.es, http://geneura.ugr.es</span>
00022 <span class="comment"> Marc.Schoenauer@polytechnique.fr</span>
00023 <span class="comment"> mak@dhi.dk</span>
00024 <span class="comment"> CVS Info: $Date: 2003/06/06 10:29:13 $ $Header: /cvsroot/eodev/eo/src/ga/eoBitOp.h,v 1.17 2003/06/06 10:29:13 maartenkeijzer Exp $ $Author: maartenkeijzer $</span>
00025 <span class="comment"> */</span>
00026 <span class="comment">//-----------------------------------------------------------------------------</span>
00027
00028 <span class="preprocessor">#ifndef eoBitOp_h</span>
00029 <span class="preprocessor"></span><span class="preprocessor">#define eoBitOp_h</span>
00030 <span class="preprocessor"></span>
00031 <span class="comment">//-----------------------------------------------------------------------------</span>
00032
00033 <span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// swap_ranges</span>
00034 <span class="preprocessor">#include &lt;utils/eoRNG.h&gt;</span>
00035 <span class="preprocessor">#include &lt;eoInit.h&gt;</span> <span class="comment">// eoMonOp</span>
00036 <span class="preprocessor">#include &lt;ga/eoBit.h&gt;</span>
00037
00038
00044 <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span>eoOneBitFlip: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a>&lt;Chrom&gt;
00045 {
00046 <span class="keyword">public</span>:
00048 <span class="keyword">virtual</span> std::string className()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoOneBitFlip"</span>; }
00049
00054 <span class="keywordtype">bool</span> <a class="code" href="classeo_u_f.html#a1">operator()</a>(Chrom&amp; chrom)
00055 {
00056 <span class="keywordtype">unsigned</span> i = eo::rng.random(chrom.size());
00057 chrom[i] = (chrom[i]) ? <span class="keyword">false</span> : <span class="keyword">true</span>;
00058 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00059 }
00060 };
00061
<a name="l00067"></a><a class="code" href="classeo_det_bit_flip.html">00067</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_det_bit_flip.html">eoDetBitFlip</a>: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a>&lt;Chrom&gt;
00068 {
00069 <span class="keyword">public</span>:
<a name="l00075"></a><a class="code" href="classeo_det_bit_flip.html#a0">00075</a> <a class="code" href="classeo_det_bit_flip.html#a0">eoDetBitFlip</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span>&amp; _num_bit = 1): num_bit(_num_bit) {}
00076
<a name="l00078"></a><a class="code" href="classeo_det_bit_flip.html#a1">00078</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_det_bit_flip.html#a1">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoDetBitFlip"</span>; }
00079
<a name="l00084"></a><a class="code" href="classeo_det_bit_flip.html#a2">00084</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_det_bit_flip.html#a2">operator()</a>(Chrom&amp; chrom)
00085 {
00086 <span class="comment">// does not check for duplicate: if someone volunteers ....</span>
00087 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> k=0; k&lt;num_bit; k++)
00088 {
00089 <span class="keywordtype">unsigned</span> i = eo::rng.random(chrom.size());
00090 chrom[i] = (chrom[i]) ? <span class="keyword">false</span> : <span class="keyword">true</span>;
00091 }
00092 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00093 }
00094 <span class="keyword">private</span>:
00095 <span class="keywordtype">unsigned</span> num_bit;
00096 };
00097
00098
<a name="l00104"></a><a class="code" href="classeo_bit_mutation.html">00104</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_bit_mutation.html">eoBitMutation</a>: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a>&lt;Chrom&gt;
00105 {
00106 <span class="keyword">public</span>:
<a name="l00111"></a><a class="code" href="classeo_bit_mutation.html#a0">00111</a> <a class="code" href="classeo_bit_mutation.html#a0">eoBitMutation</a>(<span class="keyword">const</span> <span class="keywordtype">double</span>&amp; _rate = 0.01, <span class="keywordtype">bool</span> _normalize=<span class="keyword">false</span>):
00112 rate(_rate), normalize(_normalize) {}
00113
<a name="l00115"></a><a class="code" href="classeo_bit_mutation.html#a1">00115</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_bit_mutation.html#a1">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoBitMutation"</span>; }
00116
<a name="l00121"></a><a class="code" href="classeo_bit_mutation.html#a2">00121</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_bit_mutation.html#a2">operator()</a>(Chrom&amp; chrom)
00122 {
00123 <span class="keywordtype">double</span> actualRate = (normalize ? rate/chrom.size() : rate);
00124 <span class="keywordtype">bool</span> changed_something = <span class="keyword">false</span>;
00125 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; chrom.size(); i++)
00126 <span class="keywordflow">if</span> (eo::rng.flip(actualRate))
00127 {
00128 chrom[i] = !chrom[i];
00129 changed_something = <span class="keyword">true</span>;
00130 }
00131
00132 <span class="keywordflow">return</span> changed_something;
00133 }
00134
00135 <span class="keyword">private</span>:
00136 <span class="keywordtype">double</span> rate;
00137 <span class="keywordtype">bool</span> normalize; <span class="comment">// divide rate by chromSize</span>
00138 };
00139
00140
<a name="l00146"></a><a class="code" href="classeo_bit_inversion.html">00146</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_bit_inversion.html">eoBitInversion</a>: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a>&lt;Chrom&gt;
00147 {
00148 <span class="keyword">public</span>:
<a name="l00150"></a><a class="code" href="classeo_bit_inversion.html#a0">00150</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_bit_inversion.html#a0">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoBitInversion"</span>; }
00151
<a name="l00156"></a><a class="code" href="classeo_bit_inversion.html#a1">00156</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_bit_inversion.html#a1">operator()</a>(Chrom&amp; chrom)
00157 {
00158
00159 <span class="keywordtype">unsigned</span> u1 = eo::rng.random(chrom.size() + 1) , u2;
00160 <span class="keywordflow">do</span> u2 = eo::rng.random(chrom.size() + 1); <span class="keywordflow">while</span> (u1 == u2);
00161 <span class="keywordtype">unsigned</span> r1 = std::min(u1, u2), r2 = std::max(u1, u2);
00162
00163 std::reverse(chrom.begin() + r1, chrom.begin() + r2);
00164 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00165 }
00166 };
00167
00168
<a name="l00174"></a><a class="code" href="classeo_bit_next.html">00174</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_bit_next.html">eoBitNext</a>: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a>&lt;Chrom&gt;
00175 {
00176 <span class="keyword">public</span>:
<a name="l00178"></a><a class="code" href="classeo_bit_next.html#a0">00178</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_bit_next.html#a0">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoBitNext"</span>; }
00179
<a name="l00184"></a><a class="code" href="classeo_bit_next.html#a1">00184</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_bit_next.html#a1">operator()</a>(Chrom&amp; chrom)
00185 {
00186 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = chrom.size() - 1; i &gt;= 0; i--)
00187 <span class="keywordflow">if</span> (chrom[i])
00188 {
00189 chrom[i] = 0;
00190 <span class="keywordflow">continue</span>;
00191 }
00192 <span class="keywordflow">else</span>
00193 {
00194 chrom[i] = 1;
00195 <span class="keywordflow">break</span>;
00196 }
00197
00198 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00199 }
00200 };
00201
00202
<a name="l00208"></a><a class="code" href="classeo_bit_prev.html">00208</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_bit_prev.html">eoBitPrev</a>: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a>&lt;Chrom&gt;
00209 {
00210 <span class="keyword">public</span>:
<a name="l00212"></a><a class="code" href="classeo_bit_prev.html#a0">00212</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_bit_prev.html#a0">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoBitPrev"</span>; }
00213
<a name="l00218"></a><a class="code" href="classeo_bit_prev.html#a1">00218</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_bit_prev.html#a1">operator()</a>(Chrom&amp; chrom)
00219 {
00220 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = chrom.size() - 1; i &gt;= 0; i--)
00221 <span class="keywordflow">if</span> (chrom[i])
00222 {
00223 chrom[i] = 0;
00224 <span class="keywordflow">break</span>;
00225 }
00226 <span class="keywordflow">else</span>
00227 {
00228 chrom[i] = 1;
00229 <span class="keywordflow">continue</span>;
00230 }
00231
00232 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00233 }
00234 };
00235
00236
00242 <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span>eo1PtBitXover: <span class="keyword">public</span> <a class="code" href="classeo_quad_op.html">eoQuadOp</a>&lt;Chrom&gt;
00243 {
00244 <span class="keyword">public</span>:
00246 <span class="keyword">virtual</span> std::string className()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eo1PtBitXover"</span>; }
00247
00253 <span class="keywordtype">bool</span> <a class="code" href="classeo_b_f.html#a1">operator()</a>(Chrom&amp; chrom1, Chrom&amp; chrom2)
00254 {
00255 <span class="keywordtype">unsigned</span> site = eo::rng.random(std::min(chrom1.size(), chrom2.size()));
00256
00257 <span class="keywordflow">if</span> (!std::equal(chrom1.begin(), chrom1.begin()+site, chrom2.begin()))
00258 {
00259
00260 std::swap_ranges(chrom1.begin(), chrom1.begin() + site, chrom2.begin());
00261
00262 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00263 }
00264 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00265 }
00266 };
00267
00268
<a name="l00274"></a><a class="code" href="classeo_u_bit_xover.html">00274</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_u_bit_xover.html">eoUBitXover</a>: <span class="keyword">public</span> <a class="code" href="classeo_quad_op.html">eoQuadOp</a>&lt;Chrom&gt;
00275 {
00276 <span class="keyword">public</span>:
<a name="l00278"></a><a class="code" href="classeo_u_bit_xover.html#a0">00278</a> <a class="code" href="classeo_u_bit_xover.html#a0">eoUBitXover</a>(<span class="keyword">const</span> <span class="keywordtype">float</span>&amp; _preference = 0.5): preference(_preference)
00279 {
00280 <span class="keywordflow">if</span> ( (_preference &lt;= 0.0) || (_preference &gt;= 1.0) )
00281 std::runtime_error(<span class="stringliteral">"UxOver --&gt; invalid preference"</span>);
00282 }
<a name="l00284"></a><a class="code" href="classeo_u_bit_xover.html#a1">00284</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_u_bit_xover.html#a1">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoUBitXover"</span>; }
00285
<a name="l00292"></a><a class="code" href="classeo_u_bit_xover.html#a2">00292</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_u_bit_xover.html#a2">operator()</a>(Chrom&amp; chrom1, Chrom&amp; chrom2)
00293 {
00294 <span class="keywordflow">if</span> ( chrom1.size() != chrom2.size())
00295 std::runtime_error(<span class="stringliteral">"UxOver --&gt; chromosomes sizes don't match"</span> );
00296 <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;
00297 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;chrom1.size(); i++)
00298 {
00299 <span class="keywordflow">if</span> (chrom1[i] != chrom2[i] &amp;&amp; eo::rng.flip(preference))
00300 {
00301 <span class="keywordtype">bool</span> tmp = chrom1[i];
00302 chrom1[i]=chrom2[i];
00303 chrom2[i] = tmp;
00304 changed = <span class="keyword">true</span>;
00305 }
00306 }
00307 <span class="keywordflow">return</span> changed;
00308 }
00309 <span class="keyword">private</span>:
00310 <span class="keywordtype">float</span> preference;
00311 };
00312
00313
<a name="l00319"></a><a class="code" href="classeo_n_pts_bit_xover.html">00319</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_n_pts_bit_xover.html">eoNPtsBitXover</a>: <span class="keyword">public</span> <a class="code" href="classeo_quad_op.html">eoQuadOp</a>&lt;Chrom&gt;
00320 {
00321 <span class="keyword">public</span>:
<a name="l00323"></a><a class="code" href="classeo_n_pts_bit_xover.html#a0">00323</a> <a class="code" href="classeo_n_pts_bit_xover.html#a0">eoNPtsBitXover</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span>&amp; _num_points = 2): num_points(_num_points)
00324 {
00325 <span class="keywordflow">if</span> (num_points &lt; 1)
00326 std::runtime_error(<span class="stringliteral">"NxOver --&gt; invalid number of points"</span>);
00327 }
00328
<a name="l00330"></a><a class="code" href="classeo_n_pts_bit_xover.html#a1">00330</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_n_pts_bit_xover.html#a1">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoNPtsBitXover"</span>; }
00331
<a name="l00337"></a><a class="code" href="classeo_n_pts_bit_xover.html#a2">00337</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_n_pts_bit_xover.html#a2">operator()</a>(Chrom&amp; chrom1, Chrom&amp; chrom2)
00338 {
00339 <span class="keywordtype">unsigned</span> max_size = std::min(chrom1.size(), chrom2.size());
00340 <span class="keywordtype">unsigned</span> max_points = std::min(max_size - 1, num_points);
00341
00342 std::vector&lt;bool&gt; points(max_size, <span class="keyword">false</span>);
00343
00344 <span class="comment">// select ranges of bits to swap</span>
00345 <span class="keywordflow">do</span> {
00346 <span class="keywordtype">unsigned</span> bit = eo::rng.random(max_size) + 1;
00347 <span class="keywordflow">if</span> (points[bit])
00348 <span class="keywordflow">continue</span>;
00349 <span class="keywordflow">else</span>
00350 {
00351 points[bit] = <span class="keyword">true</span>;
00352 max_points--;
00353 }
00354 } <span class="keywordflow">while</span> (max_points);
00355
00356
00357 <span class="comment">// swap bits between chromosomes</span>
00358 <span class="keywordtype">bool</span> change = <span class="keyword">false</span>;
00359 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> bit = 1; bit &lt; points.size(); bit++)
00360 {
00361 <span class="keywordflow">if</span> (points[bit])
00362 change = !change;
00363
00364 <span class="keywordflow">if</span> (change)
00365 {
00366 <span class="keyword">typename</span> Chrom::AtomType tmp= chrom1[bit];
00367 chrom1[bit] = chrom2[bit];
00368 chrom2[bit] = tmp;
00369 }
00370 }
00371
00372 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00373 }
00374
00375 <span class="keyword">private</span>:
00376 <span class="keywordtype">unsigned</span> num_points;
00377 };
00378
00379
00380
<a name="l00388"></a><a class="code" href="classeo_bit_gx_over.html">00388</a> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Chrom&gt; <span class="keyword">class </span><a class="code" href="classeo_bit_gx_over.html">eoBitGxOver</a>: <span class="keyword">public</span> <a class="code" href="classeo_quad_op.html">eoQuadOp</a>&lt;Chrom&gt;
00389 {
00390 <span class="keyword">public</span>:
<a name="l00392"></a><a class="code" href="classeo_bit_gx_over.html#a0">00392</a> <a class="code" href="classeo_bit_gx_over.html#a0">eoBitGxOver</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> _gene_size, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> _num_points = 2):
00393 gene_size(_gene_size), num_points(_num_points)
00394 {
00395 <span class="keywordflow">if</span> (gene_size &lt; 1)
00396 std::runtime_error(<span class="stringliteral">"GxOver --&gt; invalid gene size"</span>);
00397 <span class="keywordflow">if</span> (num_points &lt; 1)
00398 std::runtime_error(<span class="stringliteral">"GxOver --&gt; invalid number of points"</span>);
00399 }
00400
<a name="l00402"></a><a class="code" href="classeo_bit_gx_over.html#a1">00402</a> <span class="keyword">virtual</span> std::string <a class="code" href="classeo_bit_gx_over.html#a1">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"eoBitGxOver"</span>; }
00403
<a name="l00409"></a><a class="code" href="classeo_bit_gx_over.html#a2">00409</a> <span class="keywordtype">bool</span> <a class="code" href="classeo_bit_gx_over.html#a2">operator()</a>(Chrom&amp; chrom1, Chrom&amp; chrom2)
00410 {
00411 <span class="keywordtype">unsigned</span> max_genes = std::min(chrom1.size(), chrom2.size()) / gene_size;
00412 <span class="keywordtype">unsigned</span> cut_genes = std::min(max_genes, num_points);
00413
00414 std::vector&lt;bool&gt; points(max_genes, <span class="keyword">false</span>);
00415
00416 <span class="comment">// selects genes to swap</span>
00417 <span class="keywordflow">do</span> {
00418 <span class="keywordtype">unsigned</span> bit = eo::rng.random(max_genes);
00419 <span class="keywordflow">if</span> (points[bit])
00420 <span class="keywordflow">continue</span>;
00421 <span class="keywordflow">else</span>
00422 {
00423 points[bit] = <span class="keyword">true</span>;
00424 cut_genes--;
00425 }
00426 } <span class="keywordflow">while</span> (cut_genes);
00427
00428 <span class="comment">// swaps genes</span>
00429 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; points.size(); i++)
00430 <span class="keywordflow">if</span> (points[i])
00431 std::swap_ranges(chrom1.begin() + i * gene_size,
00432 chrom1.begin() + i * gene_size + gene_size,
00433 chrom2.begin() + i * gene_size);
00434
00435 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00436 }
00437
00438 <span class="keyword">private</span>:
00439 <span class="keywordtype">unsigned</span> gene_size;
00440 <span class="keywordtype">unsigned</span> num_points;
00441 };
00442
00443
00444
00445 <span class="comment">//-----------------------------------------------------------------------------</span>
00447 <span class="comment"></span><span class="preprocessor">#endif</span>
00448 <span class="preprocessor"></span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Oct 19 05:06:34 2006 for EO by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
</body>
</html>