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:
parent
bc1f453978
commit
c3aec878e5
3609 changed files with 342772 additions and 0 deletions
343
trunk/paradiseo-eo/doc/html/eo_bit_op_8h-source.html
Normal file
343
trunk/paradiseo-eo/doc/html/eo_bit_op_8h-source.html
Normal 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 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 Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="pages.html">Related Pages</a> | <span class="search"><u>S</u>earch for <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> / <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 <algorithm></span> <span class="comment">// swap_ranges</span>
|
||||
00034 <span class="preprocessor">#include <utils/eoRNG.h></span>
|
||||
00035 <span class="preprocessor">#include <eoInit.h></span> <span class="comment">// eoMonOp</span>
|
||||
00036 <span class="preprocessor">#include <ga/eoBit.h></span>
|
||||
00037
|
||||
00038
|
||||
00044 <span class="keyword">template</span><<span class="keyword">class</span> Chrom> <span class="keyword">class </span>eoOneBitFlip: <span class="keyword">public</span> <a class="code" href="classeo_mon_op.html">eoMonOp</a><Chrom>
|
||||
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& 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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>& _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& 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<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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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>& _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& 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 < 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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& 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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& chrom)
|
||||
00185 {
|
||||
00186 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = chrom.size() - 1; i >= 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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& chrom)
|
||||
00219 {
|
||||
00220 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = chrom.size() - 1; i >= 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><<span class="keyword">class</span> Chrom> <span class="keyword">class </span>eo1PtBitXover: <span class="keyword">public</span> <a class="code" href="classeo_quad_op.html">eoQuadOp</a><Chrom>
|
||||
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& chrom1, Chrom& 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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>& _preference = 0.5): preference(_preference)
|
||||
00279 {
|
||||
00280 <span class="keywordflow">if</span> ( (_preference <= 0.0) || (_preference >= 1.0) )
|
||||
00281 std::runtime_error(<span class="stringliteral">"UxOver --> 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& chrom1, Chrom& chrom2)
|
||||
00293 {
|
||||
00294 <span class="keywordflow">if</span> ( chrom1.size() != chrom2.size())
|
||||
00295 std::runtime_error(<span class="stringliteral">"UxOver --> 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<chrom1.size(); i++)
|
||||
00298 {
|
||||
00299 <span class="keywordflow">if</span> (chrom1[i] != chrom2[i] && 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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>& _num_points = 2): num_points(_num_points)
|
||||
00324 {
|
||||
00325 <span class="keywordflow">if</span> (num_points < 1)
|
||||
00326 std::runtime_error(<span class="stringliteral">"NxOver --> 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& chrom1, Chrom& 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<bool> 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 < 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><<span class="keyword">class</span> Chrom> <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><Chrom>
|
||||
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 < 1)
|
||||
00396 std::runtime_error(<span class="stringliteral">"GxOver --> invalid gene size"</span>);
|
||||
00397 <span class="keywordflow">if</span> (num_points < 1)
|
||||
00398 std::runtime_error(<span class="stringliteral">"GxOver --> 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& chrom1, Chrom& 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<bool> 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 < 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
|
||||
<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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue