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
2595 changed files with 342772 additions and 0 deletions

View file

@ -0,0 +1,6 @@
Makefile
Makefile.in
eo.doxytag
html
latex
man

View file

@ -0,0 +1,10 @@
/.cvsignore/5.3/Thu Dec 23 17:26:39 2004//
/EO_EA2001.pdf/1.1/Mon Oct 3 10:06:26 2005/-kb/
/LeCreusot.pdf/1.1/Sat Oct 1 11:59:13 2005/-kb/
/Makefile.am/5.8/Fri Sep 24 15:00:42 2004//
/eo.cfg/1.13/Mon Oct 3 09:56:02 2005//
/index.h/1.8/Mon Oct 3 10:56:56 2005//
/mainpage.html/1.20/Tue Jun 13 13:35:26 2006//
/publications.html/1.1/Sat Mar 25 13:03:45 2006//
/sflogo-hammer1.jpg/1.1/Mon Oct 3 10:10:09 2005/-kb/
D

View file

@ -0,0 +1 @@
eo/doc

View file

@ -0,0 +1 @@
:ext:evomarc@eodev.cvs.sourceforge.net:/cvsroot/eodev

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,10 @@
## Makefile.am for eo/doc
EXTRA_DIST = eo.cfg foot.html
doc:
cd $(srcdir) && $(DOXYGEN) eo.cfg
clean-local:
cd $(srcdir) && rm -rf html latex man

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,102 @@
<!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: BitEA.cpp 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_000003.html">tutorial</a>&nbsp;/&nbsp;<a class="el" href="dir_000006.html">Lesson4</a></div>
<h1>BitEA.cpp</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#include &lt;iostream&gt;</span>
00002
00003 <span class="preprocessor">#include &lt;ga/make_ga.h&gt;</span>
00004 <span class="preprocessor">#include &lt;apply.h&gt;</span>
00005
00006 <span class="comment">// EVAL</span>
00007 <span class="preprocessor">#include "binary_value.h"</span>
00008
00009 <span class="comment">// GENERAL</span>
00010 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
00011
00012 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>* argv[])
00013 {
00014
00015 <span class="keywordflow">try</span>
00016 {
00017 <span class="comment">// REPRESENTATION</span>
00018 <span class="comment">//-----------------------------------------------------------------------------</span>
00019 <span class="comment">// define your genotype and fitness types</span>
00020 <span class="keyword">typedef</span> <a class="code" href="classeo_bit.html">eoBit&lt;double&gt;</a> <a class="code" href="struct_dummy.html">EOT</a>;
00021
00022 <span class="comment">// PARAMETRES</span>
00023 eoParser parser(argc, argv); <span class="comment">// for user-parameter reading</span>
00024
00025 <span class="comment">// GENERAL</span>
00026 <a class="code" href="classeo_state.html">eoState</a> state; <span class="comment">// keeps all things allocated</span>
00027
00030
00031 <span class="comment">// EVAL</span>
00032 <span class="comment">// The evaluation fn - encapsulated into an eval counter for output </span>
00033 <a class="code" href="structeo_eval_func_ptr.html">eoEvalFuncPtr&lt;EOT, double&gt;</a> mainEval( binary_value&lt;EOT&gt; );
00034 <a class="code" href="classeo_eval_func_counter.html">eoEvalFuncCounter&lt;EOT&gt;</a> eval(mainEval);
00035
00036 <span class="comment">// REPRESENTATION</span>
00037 <span class="comment">// the genotype - through a genotype initializer</span>
00038 <a class="code" href="classeo_init.html">eoInit&lt;EOT&gt;</a>&amp; init = make_genotype(parser, state, EOT());
00039
00040 <span class="comment">// if you want to do sharing, you'll need a distance.</span>
00041 <span class="comment">// here Hamming distance </span>
00042 <a class="code" href="classeo_hamming_distance.html">eoHammingDistance&lt;EOT&gt;</a> dist;
00043
00044 <span class="comment">// OPERATORS</span>
00045 <span class="comment">// Build the variation operator (any seq/prop construct)</span>
00046 <a class="code" href="classeo_gen_op.html">eoGenOp&lt;EOT&gt;</a>&amp; op = make_op(parser, state, init);
00047
00048 <span class="comment">// GENERAL</span>
00051 <span class="comment"></span>
00052 <span class="comment">// initialize the population - and evaluate</span>
00053 <span class="comment">// yes, this is representation indepedent once you have an eoInit</span>
00054 <a class="code" href="classeo_pop.html">eoPop&lt;EOT&gt;</a>&amp; pop = make_pop(parser, state, init);
00055
00056 <span class="comment">// STOP</span>
00057 <span class="comment">// stopping criteria</span>
00058 <a class="code" href="classeo_continue.html">eoContinue&lt;EOT&gt;</a> &amp; term = make_continue(parser, state, eval);
00059 <span class="comment">// output</span>
00060 <a class="code" href="classeo_check_point.html">eoCheckPoint&lt;EOT&gt;</a> &amp; checkpoint = make_checkpoint(parser, state, eval, term);
00061 <span class="comment">// GENERATION</span>
00062 <span class="comment">// algorithm (need the operator!)</span>
00063 <a class="code" href="classeo_algo.html">eoAlgo&lt;EOT&gt;</a>&amp; ga = make_algo_scalar(parser, state, eval, checkpoint, op, &amp;dist);
00064
00067 <span class="comment">// PARAMETRES</span>
00068 <span class="comment">// to be called AFTER all parameters have been read!!!</span>
00069 make_help(parser);
00070
00073 <span class="comment">// EVAL</span>
00074 <span class="comment">// evaluate intial population AFTER help and status in case it takes time</span>
00075 apply&lt;EOT&gt;(eval, pop);
00076 <span class="comment">// STOP</span>
00077 <span class="comment">// print it out (sort witout modifying) </span>
00078 cout &lt;&lt; <span class="stringliteral">"Initial Population\n"</span>;
00079 pop.<a class="code" href="classeo_pop.html#a17">sortedPrintOn</a>(cout);
00080 cout &lt;&lt; endl;
00081
00082 <span class="comment">// GENERATION</span>
00083 run_ea(ga, pop); <span class="comment">// run the ga</span>
00084 <span class="comment">// STOP</span>
00085 <span class="comment">// print it out (sort witout modifying) </span>
00086 cout &lt;&lt; <span class="stringliteral">"Final Population\n"</span>;
00087 pop.<a class="code" href="classeo_pop.html#a17">sortedPrintOn</a>(cout);
00088 cout &lt;&lt; endl;
00089 <span class="comment">// GENERAL</span>
00090 }
00091 <span class="keywordflow">catch</span>(exception&amp; e)
00092 {
00093 cout &lt;&lt; e.what() &lt;&lt; endl;
00094 }
00095 }
</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>

View file

@ -0,0 +1,95 @@
<!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: BoundsCheck.cpp 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_000007.html">contrib</a>&nbsp;/&nbsp;<a class="el" href="dir_000008.html">mathsym</a>&nbsp;/&nbsp;<a class="el" href="dir_000009.html">eval</a></div>
<h1>BoundsCheck.cpp</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* </span>
00002 <span class="comment"> * Copyright (C) 2005 Maarten Keijzer</span>
00003 <span class="comment"> *</span>
00004 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
00005 <span class="comment"> * it under the terms of version 2 of the GNU General Public License as </span>
00006 <span class="comment"> * published by the Free Software Foundation. </span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
00009 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00010 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
00011 <span class="comment"> * GNU General Public License for more details.</span>
00012 <span class="comment"> *</span>
00013 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
00014 <span class="comment"> * along with this program; if not, write to the Free Software</span>
00015 <span class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
00016 <span class="comment"> */</span>
00017
00018 <span class="preprocessor">#include &lt;vector&gt;</span>
00019
00020 <span class="preprocessor">#include "BoundsCheck.h"</span>
00021 <span class="preprocessor">#include &lt;Sym.h&gt;</span>
00022 <span class="preprocessor">#include &lt;FunDef.h&gt;</span>
00023 <span class="preprocessor">#include &lt;sstream&gt;</span>
00024
00025 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
00026
00027 <span class="keyword">class </span>IntervalBoundsCheckImpl {
00028 <span class="keyword">public</span> :
00029 vector&lt;Interval&gt; bounds;
00030 };
00031
00032 IntervalBoundsCheck::IntervalBoundsCheck(<span class="keyword">const</span> vector&lt;double&gt;&amp; mins, <span class="keyword">const</span> vector&lt;double&gt;&amp; maxes) {
00033 pimpl = <span class="keyword">new</span> IntervalBoundsCheckImpl;
00034 vector&lt;Interval&gt;&amp; b = pimpl-&gt;bounds;
00035
00036 b.resize( mins.size());
00037
00038 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; b.size(); ++i) {
00039 b[i] = Interval(mins[i], maxes[i]);
00040 }
00041
00042 }
00043
00044 IntervalBoundsCheck::~IntervalBoundsCheck() { <span class="keyword">delete</span> pimpl; }
00045 IntervalBoundsCheck::IntervalBoundsCheck(<span class="keyword">const</span> IntervalBoundsCheck&amp; that) { pimpl = <span class="keyword">new</span> IntervalBoundsCheckImpl(*that.pimpl); }
00046 IntervalBoundsCheck&amp; IntervalBoundsCheck::operator=(<span class="keyword">const</span> IntervalBoundsCheck&amp; that) { *pimpl = *that.pimpl; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
00047
00048 <span class="keywordtype">bool</span> IntervalBoundsCheck::in_bounds(<span class="keyword">const</span> Sym&amp; sym)<span class="keyword"> const </span>{
00049 Interval bounds;
00050
00051 <span class="keywordflow">try</span> {
00052 bounds = eval(sym, pimpl-&gt;bounds);
00053 <span class="keywordflow">if</span> (!valid(bounds)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
00054 } <span class="keywordflow">catch</span> (interval_error) {
00055 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00056 }
00057 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00058 }
00059
00060 std::string IntervalBoundsCheck::get_bounds(<span class="keyword">const</span> Sym&amp; sym)<span class="keyword"> const </span>{
00061
00062 <span class="keywordflow">try</span> {
00063 Interval bounds = eval(sym, pimpl-&gt;bounds);
00064 <span class="keywordflow">if</span> (!valid(bounds)) <span class="keywordflow">return</span> <span class="stringliteral">"err"</span>;
00065 ostringstream os;
00066 os &lt;&lt; bounds;
00067 <span class="keywordflow">return</span> os.str();
00068 } <span class="keywordflow">catch</span> (interval_error) {
00069 <span class="keywordflow">return</span> <span class="stringliteral">"err"</span>;
00070 }
00071 }
00072
00073
00074 std::pair&lt;double, double&gt; IntervalBoundsCheck::calc_bounds(<span class="keyword">const</span> Sym&amp; sym)<span class="keyword"> const </span>{
00075
00076 Interval bounds = eval(sym, pimpl-&gt;bounds);
00077 <span class="keywordflow">return</span> make_pair(bounds.lower(), bounds.upper());
00078 }
00079
00080
</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>

View file

@ -0,0 +1,73 @@
<!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: BoundsCheck.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_000007.html">contrib</a>&nbsp;/&nbsp;<a class="el" href="dir_000008.html">mathsym</a>&nbsp;/&nbsp;<a class="el" href="dir_000009.html">eval</a></div>
<h1>BoundsCheck.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* </span>
00002 <span class="comment"> * Copyright (C) 2005 Maarten Keijzer</span>
00003 <span class="comment"> *</span>
00004 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
00005 <span class="comment"> * it under the terms of version 2 of the GNU General Public License as </span>
00006 <span class="comment"> * published by the Free Software Foundation. </span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
00009 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00010 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
00011 <span class="comment"> * GNU General Public License for more details.</span>
00012 <span class="comment"> *</span>
00013 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
00014 <span class="comment"> * along with this program; if not, write to the Free Software</span>
00015 <span class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
00016 <span class="comment"> */</span>
00017
00018 <span class="preprocessor">#ifndef BOUNDS_CHECK_H_</span>
00019 <span class="preprocessor"></span><span class="preprocessor">#define BOUNDS_CHECK_H_</span>
00020 <span class="preprocessor"></span>
00021 <span class="preprocessor">#include &lt;string&gt;</span>
00022
00023 <span class="keyword">class </span>IntervalBoundsCheckImpl;
00024 <span class="keyword">class </span>Sym;
00025
00026 <span class="keyword">class </span>BoundsCheck {
00027 <span class="keyword">public</span> :
00028 <span class="keyword">virtual</span> ~BoundsCheck() {};
00029 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> in_bounds(<span class="keyword">const</span> Sym&amp;) <span class="keyword">const </span>= 0;
00030 <span class="keyword">virtual</span> std::string get_bounds(<span class="keyword">const</span> Sym&amp;) <span class="keyword">const </span>= 0;
00031 };
00032
00033 <span class="comment">// checks if a formula keeps within bounds using interval arithmetic</span>
00034 <span class="keyword">class </span>IntervalBoundsCheck : <span class="keyword">public</span> BoundsCheck {
00035
00036 IntervalBoundsCheckImpl* pimpl;
00037
00038 <span class="keyword">public</span>:
00039
00040 IntervalBoundsCheck(<span class="keyword">const</span> std::vector&lt;double&gt;&amp; minima, <span class="keyword">const</span> std::vector&lt;double&gt;&amp; maxima);
00041 ~IntervalBoundsCheck();
00042 IntervalBoundsCheck(<span class="keyword">const</span> IntervalBoundsCheck&amp;);
00043 IntervalBoundsCheck&amp; operator=(<span class="keyword">const</span> IntervalBoundsCheck&amp;);
00044
00045 <span class="keywordtype">bool</span> in_bounds(<span class="keyword">const</span> Sym&amp;) <span class="keyword">const</span>;
00046 std::string get_bounds(<span class="keyword">const</span> Sym&amp;) <span class="keyword">const</span>;
00047
00048 std::pair&lt;double, double&gt; calc_bounds(<span class="keyword">const</span> Sym&amp;) <span class="keyword">const</span>;
00049 };
00050
00051 <span class="keyword">class </span>NoBoundsCheck : <span class="keyword">public</span> BoundsCheck {
00052 <span class="keywordtype">bool</span> in_bounds(<span class="keyword">const</span> Sym&amp;)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">false</span>; }
00053 std::string get_bounds(<span class="keyword">const</span> Sym&amp;)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">""</span>; }
00054 };
00055
00056 <span class="preprocessor">#endif</span>
00057 <span class="preprocessor"></span>
00058
</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>

View file

@ -0,0 +1,249 @@
<!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: CMAParams.cpp 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_000010.html">es</a></div>
<h1>CMAParams.cpp</h1><div class="fragment"><pre class="fragment">00001
00002 <span class="comment">/*</span>
00003 <span class="comment"> * C++ification of Nikolaus Hansen's original C-source code for the</span>
00004 <span class="comment"> * CMA-ES</span>
00005 <span class="comment"> *</span>
00006 <span class="comment"> * C++-ificiation performed by Maarten Keijzer (C) 2005. Licensed under</span>
00007 <span class="comment"> * the LGPL. Original copyright of Nikolaus Hansen can be found below</span>
00008 <span class="comment"> *</span>
00009 <span class="comment"> *</span>
00010 <span class="comment"> * </span>
00011 <span class="comment"> */</span>
00012
00013 <span class="comment">/* --------------------------------------------------------- */</span>
00014 <span class="comment">/* --------------------------------------------------------- */</span>
00015 <span class="comment">/* --- File: cmaes.c -------- Author: Nikolaus Hansen --- */</span>
00016 <span class="comment">/* --------------------------------------------------------- */</span>
00017 <span class="comment">/*</span>
00018 <span class="comment"> * CMA-ES for non-linear function minimization.</span>
00019 <span class="comment"> *</span>
00020 <span class="comment"> * Copyright (C) 1996, 2003 Nikolaus Hansen.</span>
00021 <span class="comment"> * e-mail: hansen@bionik.tu-berlin.de</span>
00022 <span class="comment"> *</span>
00023 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
00024 <span class="comment"> * modify it under the terms of the GNU Lesser General Public</span>
00025 <span class="comment"> * License as published by the Free Software Foundation; either</span>
00026 <span class="comment"> * version 2.1 of the License, or (at your option) any later</span>
00027 <span class="comment"> * version (see http://www.gnu.org/copyleft/lesser.html).</span>
00028 <span class="comment"> *</span>
00029 <span class="comment"> * This library is distributed in the hope that it will be useful,</span>
00030 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00031 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
00032 <span class="comment"> * Lesser General Public License for more details.</span>
00033 <span class="comment"> * </span>
00034 <span class="comment"> * */</span>
00035 <span class="comment">/* --- Changes : ---</span>
00036 <span class="comment"> * 03/03/21: argument const double *rgFunVal of</span>
00037 <span class="comment"> * cmaes_ReestimateDistribution() was treated incorrectly.</span>
00038 <span class="comment"> * 03/03/29: restart via cmaes_resume_distribution() implemented.</span>
00039 <span class="comment"> * 03/03/30: Always max std dev / largest axis is printed first.</span>
00040 <span class="comment"> * 03/08/30: Damping is adjusted for large mueff.</span>
00041 <span class="comment"> * 03/10/30: Damping is adjusted for large mueff always.</span>
00042 <span class="comment"> * 04/04/22: Cumulation time and damping for step size adjusted.</span>
00043 <span class="comment"> * No iniphase but conditional update of pc.</span>
00044 <span class="comment"> * Version 2.23.</span>
00045 <span class="comment"> * */</span>
00046
00047 <span class="preprocessor">#include &lt;es/CMAParams.h&gt;</span>
00048 <span class="preprocessor">#include &lt;utils/eoParser.h&gt;</span>
00049
00050 <span class="preprocessor">#include &lt;string&gt;</span>
00051
00052 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
00053
00054 <span class="keyword">namespace </span>eo {
00055
00056 CMAParams::CMAParams(eoParser&amp; parser, <span class="keywordtype">unsigned</span> dimensionality) {
00057
00058 string section = <span class="stringliteral">"CMA parameters"</span>;
00059
00060 n = parser.createParam(dimensionality, <span class="stringliteral">"dimensionality"</span>, <span class="stringliteral">"Dimensionality (N) of the problem"</span>, <span class="charliteral">'N'</span>, section, dimensionality == 0).value();
00061
00062 maxgen = parser.createParam(
00063 1000,
00064 <span class="stringliteral">"max-gen"</span>,
00065 <span class="stringliteral">"Maximum number of generations that the system will run (needed for damping)"</span>,
00066 <span class="charliteral">'M'</span>,
00067 section).value();
00068
00069
00070 <span class="keywordflow">if</span> (n == 0) {
00071 <span class="keywordflow">return</span>;
00072 }
00073
00074 defaults(n, maxgen);
00075
00076 <span class="comment">/* handle lambda */</span>
00077 lambda = parser.createParam(
00078 lambda,
00079 <span class="stringliteral">"lambda"</span>,
00080 <span class="stringliteral">"Number of offspring"</span>,
00081 <span class="charliteral">'l'</span>,
00082 section).value();
00083
00084 <span class="keywordflow">if</span> (lambda &lt; 2) {
00085 lambda = 4+(int)(3*log((<span class="keywordtype">double</span>) n));
00086 cerr &lt;&lt; <span class="stringliteral">"Too small lambda specified, setting it to "</span> &lt;&lt; lambda &lt;&lt; endl;
00087 }
00088
00089 <span class="comment">/* handle mu */</span>
00090 mu = parser.createParam(
00091 mu,
00092 <span class="stringliteral">"mu"</span>,
00093 <span class="stringliteral">"Population size"</span>,
00094 <span class="charliteral">'m'</span>,
00095 section).value();
00096
00097 <span class="keywordflow">if</span> (mu &gt;= lambda) {
00098 mu = lambda/2;
00099 cerr &lt;&lt; <span class="stringliteral">"Mu set larger/equal to lambda, setting it to "</span> &lt;&lt; mu &lt;&lt; endl;
00100 }
00101
00102 <span class="comment">/* handle selection weights */</span>
00103
00104 <span class="keywordtype">int</span> weight_type = parser.createParam(
00105 0,
00106 <span class="stringliteral">"weighting"</span>,
00107 <span class="stringliteral">"Weighting scheme (for 'selection'): 0 = logarithmic, 1 = equal, 2 = linear"</span>,
00108 <span class="charliteral">'w'</span>,
00109 section).value();
00110
00111 <span class="keywordflow">switch</span> (weight_type) {
00112 <span class="keywordflow">case</span> 1:
00113 {
00114 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; weights.size(); ++i) {
00115 weights[i] = mu - i;
00116 }
00117 }
00118 <span class="keywordflow">case</span> 2:
00119 {
00120 weights = 1.;
00121 }
00122 <span class="keywordflow">default</span> :
00123 {
00124 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; weights.size(); ++i) {
00125 weights[i] = log(mu+1.)-log(i+1.);
00126 }
00127 }
00128
00129 }
00130
00131 <span class="comment">/* Normalize weights and set mu_eff */</span>
00132 <span class="keywordtype">double</span> sumw = weights.sum();
00133 mueff = sumw * sumw / (weights * weights).sum();
00134 weights /= sumw;
00135
00136
00137 <span class="comment">/* most of the rest depends on mu_eff, so needs to be set again */</span>
00138
00139 <span class="comment">/* set the others using Nikolaus logic. If you want to tweak, you can parameterize over these defaults */</span>
00140 mucov = mueff;
00141 ccumsig = (mueff + 2.) / (n + mueff + 3.);
00142 ccumcov = 4. / (n + 4);
00143
00144 <span class="keywordtype">double</span> t1 = 2. / ((n+1.4142)*(n+1.4142));
00145 <span class="keywordtype">double</span> t2 = (2.*mucov-1.) / ((n+2.)*(n+2.)+mucov);
00146 t2 = (t2 &gt; 1) ? 1 : t2;
00147 t2 = (1./mucov) * t1 + (1.-1./mucov) * t2;
00148
00149 ccov = t2;
00150
00151 damp = 1 + std::max(0.3,(1.-(<span class="keywordtype">double</span>)n/(<span class="keywordtype">double</span>)maxgen))
00152 * (1+2*std::max(0.,sqrt((mueff-1.)/(n+1.))-1)) <span class="comment">/* limit sigma increase */</span>
00153 / ccumsig;
00154
00155 vector&lt;double&gt; mins(1,0.0);
00156 mins = parser.createParam(
00157 mins,
00158 <span class="stringliteral">"min-stdev"</span>,
00159 <span class="stringliteral">"Array of minimum stdevs, last one will apply for all remaining axes"</span>,
00160 0,
00161 section).value();
00162
00163 <span class="keywordflow">if</span> (mins.size() &gt; n) mins.resize(n);
00164
00165 <span class="keywordflow">if</span> (mins.size()) {
00166 minStdevs = mins.back();
00167 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; mins.size(); ++i) {
00168 minStdevs[i] = mins[i];
00169 }
00170 }
00171
00172 vector&lt;double&gt; inits(1,0.3);
00173 inits = parser.createParam(
00174 inits,
00175 <span class="stringliteral">"init-stdev"</span>,
00176 <span class="stringliteral">"Array of initial stdevs, last one will apply for all remaining axes"</span>,
00177 0,
00178 section).value();
00179
00180 <span class="keywordflow">if</span> (inits.size() &gt; n) inits.resize(n);
00181
00182 <span class="keywordflow">if</span> (inits.size()) {
00183 initialStdevs = inits.back();
00184 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; inits.size(); ++i) {
00185 initialStdevs[i] = inits[i];
00186 }
00187 }
00188
00189 }
00190
00191 <span class="keywordtype">void</span> CMAParams::defaults(<span class="keywordtype">unsigned</span> n_, <span class="keywordtype">unsigned</span> maxgen_) {
00192 n = n_;
00193 maxgen = maxgen_;
00194
00195 lambda = 4+(int)(3*log((<span class="keywordtype">double</span>) n));
00196 mu = lambda / 2;
00197
00198 weights.resize(mu);
00199
00200 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; weights.size(); ++i) {
00201 weights[i] = log(mu+1.)-log(i+1.);
00202 }
00203
00204 <span class="comment">/* Normalize weights and set mu_eff */</span>
00205 <span class="keywordtype">double</span> sumw = weights.sum();
00206 mueff = sumw * sumw / (weights * weights).sum();
00207 weights /= sumw;
00208
00209 mucov = mueff;
00210 ccumsig *= (mueff + 2.) / (n + mueff + 3.);
00211 ccumcov = 4. / (n + 4);
00212
00213 <span class="keywordtype">double</span> t1 = 2. / ((n+1.4142)*(n+1.4142));
00214 <span class="keywordtype">double</span> t2 = (2.*mucov-1.) / ((n+2.)*(n+2.)+mucov);
00215 t2 = (t2 &gt; 1) ? 1 : t2;
00216 t2 = (1./mucov) * t1 + (1.-1./mucov) * t2;
00217
00218 ccov = t2;
00219
00220 damp = 1 + std::max(0.3,(1.-(<span class="keywordtype">double</span>)n/maxgen))
00221 * (1+2*std::max(0.,sqrt((mueff-1.)/(n+1.))-1)) <span class="comment">/* limit sigma increase */</span>
00222 / ccumsig;
00223
00224 minStdevs.resize(n);
00225 minStdevs = 0.0;
00226
00227 initialStdevs.resize(n);
00228 initialStdevs = 0.3;
00229
00230
00231 }
00232
00233
00234 }<span class="comment">// namespace eo</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>

View file

@ -0,0 +1,67 @@
<!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: CMAParams.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_000010.html">es</a></div>
<h1>CMAParams.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * C++ification of Nikolaus Hansen's original C-source code for the</span>
00003 <span class="comment"> * CMA-ES. </span>
00004 <span class="comment"> *</span>
00005 <span class="comment"> * Copyright (C) 1996, 2003, Nikolaus Hansen</span>
00006 <span class="comment"> * (C) 2005, Maarten Keijzer</span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * License: LGPL </span>
00009 <span class="comment"> * </span>
00010 <span class="comment"> */</span>
00011
00012 <span class="preprocessor">#ifndef CMAPARAMS_H__</span>
00013 <span class="preprocessor"></span><span class="preprocessor">#define CMAPARAMS_H__</span>
00014 <span class="preprocessor"></span>
00015 <span class="preprocessor">#include &lt;valarray&gt;</span>
00016
00017 <span class="keyword">class </span><a class="code" href="classeo_parser.html">eoParser</a>;
00018 <span class="keyword">namespace </span>eo {
00019
00020 <span class="keyword">class </span>CMAParams {
00021
00022 <span class="keyword">public</span>:
00023
00024 CMAParams() { <span class="comment">/* Call this and all values need to be set by hand */</span> }
00025 CMAParams(<a class="code" href="classeo_parser.html">eoParser</a>&amp; parser, <span class="keywordtype">unsigned</span> dimensionality = 0); <span class="comment">// 0 dimensionality -&gt; user needs to set it</span>
00026
00027 <span class="keywordtype">void</span> defaults(<span class="keywordtype">unsigned</span> n_, <span class="keywordtype">unsigned</span> maxgen_); <span class="comment">/* apply all defaults using n and maxgen */</span>
00028
00029 <span class="keywordtype">unsigned</span> n;
00030 <span class="keywordtype">unsigned</span> maxgen;
00031
00032 <span class="keywordtype">unsigned</span> lambda; <span class="comment">/* -&gt; mu */</span>
00033 <span class="keywordtype">unsigned</span> mu; <span class="comment">/* -&gt; weights, lambda */</span>
00034
00035 std::valarray&lt;double&gt; weights; <span class="comment">/* &lt;- mu, -&gt; mueff -&gt; mucov -&gt; ccov */</span>
00036 <span class="keywordtype">double</span> mueff; <span class="comment">/* &lt;- weights */</span>
00037
00038 <span class="keywordtype">double</span> mucov;
00039
00040 <span class="keywordtype">double</span> damp; <span class="comment">/* &lt;- ccumsig, maxeval, lambda */</span>
00041 <span class="keywordtype">double</span> ccumsig; <span class="comment">/* -&gt; damp, &lt;- N */</span>
00042 <span class="keywordtype">double</span> ccumcov;
00043 <span class="keywordtype">double</span> ccov; <span class="comment">/* &lt;- mucov, N */</span>
00044
00045 std::valarray&lt;double&gt; minStdevs; <span class="comment">/* Minimum standard deviations per coordinate (default = 0.0) */</span>
00046 std::valarray&lt;double&gt; initialStdevs; <span class="comment">/* Initial standard deviations per coordinate (default = 0.3) */</span>
00047 };
00048
00049 } <span class="comment">// namespace eo</span>
00050
00051 <span class="preprocessor">#endif</span>
00052 <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>

View file

@ -0,0 +1,380 @@
<!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: CMAState.cpp 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_000010.html">es</a></div>
<h1>CMAState.cpp</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * C++ification of Nikolaus Hansen's original C-source code for the</span>
00003 <span class="comment"> * CMA-ES</span>
00004 <span class="comment"> *</span>
00005 <span class="comment"> * C++-ificiation performed by Maarten Keijzer (C) 2005. Licensed under</span>
00006 <span class="comment"> * the LGPL. Original copyright of Nikolaus Hansen can be found below</span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> *</span>
00009 <span class="comment"> * Some changes have been made to the original flow and logic of the</span>
00010 <span class="comment"> * algorithm:</span>
00011 <span class="comment"> *</span>
00012 <span class="comment"> * - Numerical issues are now treated 'before' going into the eigenvector decomposition</span>
00013 <span class="comment"> * (this was done out of convenience)</span>
00014 <span class="comment"> * - dMaxSignifiKond (smallest x such that x == x + 1.0) replaced by</span>
00015 <span class="comment"> * numeric_limits&lt;double&gt;::epsilon() (smallest x such that 1.0 != 1.0 + x)</span>
00016 <span class="comment"> * </span>
00017 <span class="comment"> * </span>
00018 <span class="comment"> */</span>
00019
00020 <span class="comment">/* --------------------------------------------------------- */</span>
00021 <span class="comment">/* --------------------------------------------------------- */</span>
00022 <span class="comment">/* --- File: cmaes.c -------- Author: Nikolaus Hansen --- */</span>
00023 <span class="comment">/* --------------------------------------------------------- */</span>
00024 <span class="comment">/*</span>
00025 <span class="comment"> * CMA-ES for non-linear function minimization.</span>
00026 <span class="comment"> *</span>
00027 <span class="comment"> * Copyright (C) 1996, 2003 Nikolaus Hansen.</span>
00028 <span class="comment"> * e-mail: hansen@bionik.tu-berlin.de</span>
00029 <span class="comment"> *</span>
00030 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
00031 <span class="comment"> * modify it under the terms of the GNU Lesser General Public</span>
00032 <span class="comment"> * License as published by the Free Software Foundation; either</span>
00033 <span class="comment"> * version 2.1 of the License, or (at your option) any later</span>
00034 <span class="comment"> * version (see http://www.gnu.org/copyleft/lesser.html).</span>
00035 <span class="comment"> *</span>
00036 <span class="comment"> * This library is distributed in the hope that it will be useful,</span>
00037 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00038 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
00039 <span class="comment"> * Lesser General Public License for more details.</span>
00040 <span class="comment"> * </span>
00041 <span class="comment"> * */</span>
00042 <span class="comment">/* --- Changes : ---</span>
00043 <span class="comment"> * 03/03/21: argument const double *rgFunVal of</span>
00044 <span class="comment"> * cmaes_ReestimateDistribution() was treated incorrectly.</span>
00045 <span class="comment"> * 03/03/29: restart via cmaes_resume_distribution() implemented.</span>
00046 <span class="comment"> * 03/03/30: Always max std dev / largest axis is printed first.</span>
00047 <span class="comment"> * 03/08/30: Damping is adjusted for large mueff.</span>
00048 <span class="comment"> * 03/10/30: Damping is adjusted for large mueff always.</span>
00049 <span class="comment"> * 04/04/22: Cumulation time and damping for step size adjusted.</span>
00050 <span class="comment"> * No iniphase but conditional update of pc.</span>
00051 <span class="comment"> * Version 2.23.</span>
00052 <span class="comment"> * */</span>
00053
00054 <span class="preprocessor">#include &lt;valarray&gt;</span>
00055 <span class="preprocessor">#include &lt;limits&gt;</span>
00056 <span class="preprocessor">#include &lt;iostream&gt;</span>
00057 <span class="preprocessor">#include &lt;cassert&gt;</span>
00058
00059 <span class="preprocessor">#include &lt;utils/eoRNG.h&gt;</span>
00060
00061 <span class="preprocessor">#include &lt;es/CMAState.h&gt;</span>
00062 <span class="preprocessor">#include &lt;es/CMAParams.h&gt;</span>
00063 <span class="preprocessor">#include &lt;es/matrices.h&gt;</span>
00064 <span class="preprocessor">#include &lt;es/eig.h&gt;</span>
00065
00066 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
00067
00068 <span class="keyword">namespace </span>eo {
00069
00070 <span class="keyword">struct </span>CMAStateImpl {
00071
00072 CMAParams p;
00073
00074 lower_triangular_matrix C; <span class="comment">// Covariance matrix</span>
00075 square_matrix B; <span class="comment">// Eigen vectors (in columns)</span>
00076 valarray&lt;double&gt; d; <span class="comment">// eigen values (diagonal matrix)</span>
00077 valarray&lt;double&gt; pc; <span class="comment">// Evolution path</span>
00078 valarray&lt;double&gt; ps; <span class="comment">// Evolution path for stepsize;</span>
00079
00080 vector&lt;double&gt; mean; <span class="comment">// current mean to sample around</span>
00081 <span class="keywordtype">double</span> sigma; <span class="comment">// global step size</span>
00082
00083 <span class="keywordtype">unsigned</span> gen;
00084 vector&lt;double&gt; fitnessHistory;
00085
00086
00087 CMAStateImpl(<span class="keyword">const</span> CMAParams&amp; params_, <span class="keyword">const</span> vector&lt;double&gt;&amp; m, <span class="keywordtype">double</span> sigma_) :
00088 p(params_),
00089 C(p.n), B(p.n), d(p.n), pc(p.n), ps(p.n), mean(m), sigma(sigma_),
00090 gen(0), fitnessHistory(3)
00091 {
00092 <span class="keywordtype">double</span> trace = (p.initialStdevs * p.initialStdevs).sum();
00093 <span class="comment">/* Initialize covariance structure */</span>
00094 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; p.n; ++i)
00095 {
00096 B[i][i] = 1.;
00097 d[i] = p.initialStdevs[i] * sqrt(p.n / trace);
00098 C[i][i] = d[i] * d[i];
00099 pc[i] = 0.;
00100 ps[i] = 0.;
00101 }
00102
00103 }
00104
00105 <span class="keywordtype">void</span> sample(vector&lt;double&gt;&amp; v) {
00106 <span class="keywordtype">unsigned</span> n = p.n;
00107 v.resize(n);
00108
00109 vector&lt;double&gt; tmp(n);
00110 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; ++i)
00111 tmp[i] = d[i] * rng.<a class="code" href="classeo_rng.html#a7">normal</a>();
00112
00113 <span class="comment">/* add mutation (sigma * B * (D*z)) */</span>
00114 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; ++i) {
00115 <span class="keywordtype">double</span> sum = 0;
00116 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; n; ++j) {
00117 sum += B[i][j] * tmp[j];
00118 }
00119 v[i] = mean[i] + sigma * sum;
00120 }
00121 }
00122
00123 <span class="keywordtype">void</span> reestimate(<span class="keyword">const</span> vector&lt;<span class="keyword">const</span> vector&lt;double&gt;* &gt;&amp; pop, <span class="keywordtype">double</span> muBest, <span class="keywordtype">double</span> muWorst) {
00124
00125 assert(pop.size() == p.mu);
00126
00127 <span class="keywordtype">unsigned</span> n = p.n;
00128
00129 fitnessHistory[gen % fitnessHistory.size()] = muBest; <span class="comment">// needed for divergence check</span>
00130
00131 vector&lt;double&gt; oldmean = mean;
00132 valarray&lt;double&gt; BDz(n);
00133
00134 <span class="comment">/* calculate xmean and rgBDz~N(0,C) */</span>
00135 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; ++i) {
00136 mean[i] = 0.;
00137 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; pop.size(); ++j) {
00138 mean[i] += p.weights[j] * (*pop[j])[i];
00139 }
00140 BDz[i] = sqrt(p.mueff)*(mean[i] - oldmean[i])/sigma;
00141 }
00142
00143 vector&lt;double&gt; tmp(n);
00144 <span class="comment">/* calculate z := D^(-1) * B^(-1) * rgBDz into rgdTmp */</span>
00145 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; ++i) {
00146 <span class="keywordtype">double</span> sum = 0.0;
00147 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; n; ++j) {
00148 sum += B[j][i] * BDz[j];
00149 }
00150 tmp[i] = sum / d[i];
00151 }
00152
00153 <span class="comment">/* cumulation for sigma (ps) using B*z */</span>
00154 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; ++i) {
00155 <span class="keywordtype">double</span> sum = 0.0;
00156 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; n; ++j)
00157 sum += B[i][j] * tmp[j];
00158
00159 ps[i] = (1. - p.ccumsig) * ps[i] + sqrt(p.ccumsig * (2. - p.ccumsig)) * sum;
00160 }
00161
00162 <span class="comment">/* calculate norm(ps)^2 */</span>
00163 <span class="keywordtype">double</span> psxps = (ps * ps).sum();
00164
00165
00166 <span class="keywordtype">double</span> chiN = sqrt((<span class="keywordtype">double</span>) p.n) * (1. - 1./(4.*p.n) + 1./(21.*p.n*p.n));
00167 <span class="comment">/* cumulation for covariance matrix (pc) using B*D*z~N(0,C) */</span>
00168 <span class="keywordtype">double</span> hsig = sqrt(psxps) / sqrt(1. - pow(1.-p.ccumsig, 2.*gen)) / chiN &lt; 1.5 + 1./(p.n-0.5);
00169
00170 pc = (1. - p.ccumcov) * pc + hsig * sqrt(p.ccumcov * (2. - p.ccumcov)) * BDz;
00171
00172 <span class="comment">/* stop initial phase (MK, this was not reachable in the org code, deleted) */</span>
00173
00174 <span class="comment">/* remove momentum in ps, if ps is large and fitness is getting worse */</span>
00175
00176 <span class="keywordflow">if</span> (gen &gt;= fitnessHistory.size()) {
00177
00178 <span class="comment">// find direction from muBest and muWorst (muBest == muWorst handled seperately</span>
00179 <span class="keywordtype">double</span> direction = muBest &lt; muWorst? -1.0 : 1.0;
00180
00181 <span class="keywordtype">unsigned</span> now = gen % fitnessHistory.size();
00182 <span class="keywordtype">unsigned</span> prev = (gen-1) % fitnessHistory.size();
00183 <span class="keywordtype">unsigned</span> prevprev = (gen-2) % fitnessHistory.size();
00184
00185 <span class="keywordtype">bool</span> fitnessWorsens = (muBest == muWorst) || <span class="comment">// &lt;- increase norm also when population has converged (this deviates from Hansen's scheme)</span>
00186 ( (direction * fitnessHistory[now] &lt; direction * fitnessHistory[prev])
00187 &amp;&amp;
00188 (direction * fitnessHistory[now] &lt; direction * fitnessHistory[prevprev]));
00189
00190 <span class="keywordflow">if</span>(psxps/p.n &gt; 1.5 + 10.*sqrt(2./p.n) &amp;&amp; fitnessWorsens) {
00191 <span class="keywordtype">double</span> tfac = sqrt((1 + std::max(0., log(psxps/p.n))) * p.n / psxps);
00192 ps *= tfac;
00193 psxps *= tfac*tfac;
00194 }
00195 }
00196
00197 <span class="comment">/* update of C */</span>
00198 <span class="comment">/* Adapt_C(t); not used anymore */</span>
00199 <span class="keywordflow">if</span> (p.ccov != 0.) {
00200 <span class="comment">//flgEigensysIsUptodate = 0;</span>
00201
00202 <span class="comment">/* update covariance matrix */</span>
00203 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; ++i) {
00204 vector&lt;double&gt;::iterator c_row = C[i];
00205 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt;= i; ++j) {
00206 c_row[j] =
00207 (1 - p.ccov) * c_row[j]
00208 +
00209 p.ccov * (1./p.mucov) * pc[i] * pc[j]
00210 +
00211 (1-hsig) * p.ccumcov * (2. - p.ccumcov) * c_row[j];
00212
00213 <span class="comment">/*C[i][j] = (1 - p.ccov) * C[i][j] </span>
00214 <span class="comment"> + sp.ccov * (1./sp.mucov) </span>
00215 <span class="comment"> * (rgpc[i] * rgpc[j] </span>
00216 <span class="comment"> + (1-hsig)*sp.ccumcov*(2.-sp.ccumcov) * C[i][j]); */</span>
00217 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> k = 0; k &lt; p.mu; ++k) { <span class="comment">/* additional rank mu update */</span>
00218 c_row[j] += p.ccov * (1-1./p.mucov) * p.weights[k]
00219 * ( (*pop[k])[i] - oldmean[i])
00220 * ( (*pop[k])[j] - oldmean[j])
00221 / sigma / sigma;
00222
00223 <span class="comment">// * (rgrgx[index[k]][i] - rgxold[i]) </span>
00224 <span class="comment">// * (rgrgx[index[k]][j] - rgxold[j])</span>
00225 <span class="comment">// / sigma / sigma; </span>
00226 }
00227 }
00228 }
00229 }
00230
00231 <span class="comment">/* update of sigma */</span>
00232 sigma *= exp(((sqrt(psxps)/chiN)-1.)/p.damp);
00233 <span class="comment">/* calculate eigensystem, must be done by caller */</span>
00234 <span class="comment">//cmaes_UpdateEigensystem(0);</span>
00235
00236
00237 <span class="comment">/* treat minimal standard deviations and numeric problems </span>
00238 <span class="comment"> * Note that in contrast with the original code, some numerical issues are treated *before* we </span>
00239 <span class="comment"> * go into the eigenvalue calculation */</span>
00240
00241 treatNumericalIssues(muBest, muWorst);
00242
00243 gen++; <span class="comment">// increase generation</span>
00244 }
00245
00246 <span class="keywordtype">void</span> treatNumericalIssues(<span class="keywordtype">double</span> best, <span class="keywordtype">double</span> worst) {
00247
00248 <span class="comment">/* treat stdevs */</span>
00249 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; p.n; ++i) {
00250 <span class="keywordflow">if</span> (sigma * sqrt(C[i][i]) &lt; p.minStdevs[i]) {
00251 <span class="comment">// increase stdev</span>
00252 sigma *= exp(0.05+1./p.damp);
00253 <span class="keywordflow">break</span>;
00254 }
00255 }
00256
00257 <span class="comment">/* treat convergence */</span>
00258 <span class="keywordflow">if</span> (best == worst) {
00259 sigma *= exp(0.2 + 1./p.damp);
00260 }
00261
00262 <span class="comment">/* Jede Hauptachse i testen, ob x == x + 0.1 * sigma * rgD[i] * B[i] */</span>
00263 <span class="comment">/* Test if all the means are not numerically out of whack with our coordinate system*/</span>
00264 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> axis = 0; axis &lt; p.n; ++axis) {
00265 <span class="keywordtype">double</span> fac = 0.1 * sigma * d[axis];
00266 <span class="keywordtype">unsigned</span> coord;
00267 <span class="keywordflow">for</span> (coord = 0; coord &lt; p.n; ++coord) {
00268 <span class="keywordflow">if</span> (mean[coord] != mean[coord] + fac * B[coord][axis]) {
00269 <span class="keywordflow">break</span>;
00270 }
00271 }
00272
00273 <span class="keywordflow">if</span> (coord == p.n) { <span class="comment">// means are way too big (little) for numerical accuraccy. Start rocking the craddle a bit more</span>
00274 sigma *= exp(0.2+1./p.damp);
00275 }
00276
00277 }
00278
00279 <span class="comment">/* Testen ob eine Komponente des Objektparameters festhaengt */</span>
00280 <span class="comment">/* Correct issues with scale between objective values and covariances */</span>
00281 <span class="keywordtype">bool</span> theresAnIssue = <span class="keyword">false</span>;
00282
00283 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; p.n; ++i) {
00284 <span class="keywordflow">if</span> (mean[i] == mean[i] + 0.2 * sigma * sqrt(C[i][i])) {
00285 C[i][i] *= (1. + p.ccov);
00286 theresAnIssue = <span class="keyword">true</span>;
00287 }
00288 }
00289
00290 <span class="keywordflow">if</span> (theresAnIssue) {
00291 sigma *= exp(0.05 + 1./p.damp);
00292 }
00293 }
00294
00295
00296 <span class="keywordtype">bool</span> updateEigenSystem(<span class="keywordtype">unsigned</span> max_tries, <span class="keywordtype">unsigned</span> max_iters) {
00297
00298 <span class="keywordflow">if</span> (max_iters==0) max_iters = 30 * p.n;
00299
00300 <span class="keyword">static</span> <span class="keywordtype">double</span> lastGoodMinimumEigenValue = 1.0;
00301
00302 <span class="comment">/* Try to get a valid calculation */</span>
00303 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> tries = 0; tries &lt; max_tries; ++tries) {
00304
00305 <span class="keywordtype">unsigned</span> iters = eig( p.n, C, d, B, max_iters);
00306 <span class="keywordflow">if</span> (iters &lt; max_iters)
00307 { <span class="comment">// all is well</span>
00308
00309 <span class="comment">/* find largest/smallest eigenvalues */</span>
00310 <span class="keywordtype">double</span> minEV = d.min();
00311 <span class="keywordtype">double</span> maxEV = d.max();
00312
00313 <span class="comment">/* (MK Original comment was) :Limit Condition of C to dMaxSignifKond+1 </span>
00314 <span class="comment"> * replaced dMaxSignifKond with 1./numeric_limits&lt;double&gt;::epsilon()</span>
00315 <span class="comment"> * */</span>
00316 <span class="keywordflow">if</span> (maxEV * numeric_limits&lt;double&gt;::epsilon() &gt; minEV) {
00317 <span class="keywordtype">double</span> tmp = maxEV * numeric_limits&lt;double&gt;::epsilon() - minEV;
00318 minEV += tmp;
00319 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=0;i&lt;p.n;++i) {
00320 C[i][i] += tmp;
00321 d[i] += tmp;
00322 }
00323 } <span class="comment">/* if */</span>
00324 lastGoodMinimumEigenValue = minEV;
00325
00326 d = sqrt(d);
00327
00328 <span class="comment">//flgEigensysIsUptodate = 1;</span>
00329 <span class="comment">//genOfEigensysUpdate = gen; </span>
00330 <span class="comment">//clockeigensum += clock() - clockeigenbegin;</span>
00331 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00332 } <span class="comment">/* if cIterEig &lt; ... */</span>
00333
00334 <span class="comment">// numerical problems, ignore them and try again</span>
00335
00336 <span class="comment">/* Addition des letzten minEW auf die Diagonale von C */</span>
00337 <span class="comment">/* Add the last known good eigen value to the diagonal of C */</span>
00338 <span class="keywordtype">double</span> summand = lastGoodMinimumEigenValue * exp((<span class="keywordtype">double</span>) tries);
00339 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; p.n; ++i)
00340 C[i][i] += summand;
00341
00342 } <span class="comment">/* for iEigenCalcVers */</span>
00343
00344 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00345
00346 }
00347
00348
00349 };
00350
00351 CMAState::CMAState(<span class="keyword">const</span> CMAParams&amp; params, <span class="keyword">const</span> std::vector&lt;double&gt;&amp; initial_point, <span class="keyword">const</span> <span class="keywordtype">double</span> initial_sigma)
00352 : pimpl(new CMAStateImpl(params, initial_point, initial_sigma)) {}
00353
00354 CMAState::~CMAState() { <span class="keyword">delete</span> pimpl; }
00355 CMAState::CMAState(<span class="keyword">const</span> CMAState&amp; that) : pimpl(new CMAStateImpl(*that.pimpl )) {}
00356 CMAState&amp; CMAState::operator=(<span class="keyword">const</span> CMAState&amp; that) { *pimpl = *that.pimpl; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
00357
00358 <span class="keywordtype">void</span> CMAState::sample(vector&lt;double&gt;&amp; v)<span class="keyword"> const </span>{ pimpl-&gt;sample(v); }
00359
00360 <span class="keywordtype">void</span> CMAState::reestimate(<span class="keyword">const</span> vector&lt;<span class="keyword">const</span> vector&lt;double&gt;* &gt;&amp; population, <span class="keywordtype">double</span> muBest, <span class="keywordtype">double</span> muWorst) { pimpl-&gt;reestimate(population, muBest, muWorst); }
00361 <span class="keywordtype">bool</span> CMAState::updateEigenSystem(<span class="keywordtype">unsigned</span> max_tries, <span class="keywordtype">unsigned</span> max_iters) { <span class="keywordflow">return</span> pimpl-&gt;updateEigenSystem(max_tries, max_iters); }
00362
00363
00364 } <span class="comment">// namespace eo</span>
00365
</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>

View file

@ -0,0 +1,59 @@
<!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: CMAState.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_000010.html">es</a></div>
<h1>CMAState.h</h1><div class="fragment"><pre class="fragment">00001
00002 <span class="comment">/*</span>
00003 <span class="comment"> * C++ification of Nikolaus Hansen's original C-source code for the</span>
00004 <span class="comment"> * CMA-ES. </span>
00005 <span class="comment"> *</span>
00006 <span class="comment"> * Copyright (C) 1996, 2003, Nikolaus Hansen</span>
00007 <span class="comment"> * (C) 2005, Maarten Keijzer</span>
00008 <span class="comment"> *</span>
00009 <span class="comment"> * License: LGPL (see source file)</span>
00010 <span class="comment"> * </span>
00011 <span class="comment"> */</span>
00012
00013 <span class="preprocessor">#ifndef CMASTATE_H_</span>
00014 <span class="preprocessor"></span><span class="preprocessor">#define CMASTATE_H_</span>
00015 <span class="preprocessor"></span>
00016 <span class="preprocessor">#include &lt;vector&gt;</span>
00017 <span class="preprocessor">#include &lt;valarray&gt;</span>
00018
00019 <span class="keyword">namespace </span>eo {
00020
00021
00022 <span class="keyword">class </span>CMAStateImpl;
00023 <span class="keyword">class </span>CMAParams;
00024 <span class="keyword">class </span>CMAState {
00025
00026 CMAStateImpl* pimpl; <span class="comment">/* pointer to implementation, hidden in source file */</span>
00027
00028 <span class="keyword">public</span>:
00029
00030 CMAState(<span class="keyword">const</span> CMAParams&amp;, <span class="keyword">const</span> std::vector&lt;double&gt;&amp; initial_point, <span class="keyword">const</span> <span class="keywordtype">double</span> initial_sigma = 1.0);
00031 ~CMAState();
00032 CMAState(<span class="keyword">const</span> CMAState&amp;);
00033 CMAState&amp; operator=(<span class="keyword">const</span> CMAState&amp;);
00034
00051 <span class="keywordtype">void</span> sample(std::vector&lt;double&gt;&amp; v) <span class="keyword">const</span>;
00052
00063 <span class="keywordtype">void</span> reestimate(<span class="keyword">const</span> std::vector&lt;<span class="keyword">const</span> std::vector&lt;double&gt;* &gt;&amp; sorted_population, <span class="keywordtype">double</span> muBest, <span class="keywordtype">double</span> muWorst);
00064
00074 <span class="keywordtype">bool</span> updateEigenSystem(<span class="keywordtype">unsigned</span> max_tries = 1, <span class="keywordtype">unsigned</span> max_iters = 0);
00075 };
00076
00077 } <span class="comment">// namespace eo</span>
00078
00079 <span class="preprocessor">#endif</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>

View file

@ -0,0 +1,148 @@
<!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: Dataset.cpp 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_000007.html">contrib</a>&nbsp;/&nbsp;<a class="el" href="dir_000008.html">mathsym</a>&nbsp;/&nbsp;<a class="el" href="dir_000012.html">regression</a></div>
<h1>Dataset.cpp</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* </span>
00002 <span class="comment"> * Copyright (C) 2005 Maarten Keijzer</span>
00003 <span class="comment"> *</span>
00004 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
00005 <span class="comment"> * it under the terms of version 2 of the GNU General Public License as </span>
00006 <span class="comment"> * published by the Free Software Foundation. </span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
00009 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00010 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
00011 <span class="comment"> * GNU General Public License for more details.</span>
00012 <span class="comment"> *</span>
00013 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
00014 <span class="comment"> * along with this program; if not, write to the Free Software</span>
00015 <span class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
00016 <span class="comment"> */</span>
00017
00018 <span class="preprocessor">#include "Dataset.h"</span>
00019 <span class="preprocessor">#include &lt;fstream&gt;</span>
00020 <span class="preprocessor">#include &lt;sstream&gt;</span>
00021
00022 <span class="preprocessor">#include &lt;iostream&gt;</span>
00023
00024 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
00025
00026 <span class="keyword">class </span>DataSetImpl {
00027 <span class="keyword">public</span>:
00028 vector&lt; vector&lt;double&gt; &gt; inputs;
00029 vector&lt;double&gt; targets;
00030
00031 <span class="keywordtype">void</span> read_data(vector&lt;string&gt; strings) {
00032 <span class="comment">// find the number of inputs</span>
00033
00034 istringstream cnt(strings[0]);
00035 <span class="keywordtype">unsigned</span> n = 0;
00036 <span class="keywordflow">for</span> (;;) {
00037 string s;
00038 cnt &gt;&gt; s;
00039 <span class="keywordflow">if</span> (!cnt) <span class="keywordflow">break</span>;
00040 ++n;
00041 }
00042
00043 inputs.resize(strings.size(), vector&lt;double&gt;(n-1));
00044 targets.resize(strings.size());
00045
00046 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; strings.size(); ++i) {
00047 istringstream is(strings[i]);
00048 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; n; ++j) {
00049
00050 <span class="keywordflow">if</span> (!is) {
00051 cerr &lt;&lt; <span class="stringliteral">"Too few targets in record "</span> &lt;&lt; i &lt;&lt; endl;
00052 exit(1);
00053 }
00054
00055 <span class="keywordflow">if</span> (j &lt; n-1) {
00056 is &gt;&gt; inputs[i][j];
00057 } <span class="keywordflow">else</span> {
00058 is &gt;&gt; targets[i];
00059 }
00060
00061 }
00062 }
00063
00064 }
00065
00066 };
00067
00068 Dataset::Dataset() { pimpl = <span class="keyword">new</span> DataSetImpl; }
00069 Dataset::~Dataset() { <span class="keyword">delete</span> pimpl; }
00070 Dataset::Dataset(<span class="keyword">const</span> Dataset&amp; that) { pimpl = <span class="keyword">new</span> DataSetImpl(*that.pimpl); }
00071 Dataset&amp; Dataset::operator=(<span class="keyword">const</span> Dataset&amp; that) { *pimpl = *that.pimpl; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
00072
00073 <span class="keywordtype">unsigned</span> Dataset::n_records()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pimpl-&gt;targets.size(); }
00074 <span class="keywordtype">unsigned</span> Dataset::n_fields()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pimpl-&gt;inputs[0].size(); }
00075 <span class="keyword">const</span> std::vector&lt;double&gt;&amp; Dataset::get_inputs(<span class="keywordtype">unsigned</span> record)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pimpl-&gt;inputs[record]; }
00076 <span class="keywordtype">double</span> Dataset::get_target(<span class="keywordtype">unsigned</span> record)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pimpl-&gt;targets[record]; }
00077
00078 <span class="keywordtype">double</span> error(string errstr);
00079
00080 <span class="keywordtype">void</span> Dataset::load_data(std::string filename) {
00081 vector&lt;string&gt; strings; <span class="comment">// first load it in strings</span>
00082
00083 ifstream is(filename.c_str());
00084
00085 <span class="keywordflow">for</span>(;;) {
00086 string s;
00087 getline(is, s);
00088 <span class="keywordflow">if</span> (!is) <span class="keywordflow">break</span>;
00089
00090 <span class="keywordflow">if</span> (s[0] == <span class="charliteral">'#'</span>) <span class="keywordflow">continue</span>; <span class="comment">// comment, skip</span>
00091
00092 strings.push_back(s);
00093 }
00094
00095 is.close();
00096
00097 <span class="keywordflow">if</span> (strings.size() == 0) {
00098 error(<span class="stringliteral">"No data could be loaded"</span>);
00099 }
00100
00101 pimpl-&gt;read_data(strings);
00102
00103 }
00104
00105 std::vector&lt;double&gt; Dataset::input_minima()<span class="keyword"> const </span>{
00106 vector&lt;vector&lt;double&gt; &gt;&amp; in = pimpl-&gt;inputs;
00107
00108 vector&lt;double&gt; mn(in[0].size(), 1e+50);
00109 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; in.size(); ++i) {
00110 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; in[i].size(); ++j) {
00111 mn[j] = std::min(mn[j], in[i][j]);
00112 }
00113 }
00114
00115 <span class="keywordflow">return</span> mn;
00116 }
00117
00118 vector&lt;double&gt; Dataset::input_maxima()<span class="keyword"> const </span>{
00119 vector&lt;vector&lt;double&gt; &gt;&amp; in = pimpl-&gt;inputs;
00120
00121 vector&lt;double&gt; mx(in[0].size(), -1e+50);
00122 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; in.size(); ++i) {
00123 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; in[i].size(); ++j) {
00124 mx[j] = std::max(mx[j], in[i][j]);
00125 }
00126 }
00127
00128 <span class="keywordflow">return</span> mx;
00129 }
00130
00131
00132
00133
</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>

View file

@ -0,0 +1,66 @@
<!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: Dataset.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_000007.html">contrib</a>&nbsp;/&nbsp;<a class="el" href="dir_000008.html">mathsym</a>&nbsp;/&nbsp;<a class="el" href="dir_000012.html">regression</a></div>
<h1>Dataset.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* </span>
00002 <span class="comment"> * Copyright (C) 2005 Maarten Keijzer</span>
00003 <span class="comment"> *</span>
00004 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
00005 <span class="comment"> * it under the terms of version 2 of the GNU General Public License as </span>
00006 <span class="comment"> * published by the Free Software Foundation. </span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
00009 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00010 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
00011 <span class="comment"> * GNU General Public License for more details.</span>
00012 <span class="comment"> *</span>
00013 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
00014 <span class="comment"> * along with this program; if not, write to the Free Software</span>
00015 <span class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
00016 <span class="comment"> */</span>
00017
00018 <span class="preprocessor">#ifndef DATASET_H_</span>
00019 <span class="preprocessor"></span><span class="preprocessor">#define DATASET_H_</span>
00020 <span class="preprocessor"></span>
00021 <span class="preprocessor">#include &lt;string&gt;</span>
00022 <span class="preprocessor">#include &lt;vector&gt;</span>
00023
00024 <span class="keyword">class </span>DataSetImpl;
00025
00026 <span class="keyword">class </span>Dataset {
00027
00028 DataSetImpl* pimpl;
00029
00030 Dataset&amp; operator=(<span class="keyword">const</span> Dataset&amp;); <span class="comment">// cannot assign</span>
00031 <span class="keyword">public</span>:
00032
00033 Dataset();
00034 ~Dataset();
00035 Dataset(<span class="keyword">const</span> Dataset&amp;);
00036
00037 <span class="keywordtype">void</span> load_data(std::string filename);
00038
00039 <span class="keywordtype">unsigned</span> n_records() <span class="keyword">const</span>;
00040 <span class="keywordtype">unsigned</span> n_fields() <span class="keyword">const</span>;
00041
00042 <span class="keyword">const</span> std::vector&lt;double&gt;&amp; get_inputs(<span class="keywordtype">unsigned</span> record) <span class="keyword">const</span>;
00043 <span class="keywordtype">double</span> get_target(<span class="keywordtype">unsigned</span> record) <span class="keyword">const</span>;
00044
00045 std::vector&lt;double&gt; input_minima() <span class="keyword">const</span>;
00046 std::vector&lt;double&gt; input_maxima() <span class="keyword">const</span>;
00047
00048 };
00049
00050 <span class="preprocessor">#endif</span>
00051 <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>

View file

@ -0,0 +1,125 @@
<!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: EO.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></div>
<h1>EO.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">// EO.h</span>
00005 <span class="comment">// (c) GeNeura Team 1998</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"> */</span>
00023 <span class="comment">//-----------------------------------------------------------------------------</span>
00024
00025 <span class="preprocessor">#ifndef EO_H</span>
00026 <span class="preprocessor"></span><span class="preprocessor">#define EO_H</span>
00027 <span class="preprocessor"></span>
00028 <span class="comment">//-----------------------------------------------------------------------------</span>
00029
00030 <span class="preprocessor">#include &lt;stdexcept&gt;</span> <span class="comment">// std::runtime_error</span>
00031 <span class="preprocessor">#include &lt;eoObject.h&gt;</span> <span class="comment">// eoObject</span>
00032 <span class="preprocessor">#include &lt;eoPersistent.h&gt;</span> <span class="comment">// eoPersistent</span>
00033
00034 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00044"></a><a class="code" href="class_e_o.html">00044</a> <span class="comment"></span><span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt; <span class="keyword">class </span><a class="code" href="class_e_o.html">EO</a>: <span class="keyword">public</span> <a class="code" href="classeo_object.html">eoObject</a>, <span class="keyword">public</span> <a class="code" href="classeo_persistent.html">eoPersistent</a>
00045 {
00046 <span class="keyword">public</span>:
00047 <span class="keyword">typedef</span> F Fitness;
00048
<a name="l00054"></a><a class="code" href="class_e_o.html#a0">00054</a> <a class="code" href="class_e_o.html#a0">EO</a>(): repFitness(Fitness()), invalidFitness(true) {}
00055
<a name="l00057"></a><a class="code" href="class_e_o.html#a1">00057</a> <span class="keyword">virtual</span> <a class="code" href="class_e_o.html#a1">~EO</a>() {};
00058
<a name="l00060"></a><a class="code" href="class_e_o.html#a2">00060</a> Fitness <a class="code" href="class_e_o.html#a2">fitness</a>()<span class="keyword"> const </span>{
00061 <span class="keywordflow">if</span> (<a class="code" href="class_e_o.html#a5">invalid</a>())
00062 <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"invalid fitness"</span>);
00063 <span class="keywordflow">return</span> repFitness;
00064 }
00065
00066 <span class="comment">// Set fitness as invalid.</span>
00067 <span class="keywordtype">void</span> invalidate() { invalidFitness = <span class="keyword">true</span>; }
00068
<a name="l00072"></a><a class="code" href="class_e_o.html#a4">00072</a> <span class="keywordtype">void</span> <a class="code" href="class_e_o.html#a2">fitness</a>(<span class="keyword">const</span> Fitness&amp; _fitness)
00073 {
00074 repFitness = _fitness;
00075 invalidFitness = <span class="keyword">false</span>;
00076 }
00077
<a name="l00081"></a><a class="code" href="class_e_o.html#a5">00081</a> <span class="keywordtype">bool</span> <a class="code" href="class_e_o.html#a5">invalid</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> invalidFitness; }
00082
<a name="l00086"></a><a class="code" href="class_e_o.html#a6">00086</a> <span class="keywordtype">bool</span> <a class="code" href="class_e_o.html#a6">operator&lt;</a>(<span class="keyword">const</span> <a class="code" href="class_e_o.html">EO</a>&amp; _eo2)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_e_o.html#a2">fitness</a>() &lt; _eo2.<a class="code" href="class_e_o.html#a2">fitness</a>(); }
00087 <span class="keywordtype">bool</span> operator&gt;(<span class="keyword">const</span> <a class="code" href="class_e_o.html">EO</a>&amp; _eo2)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !(<a class="code" href="class_e_o.html#a2">fitness</a>() &lt;= _eo2.<a class="code" href="class_e_o.html#a2">fitness</a>()); }
00088
00090
00091
<a name="l00095"></a><a class="code" href="class_e_o.html#z10_0">00095</a> <span class="keyword">virtual</span> std::string <a class="code" href="class_e_o.html#z10_0">className</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"EO"</span>; }
00096
<a name="l00105"></a><a class="code" href="class_e_o.html#z10_1">00105</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_e_o.html#z10_1">readFrom</a>(std::istream&amp; _is) {
00106
00107 <span class="comment">// the new version of the reafFrom function.</span>
00108 <span class="comment">// It can distinguish between valid and invalid fitness values. </span>
00109 std::string fitness_str;
00110 <span class="keywordtype">int</span> pos = _is.tellg();
00111 _is &gt;&gt; fitness_str;
00112
00113 <span class="keywordflow">if</span> (fitness_str == <span class="stringliteral">"INVALID"</span>)
00114 {
00115 invalidFitness = <span class="keyword">true</span>;
00116 }
00117 <span class="keywordflow">else</span>
00118 {
00119 invalidFitness = <span class="keyword">false</span>;
00120 _is.seekg(pos); <span class="comment">// rewind</span>
00121 _is &gt;&gt; repFitness;
00122 }
00123 }
00124
<a name="l00129"></a><a class="code" href="class_e_o.html#z10_2">00129</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_e_o.html#z10_2">printOn</a>(std::ostream&amp; _os)<span class="keyword"> const </span>{
00130
00131
00132 <span class="comment">// the latest version of the code. Very similar to the old code</span>
00133 <span class="keywordflow">if</span> (<a class="code" href="class_e_o.html#a5">invalid</a>()) {
00134 _os &lt;&lt; <span class="stringliteral">"INVALID "</span>;
00135 }
00136 <span class="keywordflow">else</span>
00137 {
00138 _os &lt;&lt; repFitness &lt;&lt; <span class="charliteral">' '</span>;
00139 }
00140
00141 }
00142
00144
00145 <span class="keyword">private</span>:
00146 Fitness repFitness; <span class="comment">// value of fitness for this chromosome</span>
00147 <span class="keywordtype">bool</span> invalidFitness; <span class="comment">// true if the value of fitness is invalid</span>
00148 };
00149
00150 <span class="comment">//-----------------------------------------------------------------------------</span>
00151
00152 <span class="preprocessor">#endif</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>

View file

@ -0,0 +1,139 @@
<!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: ESEA.cpp 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_000003.html">tutorial</a>&nbsp;/&nbsp;<a class="el" href="dir_000006.html">Lesson4</a></div>
<h1>ESEA.cpp</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">// Program to test several EO-ES features</span>
00002
00003 <span class="preprocessor">#ifdef _MSC_VER</span>
00004 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(disable:4786)</span>
00005 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00006 <span class="preprocessor"></span>
00007 <span class="preprocessor">#include &lt;algorithm&gt;</span>
00008 <span class="preprocessor">#include &lt;string&gt;</span>
00009 <span class="preprocessor">#include &lt;iostream&gt;</span>
00010 <span class="preprocessor">#include &lt;iterator&gt;</span>
00011 <span class="preprocessor">#include &lt;stdexcept&gt;</span>
00012 <span class="preprocessor">#include &lt;time.h&gt;</span>
00013
00014 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
00015
00016 <span class="preprocessor">#include &lt;eo&gt;</span>
00017
00018 <span class="comment">// representation specific</span>
00019 <span class="preprocessor">#include &lt;es/make_es.h&gt;</span>
00020
00021 <span class="preprocessor">#include "real_value.h"</span> <span class="comment">// the sphere fitness</span>
00022
00023 <span class="comment">// Now the main </span>
00025 <span class="comment"></span><span class="keyword">typedef</span> <a class="code" href="classeo_scalar_fitness.html">eoMinimizingFitness</a> FitT;
00026
00027 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EOT&gt;
00028 <span class="keywordtype">void</span> runAlgorithm(<a class="code" href="struct_dummy.html">EOT</a>, eoParser&amp; _parser, <a class="code" href="classeo_state.html">eoState</a>&amp; _state);
00029
00030 <span class="keywordtype">int</span> main_function(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])
00031 {
00032 <span class="comment">// Create the command-line parser</span>
00033 eoParser parser(argc, argv); <span class="comment">// for user-parameter reading</span>
00034
00035 <a class="code" href="classeo_state.html">eoState</a> state; <span class="comment">// keeps all things allocated</span>
00036
00037
00038 <a class="code" href="classeo_value_param.html">eoValueParam&lt;bool&gt;</a>&amp; simpleParam = parser.createParam(<span class="keyword">true</span>, <span class="stringliteral">"Isotropic"</span>, <span class="stringliteral">"Isotropic self-adaptive mutation"</span>, <span class="charliteral">'i'</span>, <span class="stringliteral">"ES mutation"</span>);
00039 <a class="code" href="classeo_value_param.html">eoValueParam&lt;bool&gt;</a>&amp; stdevsParam = parser.createParam(<span class="keyword">false</span>, <span class="stringliteral">"Stdev"</span>, <span class="stringliteral">"One self-adaptive stDev per variable"</span>, <span class="charliteral">'s'</span>, <span class="stringliteral">"ES mutation"</span>);
00040 <a class="code" href="classeo_value_param.html">eoValueParam&lt;bool&gt;</a>&amp; corrParam = parser.createParam(<span class="keyword">false</span>, <span class="stringliteral">"Correl"</span>, <span class="stringliteral">"Use correlated mutations"</span>, <span class="charliteral">'c'</span>, <span class="stringliteral">"ES mutation"</span>);
00041
00042 <span class="comment">// Run the appropriate algorithm</span>
00043 <span class="keywordflow">if</span> (simpleParam.<a class="code" href="classeo_value_param.html#a2">value</a>() == <span class="keyword">false</span>)
00044 {
00045 cout &lt;&lt; <span class="stringliteral">"Using eoReal"</span> &lt;&lt; endl;
00046 runAlgorithm(<a class="code" href="classeo_real.html">eoReal&lt;FitT&gt;</a>(), parser, state);
00047 }
00048 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (stdevsParam.<a class="code" href="classeo_value_param.html#a2">value</a>() == <span class="keyword">false</span>)
00049 {
00050 cout &lt;&lt; <span class="stringliteral">"Using eoEsSimple"</span> &lt;&lt; endl;
00051 runAlgorithm(<a class="code" href="classeo_es_simple.html">eoEsSimple&lt;FitT&gt;</a>(), parser, state);
00052 }
00053 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (corrParam.<a class="code" href="classeo_value_param.html#a2">value</a>() == <span class="keyword">false</span>)
00054 {
00055 cout &lt;&lt; <span class="stringliteral">"Using eoEsStdev"</span> &lt;&lt; endl;
00056 runAlgorithm(<a class="code" href="classeo_es_stdev.html">eoEsStdev&lt;FitT&gt;</a>(), parser, state);
00057 }
00058 <span class="keywordflow">else</span>
00059 {
00060 cout &lt;&lt; <span class="stringliteral">"Using eoEsFull"</span> &lt;&lt; endl;
00061 runAlgorithm(<a class="code" href="classeo_es_full.html">eoEsFull&lt;FitT&gt;</a>(), parser, state);
00062 }
00063
00064 <span class="keywordflow">return</span> 0;
00065 }
00066
00067 <span class="comment">// A main that catches the exceptions</span>
00068
00069 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
00070 {
00071 <span class="keywordflow">try</span>
00072 {
00073 main_function(argc, argv);
00074 }
00075 <span class="keywordflow">catch</span>(exception&amp; e)
00076 {
00077 cout &lt;&lt; <span class="stringliteral">"Exception: "</span> &lt;&lt; e.what() &lt;&lt; <span class="charliteral">'\n'</span>;
00078 }
00079
00080 <span class="keywordflow">return</span> 1;
00081 }
00082
00087 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EOT&gt;
00088 <span class="keywordtype">void</span> runAlgorithm(<a class="code" href="struct_dummy.html">EOT</a>, eoParser&amp; _parser, <a class="code" href="classeo_state.html">eoState</a>&amp; _state)
00089 {
00090 <span class="keyword">typedef</span> <span class="keyword">typename</span> EOT::Fitness FitT;
00091
00094
00095 <span class="comment">// The evaluation fn - encapsulated into an eval counter for output </span>
00096 <a class="code" href="structeo_eval_func_ptr.html">eoEvalFuncPtr&lt;EOT, double, const std::vector&lt;double&gt;</a>&amp;&gt;
00097 mainEval( real_value );
00098 <a class="code" href="classeo_eval_func_counter.html">eoEvalFuncCounter&lt;EOT&gt;</a> eval(mainEval);
00099
00100 <span class="comment">// the genotype - through a genotype initializer</span>
00101 <a class="code" href="classeo_real_init_bounded.html">eoRealInitBounded&lt;EOT&gt;</a>&amp; init = make_genotype(_parser, _state, <a class="code" href="struct_dummy.html">EOT</a>());
00102
00103 <span class="comment">// Build the variation operator (any seq/prop construct)</span>
00104 <a class="code" href="classeo_gen_op.html">eoGenOp&lt;EOT&gt;</a>&amp; op = make_op(_parser, _state, init);
00105
00108
00109 <span class="comment">// initialize the population - and evaluate</span>
00110 <span class="comment">// yes, this is representation indepedent once you have an eoInit</span>
00111 <a class="code" href="classeo_pop.html">eoPop&lt;EOT&gt;</a>&amp; pop = make_pop(_parser, _state, init);
00112 apply&lt;EOT&gt;(eval, pop);
00113
00114 <span class="comment">// stopping criteria</span>
00115 <a class="code" href="classeo_continue.html">eoContinue&lt;EOT&gt;</a> &amp; term = make_continue(_parser, _state, eval);
00116 <span class="comment">// output</span>
00117 <a class="code" href="classeo_check_point.html">eoCheckPoint&lt;EOT&gt;</a> &amp; checkpoint = make_checkpoint(_parser, _state, eval, term);
00118 <span class="comment">// algorithm (need the operator!)</span>
00119 <a class="code" href="classeo_algo.html">eoAlgo&lt;EOT&gt;</a>&amp; ga = make_algo_scalar(_parser, _state, eval, checkpoint, op);
00120
00123 <span class="comment">// to be called AFTER all parameters have been read!!!</span>
00124 make_help(_parser);
00125
00128 cout &lt;&lt; <span class="stringliteral">"Initial Population\n"</span>;
00129 pop.<a class="code" href="classeo_pop.html#a17">sortedPrintOn</a>(cout);
00130 cout &lt;&lt; endl;
00131
00132 run_ea(ga, pop); <span class="comment">// run the ga</span>
00133
00134 cout &lt;&lt; <span class="stringliteral">"Final Population\n"</span>;
00135 pop.<a class="code" href="classeo_pop.html#a17">sortedPrintOn</a>(cout);
00136 cout &lt;&lt; endl;
00137 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Oct 19 05:06:39 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>

Some files were not shown because too many files have changed in this diff Show more