srnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`sr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xpBsrjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xpBtresourcetUfile:/usr/local/forrest/main/webapp/skins/common/images/built-with-forrest-button.pngpxpsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`t image/pngpur[BTxpPNG  IHDRXT tEXtTitleBuilt with Apache Forrest!3 tEXtAuthorstevenn@apache.org˜](tEXtCopyrightThe Apache Software FoundationFtEXtCreation Time11/05/02}TtIME  F*+ pHYs B4gAMA aPLTE))5Oi1+ bEUTbqM&`k !.Ifeõ! 4ff3IhDA333 p}wI Sfx(?]XA\g]gq'SHG e%2RB;@ PXb 6\MYs?8d9:q+DZq LdFO6W`k-;Tְ?M2tq?̻#fW+Zӡs`2!B2B;A>&1Qa8,ZLT]GA-(bC8 kkt`hF2:0@Y$*LQtp%& 0 o&-:{}6l%L0/G)*J `je>#6)EcRWf, () l':Z/p//yTF75f=MVa.%XLPDuJ'79DKlIDATxڵ։[F4AmS⢫Ю8F} ^Je-[mE/D7W]p=yߗyonp}=TU.1 ,9ܐF-7d,>x MGBҍR>q{%r$"Pຟc`YsaabdI7byC`QH>cBw\6j/7'7ܾ[x >Ray,bb_9,$KRi4 G 0\LܨBΜ⡷n۽,RsWó{Gx2|Xq 0`D0U#6Q&gI=upE w|5L{F^XlIJ=nCa ׁq~x8>;f}KUCshS!7lwY\^ܚk?ι8_y<702Wֹ8?ksebZs}DKwY=6?mh^ IENDB`ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xp=sr java.io.File-E Lpathq~xptP/usr/local/forrest/main/webapp/skins/common/images/built-with-forrest-button.pngw/xsrnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`>P`P`sr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xp lsrjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xptfiletZfile:/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/neuralNetworks.xmltaG-file-file:/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/neuralNetworks.xmlsq~ `GtxslttNfile:/usr/local/forrest/main/webapp/resources/stylesheets/docv20-to-docv13.xsltUT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/docv20-to-docv13.xslxtPK_G-file-file:/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/neuralNetworks.xml_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/docv20-to-docv13.xslsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ppur[BTxp,CXML  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. document header title/Backpropagation neural networks in ruby :: ai4r  body idCDATAnn-Introductionsection 'Introduction to Neural Networks in Ruby p  The utility of artificial neural network models lies in the fact that they can be used to infer a function from observations. This is particularly useful in applications where the complexity of the data or task makes the design of such a function by hand impractical. Neural Networks are being used in many businesses and applications. Their ability to learn by example makes them attractive in environments where the business rules are either not well defined or are hard to enumerate and define. Many people believe that Neural Networks can only solve toy problems. Give them a try, and let you decide if they are good enough to solve your needs.     In this module you will find an implementation of neural networks using the Backpropagation is a supervised learning technique (described by Paul Werbos in 1974, and further developed by David E. Rumelhart, Geoffrey E. Hinton and Ronald J. Williams in 1986)    nn-HowTo 2How to use Backpropagation Neural Networks in Ruby $http://www.w3.org/XML/1998/namespacespace xml:spacepreservesource # Create the network net = Backpropagation.new([4, 3, 2]) # 4 inputs # 1 hidden layer with 3 neurons, # 4 outputs # Train the network 1..upto(100) do |i| net.train(example[i], result[i]) end # Use it: Evaluate data with the trained network net.eval([12, 48, 12, 25]) # => [34, 22]    nn-example 2Example using ai4r Backpropagation network in ruby  = Let's imagine that we have to implement a program to identify simple patterns (triangles, squares, crosses, etc). The main problem is that this program must be resistant to random noise in the image (pixels with wrong values) and line noise (similar to the unwanted direct current that we usually have in a signal).   g We can take an example of each pattern to be recognized, and train a neural network to identify them.    7 We create a network with the following architecture: 2;56 input neurons, 128 neurons in a hidden layer, 3 output neurons. We feed this network with 16x16 matrices (in fact will convert them to vectors of length 256). Each pixel is represented with a number from 0 (white pixel) to 10 (black pixel). The output of this network if a 3 vector of dimension 3, where ideally:  ul li(1, 0, 0) for triangles (0, 1, 0) for squares (0, 0, 1) for crosses   IWe train our backpropagation neural network using the following examples:  table captionTraining patterns tr colspan1rowspantdaltTriangule training examplesrc /images/t.pngimg Square training example /images/s.png Cross training example /images/c.png    $And we repeat the training 20 times.   L The results we got when we evaluate patterns with our trained network are:     TRIANGLE     [0.00, 0.96, 0.03] => SQUARE   !" [0.00, 0.00, 0.99] => CROSS  ##  EEvaluating the patterns with random noise with the trained network: ##  #Triangule pattern with random noise/images/t_wn.png [0.98, 0.01, 0.01] => TRIANGLE    Square pattern with random noise/images/s_wn.png [0.00, 0.96, 0.02] => SQUARE   Cross pattern with random noise/images/c_wn.png [0.00, 0.00, 0.98] => CROSS  ##  =Evaluating the patterns with line noise with the trained network: ##  !Triangule pattern with line noise/images/t_wbn.png [0.62, 0.00, 0.02] => TRIANGLE   Square pattern with line noise/images/s_wbn.png [0.00, 0.75, 0.01] => SQUARE   Cross pattern with line noise/images/c_wbn.png [0.00, 0.00, 0.98] => CROSS  ##    These results are very satisfactory. The network could sucessfully identify the patterns despite the noise introduced to them. In fact, one of the most popular uses of neural networks in business applications is OCR (opticar character recognition).   ]This is the source code used to elaborate this example (You can find it inside the zip file):   5 require File.dirname(__FILE__) + '/training_patterns' require File.dirname(__FILE__) + '/patterns_with_noise' require File.dirname(__FILE__) + '/patterns_with_base_noise' require File.dirname(__FILE__) + '/../../lib/neural_network/backpropagation' net = NeuralNetwork::Backpropagation.new([256, 128, 3]) tr_input = TRIANGLE.flatten.collect { |input| input.to_f / 10} sq_input = SQUARE.flatten.collect { |input| input.to_f / 10} cr_input = CROSS.flatten.collect { |input| input.to_f / 10} tr_with_noise = TRIANGLE_WITH_NOISE.flatten.collect { |input| input.to_f / 10} sq_with_noise = SQUARE_WITH_NOISE.flatten.collect { |input| input.to_f / 10} cr_with_noise = CROSS_WITH_NOISE.flatten.collect { |input| input.to_f / 10} tr_with_base_noise = TRIANGLE_WITH_BASE_NOISE.flatten.collect { |input| input.to_f / 10} sq_with_base_noise = SQUARE_WITH_BASE_NOISE.flatten.collect { |input| input.to_f / 10} cr_with_base_noise = CROSS_WITH_BASE_NOISE.flatten.collect { |input| input.to_f / 10} puts "Training the network, please wait." 20.times do net.train(tr_input, [1,0,0]) net.train(sq_input, [0,1,0]) net.train(cr_input, [0,0,1]) end def result_label(result) if result[0] > result[1] && result[0] > result[2] "TRIANGLE" elsif result[1] > result[2] "SQUARE" else "CROSS" end end puts "Training Examples" puts "#{net.eval(tr_input).inspect} => #{result_label(net.eval(tr_input))}" puts "#{net.eval(sq_input).inspect} => #{result_label(net.eval(sq_input))}" puts "#{net.eval(cr_input).inspect} => #{result_label(net.eval(cr_input))}" puts "Examples with noiseE" puts "#{net.eval(tr_with_noise).inspect} => #{result_label(net.eval(tr_with_noise))}" puts "#{net.eval(sq_with_noise).inspect} => #{result_label(net.eval(sq_with_noise))}" puts "#{net.eval(cr_with_noise).inspect} => #{result_label(net.eval(cr_with_noise))}" puts "Examples with base noise" puts "#{net.eval(tr_with_base_noise).inspect} => #{result_label(net.eval(tr_with_base_noise))}" puts "#{net.eval(sq_with_base_noise).inspect} => #{result_label(net.eval(sq_with_base_noise))}" puts "#{net.eval(cr_with_base_noise).inspect} => #{result_label(net.eval(cr_with_base_noise))}"    nn-custom 'Customizing your neural network in ai4r  ~Sometime for a given problem, you will have to "play around" with some parameters to get to a solution. This parameters are:   strong1 threshold11: A real number which we will call Threshold. Experiments have shown that best values for q are between 0.25 and 1. You can optionally pass this parameter to the initialization method of your network.   11lambda111: The Learning Rate: a real number, usually betwefen 0.05 and 0.25. You can optionally pass this parameter to the initialization method of your network.   11momentum11: A momentum will avoid oscillations during learning, converging to a solution in less iterations. You can optionally pass this parameter to the initialization method of your network.   11transference function11: By default, f(x) = 1/(1 + e^(-x)). This function is called "Sigmoid function". You can see it like a "smoothed" version of the "Heaviside step function". It will always provide a value between 0 and 1.    images/sigmoid.pngSigmoid function    Sometimes you will have better results with f(x) = x. You can change the transference function from the default sigmoidal function to the linear one, overriding NeuralNetwork::Neuron.f and NeuralNetwork::Neuron.f_prime (derived function of f):   a class NeuralNetwork::Neuron def self.f(x) x end def self.f_prime(x) 1 end end   nn-more .More about Neural Networks and Backpropagation   href56http://en.wikipedia.org/wiki/Artificial_neural_networklink7/Wikipedia article on Artificial Neural Networks77   55,http://en.wikipedia.org/wiki/Backpropagation77Wikipedia article on Backpropagation Algorithm77   55>http://www.tek271.com/articles/neuralNet/IntoToNeuralNets.html770Neural Networks - An Introduction by Abdul Habra77   55:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html77iA graphical explanation of the backpropagation algorithm by Mariusz Bernacki and Przemysław Włodarczyk77     ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptU/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/neuralNetworks.xmlw/xsrgq~tXfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslt_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslsq~ #q~tLfile:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsltST-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xslsq~ 3:q~tqfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=geneticAlgorithms.htmltxT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=geneticAlgorithms.htmlsq~ 81q~tlfile:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=geneticAlgorithms.htmltsT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=geneticAlgorithms.htmlxtEPK_G-file-cocoon://site.navigation.links.xml?pipelinehash=786357640368091306_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/absolutize-linkmap.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=geneticAlgorithms.html_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=geneticAlgorithms.htmlsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ppur[BTxp CXML  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.  Forrest site.xml This file contains an outline of the site's information content. It is used to: - Generate the website menus (though these can be overridden - see docs) - Provide semantic, location-independent aliases for internal 'site:' URIs, eg links to changes.html (or ../changes.html if in subdir). - Provide aliases for external URLs in the external-refs section. Eg, links to http://cocoon.apache.org/ See http://forrest.apache.org/docs/linking.html for more info  The label attribute of the outer "site" element will only show in the linkmap (linkmap.html). Use elements project-name and group-name in skinconfig to change name of your site or project that is usually shown at the top of page. No matter what you configure for the href attribute, Forrest will always use index.html when you request http://yourHost/ See FAQ: "How can I use a start-up-page other than index.html?" site tabCDATAlabelHomeabout Indexhref index.html description 'ai4r - Artificial Intelligence for Rubyindex   Genetic AlgorithmsgeneticAlgorithms.html Genetic Algorithms in rubygeneticAlgorithms Machine LearningmachineLearning.html ID3 Decision Trees in rubymachineLearning Neural NetworksneuralNetworks.html &Backpropagation Neural Network in rubyneuralNetworks  Downloadsdownloads.html ai4r - Download Filesdownload Subversion (svn)svn.html ai4r Subversion repositorysvn   ai4r project PDF wholesite.pdf ai4r_site_pdf###  ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsr'KTKCWMR{_ tlowS@\cbfGbÓ/6 P|8"9 BH*]d+ʈڠ MZ'ge5'U#yO15mYyi>99ulVζpH^U#|sYn+3ֿyl;'?/q`"D5 {[W>VDk4Y-v0dHl_\/lWUbdwzRG==o>qOJg;>ߒs%&8M/>zxHꌄcY_zAXNXng7յSe'%QeOkr bl7VV8I&ּwu/xzR+ ¯:cgsvK5VGnulu᧊y$s,w|Hzѓ?u7>9Sxog1Ͻ}-/2_|u9o*-hn6|ͣZ-oa؝?Ƌ&)i߬dPx<j@5{ll!i8zs#!aKl q&*>+IdHZE $IH*RiBDG%QH*T-TU^V"ȩKa%CKեrYjv]QSUox>isih?kktIRP{3 tttc|1`Wzzuٳ_I`4 7hAӁkpNEۍL4Mz,9l|e , V6営vKV0W90V1VZt2Ykl.m{Xxyux|+|8~fNE̠alЖ+)mUQ;bŕ&rZ}ão6f̘sY;wꊊ !C?~|ɒ%_… ]dddEEO?q\SSԩSz=a7O(11Quɸ?%0,",Dt˗//^8--/ D=vWbcchC hMMMDdXlrrT*Zeeelj%K.iTΛ[4t|||86ˆشXd⫽tbtttƪj6(&)'''A@`\VVkrvl0w ,Fÿ9` qSX,|r9;%ͻ˸Λw| =p56T*5FQ(S9<11d2Ղm//F]YYPPP@DѣK,YpasCC?jUUUwZ-kѡClynu|gҚKt>`@cm%w͡FEEd2 D(##Cшbl0ܹ.uuO߼y2꺺:{`%ԩT[nk"_V?^"tLihh(~+W&ihh s:~bz^׳{b(J\GPYjBiE**JRƲ.$𗷺466CDGGuv|?4''Y Vc%i4TֺTձ dGDJw4 qrW*h///ԩS^wԩ'O"Ӌ w!@6aiӦ]W36mڼyJm=F?U@Ȑq dUy- Ջ s d!@Ȑq d82d2 B!C!@?*1LT%nr2uzsG/E1_6jMJ&&-6bָq14~xΝ{K$ejCw-kݨ]A+{yT_q0n+%!{zY`my,,)Ive q;NQNO43m2v2B^)KZ[t92gGM9s'WQF(#t⩞7n#ǖG$}MH53Y=qR2,rjriom)*-ʲ͌ x܁~W"/KvosWAj&=1^;QRw'z61zpD4Z,eEed#Q 2rR#ͧ%ee%%ee%t25碻`F{q`[ΜgG&@ekӪ~_v_VuI?j>Ocȕz1<(=ϤIJ~u!UNo?HI%!w)Hm82Ѕ׬dj1tt:=%9G3ߑp2 B!C!@Ȑq d1D$<8X,C_ B!C!@Ȑq d82d2nsq.%q]zzɓgU7߿/|``A j׮]+--]t?߻8Vꫯ8p=|Ƞ6q#GL>]k׮9E%|D2}t"d?Ç]@C;nRSN]b-,,ܺukQQ{[ȸ+,,… "#GZΝCwq8 @0B!C!@Ȑq d82d2 B!C!@Ȑq d88w*R2@Ȑq]qqqqqq_l6fÇg̘f"##nRd2J 8nbxΝ..QȸnذalBR:t,X`{dw+"8e!\ }رcRF1;;;00 ֟5D4zh"i͆@ H?|`cXS^^^^^^PP˯X,.**>|8&%%z??͛7KR??iS(}q} HVՑR{{{ff[~ƍ]zfy˖-|Kh4޸qchׯOLLQy*꣏>/$;}|EU"wiCCC]]]jknnj8xH:D={ظܹst|VuĈMMM}Q@@_ummmFc{{*2 }U2d2 B!C!@Ȑq d8vՊߍIENDB`ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptQ/home/sfierens/workspace/ai4r/site/src/documentation/resources/images/fitness.pngw/xsrnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`sr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xp}]srjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xp!tfilet2cocoon://svn.xml?pipelinehash=-7004163430053168949psq~ tidgent-8355019975799787170psq~ iYstxincludetXIncludepxpsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ppur[BTxpCXMLdocument header titleASubversion repository for ai4r (Artificial Intelligence for Ruby)  body idCDATA Anonymoussection Anonymous Subversion Access p hThis project's SVN repository can be checked out through anonymous access with the following command(s).  ul  li 0svn checkout http://ai4r.rubyforge.org/svn/trunk   3svn checkout svn://rubyforge.org/var/svn/ai4r/trunk     Browse Browse latest files  ;You can see the latest ai4r code directly in your browser: href http://ai4r.rubyforge.org/svn/linkhttp://ai4r.rubyforge.org/svn/   warningThe latest code in http://ai4r.rubyforge.org/svn/trunk will probably be a work in progess. If you want something that works, please download the releases.   moreinfor More info on Subversion (svn)  YIf you need help about using Subversion (svn), the (IMO) best documentation is available  http://svnbook.red-bean.com/here.     ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsr   t * Can contain a mount statement as a sibling to components and locator *  locator  * Can contain a mount within a selector where a selector is valid.  patternproject.rewrite.**match  !http://cocoon.apache.org/{1}.htmllocation  project.remote.**.xml  ehttp://svn.apache.org/repos/asf/forrest/trunk/main/fresh-site/src/documentation/content/xdocs/{1}.xml   * Can use a selector inside a match. *   To locate all your source documents in a slide repository you can do:    ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptL/home/sfierens/workspace/ai4r/site/src/documentation/content/locationmap.xmlw/xsrnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`s P`8P`ߐsr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xpQ^srjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xp<>tfiletFfile:/home/sfierens/workspace/ai4r/site/src/documentation/skinconf.xmlpsq~ /!txslttKfile:/usr/local/forrest/main/webapp/resources/stylesheets/strip-doctype.xslpsq~ ~q~tNfile:/usr/local/forrest/main/webapp/resources/stylesheets/upgrade-skinconf.xslpsq~ 9q~t;file:/usr/local/forrest/main/webapp/skins/pelt/skinconf.xslpsq~ q~t=file:/usr/local/forrest/main/webapp/skins/common/skinconf.xslpxpsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`rppur[BTxpiCXML skinconfig nameCDATA MyProjectdomainmydomainprovidergooglesearch   disable-print-link true  disable-pdf-link false  disable-pod-link true  disable-txt-link true  disable-xml-linktrue disable-external-link-imagefalse disable-compliance-linksfalse obfuscate-mail-linkstrue obfuscate-mail-value.at. disable-font-scripttrue  project-nameai4r project-description Artificial Intelligence for Ruby  project-urlhttp://ai4r.rubyforge.org/  project-logoimages/ai4r-logo.png host-url#http://rubyforge.org/projects/ai4r/  host-logoimages/rubyforge.png  favicon-url disable-copyright-footerfalse  inceptiontrueyear2007 vendorSergio Fierens location nonetrail" ai4rhref$http://ai4r.rubyforge.org/link1&&& #$$%link2''' $$link3((( ""  max-depth)2 min-sections+1 pagetoc... type/boxedheadings111  extra-css2 p.quote { margin-left: 2em; padding: .5em; background-color: #f0f0f0; font-family: monospace; } #footer a { color: #0F3660; } #footer a:visited { color: #009999; } #top :searchbox { height: 34px; background-color: #DDDDDD; } 22 pdf3 size4letter orientation6portrait text-align8left---- page-numbering-format:Page 1::  double-sided;falsemargins= top>1in>> bottom?1in?? inner@1.25in@@ outerA1inAA == show-external-urlsBfalseBB false 33 creditsC  box-locationDaltcreditF Built with Apache Forrest urlGhttp://forrest.apache.org/GG imageH$images/built-with-forrest-button.pngHH widthI88II heightJ31JJ FF CC colorsKheadervalueM#003366colorOOO tab-selectedMM#ddddddlinkR#555555vlinkTShlinkUSOOOOtab-unselectedMM#999999RR#ffffffTTXUUXOOOOsubtab-selectedMM#ccccccRR#000000TT[UU[OOOOsubtab-unselectedMMZRRSTTSUUSOOOOheadingMMNOOOO subheadingMM#888888OOOOnavstripMMQfontaSOOOOtoolboxMMQaaSOOOOborderMMWOOOOmenuMMXOOOOdialogMM#eeeeeeOOOObodyMMXOOOOtableMM#cccOOOO table-cellMMXOOOO highlightMM#ffff00OOOOfixmeMM#cc6600OOOOnoteMM#006699OOOOwarningMM#990000OOOOcodeMMNOOOOfooterMMXOOOOalignucenteraa#FFFFFFMM#4C6C8FfeedbackOOOOaawMMx publishedOOOOaa[MM#cfdced menuheadingOOOOaa[MM#E5E4D9 searchboxOOOOKKur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptA/home/sfierens/workspace/ai4r/site/src/documentation/skinconf.xmlw/xsrgq~tXfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslt_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslsq~ #q~tLfile:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsltST-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xslsq~ q~tofile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=machineLearning.htmltvT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=machineLearning.htmlsq~ cIq~tjfile:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=machineLearning.htmltqT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=machineLearning.htmlxtAPK_G-file-cocoon://site.navigation.links.xml?pipelinehash=786357640368091306_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/absolutize-linkmap.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=machineLearning.html_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=machineLearning.htmlsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ȸppur[BTxp CXML  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.  Forrest site.xml This file contains an outline of the site's information content. It is used to: - Generate the website menus (though these can be overridden - see docs) - Provide semantic, location-independent aliases for internal 'site:' URIs, eg links to changes.html (or ../changes.html if in subdir). - Provide aliases for external URLs in the external-refs section. Eg, links to http://cocoon.apache.org/ See http://forrest.apache.org/docs/linking.html for more info  The label attribute of the outer "site" element will only show in the linkmap (linkmap.html). Use elements project-name and group-name in skinconfig to change name of your site or project that is usually shown at the top of page. No matter what you configure for the href attribute, Forrest will always use index.html when you request http://yourHost/ See FAQ: "How can I use a start-up-page other than index.html?" site tabCDATAlabelHomeabout Indexhref index.html description 'ai4r - Artificial Intelligence for Rubyindex   Genetic AlgorithmsgeneticAlgorithms.html Genetic Algorithms in rubygeneticAlgorithms Machine LearningmachineLearning.html ID3 Decision Trees in rubymachineLearning Neural NetworksneuralNetworks.html &Backpropagation Neural Network in rubyneuralNetworks  Downloadsdownloads.html ai4r - Download Filesdownload Subversion (svn)svn.html ai4r Subversion repositorysvn   ai4r project PDF wholesite.pdf ai4r_site_pdf###  ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsrgq~tXfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslt_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslsq~ #q~tLfile:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsltST-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xslsq~ zLJq~tcfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=svn.htmltjT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=svn.htmlsq~ Xx#q~t^file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=svn.htmlteT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=svn.htmlxt)PK_G-file-cocoon://site.navigation.links.xml?pipelinehash=786357640368091306_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/absolutize-linkmap.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=svn.html_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=svn.htmlsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ppur[BTxp CXML  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.  Forrest site.xml This file contains an outline of the site's information content. It is used to: - Generate the website menus (though these can be overridden - see docs) - Provide semantic, location-independent aliases for internal 'site:' URIs, eg links to changes.html (or ../changes.html if in subdir). - Provide aliases for external URLs in the external-refs section. Eg, links to http://cocoon.apache.org/ See http://forrest.apache.org/docs/linking.html for more info  The label attribute of the outer "site" element will only show in the linkmap (linkmap.html). Use elements project-name and group-name in skinconfig to change name of your site or project that is usually shown at the top of page. No matter what you configure for the href attribute, Forrest will always use index.html when you request http://yourHost/ See FAQ: "How can I use a start-up-page other than index.html?" site tabCDATAlabelHomeabout Indexhref index.html description 'ai4r - Artificial Intelligence for Rubyindex   Genetic AlgorithmsgeneticAlgorithms.html Genetic Algorithms in rubygeneticAlgorithms Machine LearningmachineLearning.html ID3 Decision Trees in rubymachineLearning Neural NetworksneuralNetworks.html &Backpropagation Neural Network in rubyneuralNetworks  Downloadsdownloads.html ai4r - Download Filesdownload Subversion (svn)svn.html ai4r Subversion repositorysvn   ai4r project PDF wholesite.pdf ai4r_site_pdf###  ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsrgq~tXfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslt_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xslsq~ #q~tLfile:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsltST-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xslsq~ q~tnfile:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=neuralNetworks.htmltuT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=neuralNetworks.htmlsq~ Pq~tifile:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=neuralNetworks.htmltpT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=neuralNetworks.htmlxt?PK_G-file-cocoon://site.navigation.links.xml?pipelinehash=786357640368091306_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/absolutize-linkmap.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-normalizetabs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/normalizehrefs.xsl_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/site-to-site-selectnode.xsl;path=neuralNetworks.html_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/relativize-linkmap.xsl;path=neuralNetworks.htmlsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ppur[BTxp CXML  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.  Forrest site.xml This file contains an outline of the site's information content. It is used to: - Generate the website menus (though these can be overridden - see docs) - Provide semantic, location-independent aliases for internal 'site:' URIs, eg links to changes.html (or ../changes.html if in subdir). - Provide aliases for external URLs in the external-refs section. Eg, links to http://cocoon.apache.org/ See http://forrest.apache.org/docs/linking.html for more info  The label attribute of the outer "site" element will only show in the linkmap (linkmap.html). Use elements project-name and group-name in skinconfig to change name of your site or project that is usually shown at the top of page. No matter what you configure for the href attribute, Forrest will always use index.html when you request http://yourHost/ See FAQ: "How can I use a start-up-page other than index.html?" site tabCDATAlabelHomeabout Indexhref index.html description 'ai4r - Artificial Intelligence for Rubyindex   Genetic AlgorithmsgeneticAlgorithms.html Genetic Algorithms in rubygeneticAlgorithms Machine LearningmachineLearning.html ID3 Decision Trees in rubymachineLearning Neural NetworksneuralNetworks.html &Backpropagation Neural Network in rubyneuralNetworks  Downloadsdownloads.html ai4r - Download Filesdownload Subversion (svn)svn.html ai4r Subversion repositorysvn   ai4r project PDF wholesite.pdf ai4r_site_pdf###  ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsrtEXtCommentCreated with The GIMPd%n6IDAT(cTWWe ?ĄD0aT40ZPP-/ p6IENDB`ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptK/home/sfierens/workspace/ai4r/site/src/documentation/resources/images/s.pngw/xsrnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`Csr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xpsrjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xpBtfilet4cocoon://index.xml?pipelinehash=-3413672797934272206psq~ tidgent-8355019975799787170psq~ iYstxincludetXIncludepxpsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ppur[BTxp nCXML  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. document header title(Artificial Intelligence for Ruby :: ai4r  body idCDATA Introductionsection  Introduction p  This project aims to produce ruby implementations of algorithms covering several Artificial intelligence fields, including:   ul  li href geneticAlgorithms.htmllinkGenetic algorithms    machineLearning.html&Machine Learning (ID3, Decision Trees)    neuralNetworks.html*Neural networks (Backpropagation networks)      howtoinstall How to install  1. Install the gem:  xml$http://www.w3.org/XML/1998/namespacespace xml:spacepreservesourceDgem install http://rubyforge.org/frs/download.php/32923/ai4r-1.0.gem  (Include require statements in your code:   require "rubygems" require "decision_tree/id3" require "neural_network/backpropagation" require "genetic_algorithm/genetic_algorithm"    ContactMe  Contact me   If you have some constructive comments about this project, please do send those to me: Sergio Fierens, email address: alt+(sergio (dot) fierens (at) gmail (dot) com)srcimages/my_email.pngSergio Fierens contact emailimg    warranty Disclaimer Note   This software is provided "as is" and without any express or implied warranties, including, without limitation, the implied warranties of merchantibility and fitness for a particular purpose.     ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsr -9   CThat is: From 0 to 2 costs 5. From 2 to 1 costs 4. Total cost is 9.   chromosome-impl-reproduce Reproduce function  hReproduction is used to vary the programming of a chromosome or chromosomes from one generation to the next. There are several ways to combine two chromosomes: One-point crossover, Two-point crossover, "Cut and splice", edge recombination, and more. The method is usually dependant of the problem domain. In this case, we have implemented edge recombination, wich is the most used reproduction algorithm for the Travelling salesman problem. The edge recombination operator (ERO) is an operator that creates a path that is similar to a set of existing paths (parents) by looking at the edges rather than the vertices.   Edge recombinationimages/ero.gif   [The previous image was taken from the wikipedia, so hail to the author: Koala man (not me).   chromosome-impl-mutation Mutation function  CMutation funtion will be called fro every member of the population, on each generations. But you do not want to mutate your chromosomes every time, specialy if the are very fit. This is how it is currently implemented: With a probabilty of changing inversely proportional to its fitness, we swap 2 consecutive random nodes.  K def self.mutate(chromosome) if chromosome.normalized_fitness && rand < ((1 - chromosome.normalized_fitness) * 0.3) data = chromosome.data index = rand(data.length-1) data[index], data[index+1] = data[index+1], data[index] chromosome.data = data @fitness = nil end end   chromosome-impl-seed  Seed function  -Initializes an individual solution (chromosome) for the initial population. The built in seed function generates a chromosome randomly, but you can use some problem domain knowledge, to generate better initial solutions (although this not always deliver better results, it improves convergency times).  : def self.seed data_size = @@costs[0].length available = [] 0.upto(data_size-1) { |n| available << n } seed = [] while available.length > 0 do index = rand(available.length) seed << available.delete_at(index) end return Chromosome.new(seed) end     search-impl Implementation of GeneticSearch  The GeneticSearch class is an generic class to try to solve any kind of problem using genetic algorithms. If you want to model another type of problem, you will have to modify the Chromosome class, defining its fitness, mutate, and reproduce functions.  search-impl-init Initialize the search  You have to provide two parameters during instantiation: The initial population size, and the how many generations produce. Large numbers will usually converge to better results, while small numbers will have better performance.  L search = GeneticAlgorithm::GeneticSearch.new(10, 20) result = search.run   search-impl-run  Run method  Once you initialize an instance of GeneticSearch class, you can perform the search executing the run method. This method will:     Choose initial population   9Evaluate the fitness of each individual in the population   0Repeat as many times as generations we allow    9Select randomly the best-ranking individuals to reproduce   dBreed new generation through crossover and mutation (genetic operations) and give birth to offspring   2Evaluate the individual fitnesses of the offspring   6Replace worst ranked part of population with offspring         search-impl-selection  Selection  Selection is the stage of a genetic algorithm in which individual genomes are chosen from a population for later breeding. There are several generic selection algorithms, such as tournament selection and roulette wheel selection. We implemented the latest.     OThe fitness function is evaluated for each individual, providing fitness values   6The population is sorted by descending fitness values.   The fitness values ar then normalized. (Highest fitness gets 1, lowest fitness gets 0). The normalized value is stored in the "normalized_fitness" attribute of the chromosomes.    A random number R is chosen. R is between 0 and the accumulated normalized value (all the normalized fitness values added togheter).   The selected individual is the first one whose accumulated normalized value (its is normalized value plus the normalized values of the chromosomes prior it) greater than R.   7We repeat steps 4 and 5, 2/3 times the population size.     'images/fitness.png   VThe previous image was taken from the wikipedia, so hail to the author: Simon Hatthon.   search-impl-reproduction  Reproduction  kThe reproduction function combines each pair of selected chromosomes using the method Chromosome.reproduce.   The reproduction will also call the Chromosome.mutate method with each member of the population. You should implement Chromosome.mutate to only change (mutate) randomly. E.g. You could effectivly change the chromosome only if:   6 rand < ((1 - chromosome.normalized_fitness) * 0.4)     example-run How to run the example  qYou can run the example with "ruby genetic_algorithm_example.rb". The genetic_algorithm_example.rb file contains:   require File.dirname(__FILE__) + '/../../lib/genetic_algorithm/genetic_algorithm' require 'csv' # Load data from data_set.csv data_set = [] CSV::Reader.parse(File.open("#{File.dirname(__FILE__)}/travel_cost.csv", 'r')) do |row| data_set << row end data_labels = data_set.shift data_set.collect! do |column| column.collect { |element| element.to_f} end GeneticAlgorithm::Chromosome.set_cost_matrix(data_set) puts "Beginning genetic search, please wait... " search = GeneticAlgorithm::GeneticSearch.new(800, 100) result = search.run puts "Result cost: #{result.fitness}" puts "Result tour: " result.data.each { |c| print " #{data_labels[c]}"}   more-genetic-run AMore about Genetic Algorithms and the Travelling salesman problem    (Travelling salesman problem at Wikipedia    .http://en.wikipedia.org/wiki/Genetic_algorithmGenetic Algorithms at Wikipedia    ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsrLorg.apache.cocoon.components.source.impl.SitemapSource$SitemapSourceValidity+{yyLvalidityt,Lorg/apache/excalibur/source/SourceValidity;xpsrsrjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xptresourcetTfile:/home/sfierens/workspace/ai4r/site/src/documentation/resources/images/c_wbn.pngpxpsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`t image/pngpur[BTxp͉PNG  IHDRh6 pHYs  tIME /tEXtCommentCreated with The GIMPd%nCIDAT(푡 c.ZI:HL* ^UfVh<LuI[5IURfnUIi%ŞIENDB`ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptO/home/sfierens/workspace/ai4r/site/src/documentation/resources/images/c_wbn.pngw/xsrnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`sr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xp fsrjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xp ftresourcetVfile:/home/sfierens/workspace/ai4r/site/src/documentation/resources/images/europe3.pngpxpsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`t image/pngpur[BTxpSPNG  IHDR} bKGDxh pHYs B4tIME !&| IDATxyxT KS bUY BI,[$B"*DADa)`(QqAX JVa,wfry|$ܹ,gXV+!88_D0aLBR !$ DlWĴ$i/͉c MA \Ԥ-#$(SKb|8FH A؟QB@lLB!$DGn0 "'g1:ft~]47=,:lPw8Y@'4G03\9هP ! Zk%u܄BHѡy D@p{2!BBL3&T&0R f"lz.ݣ. D`PZ|o@O#BB 9_v(݅P  9O5*:jBpq9hA !!:C~"*}v"cY!+ !!B@O nM$.Nu99BOp ! 8@-1'BGH"oL !!R&=1o@+d !!* .!BB'5zAB!$D7J& Ӕ(O8ݜVK3٣D+Q++~zR bG(r"Qḱ:bt&p ~JcIJ &,AƛvHH +teJA$BhbD`VG # #Zv Λ:BB(.l!d+YBLAf-rB4BZB(("{EBdq\K(|FBL-H(%ļ+QiE * &@ʊ^] !:B"hnnEA.B#S#!D}t}0Q⩵[a9&@^ ĈZz ё#ʖ9 QBJ+q1K 1J 4)tD [w(ń h zr!t&̈́0Ԗ0!1LnB!$DE7+B!$w;`{C 0&1AB&jFt !!>E#A=(]8@tC?:JB(Z(dP mB̅jZ Do">NЃs|B7ke+!BBQp  [x "Bϴ!P.nЈ7$51-NTF⧤Xi֨ӛ@r'j'p"tTZhJOH(x)cFQX_ ,zJ B!$ |6HPn Bƌ r="nT 4]ҏG(&t: tF5K-hQThp5+-(r=dP  -Z6}N%vt} " ɜVb(?ocR~dbJvo 4c: !!Dj-v]kհaCP j@B(P C%-#uPd?v !!#J U (RBHQUt(< \nNݢADG*ZʼnP шĴ$F!BbNc@&#$ X.A q9D&PHf۬ !QepYˍ?)w{iO(FօhԺ>'w]6q.5a4n}+{ Fxܹsꛯ3 +Ͻ"Х=7 7gAdd$UU/??y&&^3k,ع)ۯqQ?)4Ed(1]{uéy/tcC%ݤ<{QQHJHŠ5+дIS׳X,x鹥9WGgEuM5&7=_ܙs0[#** a$%$yTWI&ub|:B"PeivL3 7G[A{WK='dP,$48FH' )#5%OM7*5$6,tf]!|X&O]ޖH-#7/,c0BZE ~Z祯tzojO&Gy{OT1$:BB:&ulN;V.8v* u+Q؅z-6uG]pԄnn(!wP &]D zeiQ@_WH7HGH8C"T=C:B d0}_6ղ [Ri ! uj ppvpHdkE !Q}2]rMZ3ڥ- 4_Y d78MAW^8!6U)3E8{T 5-J!d-yabA*vV6)t+ Zhi<4N $/=mߡ-}4JB V<-]ڢ$N:D<#9$T#ܧ.E91#C[@qIEy!/ 8ػE.Pnq%BAxz :9\QL.'ɨ)ZD<ճJ] lWQHLKIPG S8KyvP$x0[UcҌy֤3 ERE9VH!4R IcSb(g`*6ӳq ='(Q)CYXδ1Yr6E0t7w%Oefax#9oiOH!ME (D4Tsb &g#$T)[eר6BDBsJAS\anP鵃?,HeBM+2Z=Aْ7{>-0[YWD)թ:blBkLsȂ-FU_@HyJ!4R 6=gɵ IyD8|WYP;5J+Ciiz,zI-7еfWTYktn"ig(ˋyܠN, "6i+Bu\k]8F(KRbIaP?5}@-S&(!8.#jC`(ۈD/b*v L(u\jV HtՑ+kݠXcAY5‰iI641qDSй'#4G}CEff&L6m`׮]/^ge^,dݘI6@֍Y{/:bڕ8XXfMa3sܻ62e([T_ U a4rC++ >}54b1n8미Kh"{͛7_8\z8y$vݻw#55ppAl{w>z} ҲEK<_p77VGxx8Nu*jL`S#C.oЈIpyα7 h}h(P W8_zJ?Ocbf|j{ƍs]w݅F!..3LExx8{G>,#@XX8:upCzF%(dQV93H a],/SvoՊ9;wW'*;lKQ;|{ Mį ©N I7K;s>ア@ { C; w+*+o7/OѴISiߵGW >+;İonxI"^Z_}2Hqk"k+딮Lց#\xہ"E[pfB}}f<04=()-E!Q V]}z$tiSaɸ9{eL>#o'& ״n~(h7 [h[BNͼ}cп6x`Au^[p0 {>݃~/~Wp8ohЄ"C#p1A.봷XD=uw۟۾fξF}lՌ">1;Tĸ߷~CV\+(,@MM )1|xf3(++lh_WJ u\W=x!a_L=#q L<25kv10G?^-Z y x a8F3rzeJc)dҨQȧ;y1A x8`Q 7HS͞E/Q3 k__:\veZe+!&&.`@! ޖ8 I3ٻDtZ }}1IF?_\X?M=^Lb͌nԨ15eqLt/+´)b?%̂s'2d"Wo<61ebn0\P]؅z*K'{qc¸Nl7`X`cb msG{5~ۚT#h $zy`&M⥼?пw###g'A:B d͑(hpjyII &N KdjaW._R j Tw.ޥlʍy'P\tR`_ +~E n8c, )3[4oV]OXq:bw9ʊWp٥aga?_ǾΞ> KuŢ' u^I$6gs}HD8ow (+/GZj>ٷ]킽"N*6m[/A0{,v,n̚yޛ&`_`^[1{,\{͵6{:8z({ys ,tB9O)-}1k۶mQyQf?c?¶wS[3guoLW#:*ڔ %٘Shw+mW4i#HINA݀bH`@iݺt/SN81|)=Pntzg~5B}}=ߞ̆p\#Wo|#=rcܥSFBn4&ܜ=^߭K7ع)ۯqQ?)4AKc7("af(nq.8y$.D4noy#- j,\KǒPp'Qw,ٌ쑋[l-K6;q^]QO~}!o/yZ+x4iՊP]S9 SXӒP!RL0 {A8߭K7|g.LGJrw'~W^~Պ"HG*f,vMp\ٳx֫@uuNf?XGpł p}g$㑜˗[nh6fޫGO{5Llse7*4mZ(+/C^Ѿݥo~|8DDD`Ǯ;1M4!-5-F#QF4Eae5~\_q-ZY믿lk4m:vmzmڵq|L3DEFaRvMT zsjj.r +qהIB; 7Fz4kRPWWԔT@tT4gc,_*fŴYsuM5&7G݂3{~.pMѤI\:TWWs|PAQ ,4:B5Z2u\5u^ REE*=9lYdfg!Mcwklߴ 9\|&;= Gly#C[Y W"c󛛰-xv"╠1y >>+A p&6!JYL,zޕ?|1Ҟ*qX]v{'Kˑ5Ӧ<ҲRdfgacq8fM{PZV pƒKx&tDi(Z|7[)gwԗ(!fZtm +#,(,nZdtǵ\Ek:{PZVg~=[6x 555:_}.l+Ͻ}NPs--(3n4z[SW 9[#ͳ-n~c@t*9g'g".ů{V> %Q\"ɷX u6\L{4۴`w! vEŨ(?s(.*vWۓtEQQQHNN֭[222Cn,Xx~ w"%={KHnv&Wk)q>eѸsxx&<stA-zjߟ>}:Ν;cȑ.0g\ akkPUMݕb?%ܨOrg'*޼Daq-wډ_x@3{xQi麢oiu3-Yn1z(ZX\'ü063)=Xkd%Zȁ$%Pq&cjpX O.5z¾t"um}-tqE'%ҹh8!( j%@ʊ?gdAnZ2k=O:7ozY Dz[PٚHBGHkC^^0aׯ&TpQNW(Z9OLͮBvӋ _#Ə?Q*΢+#4Dg3.mo_`8SŒ~-{['h`cB^nI/O(@9*]bſ93{b ˍQmIɗ`z$7jDg56&Q) ,Cm%Bg.rcA%x=7,l8144ƣg 4"ꁿCޮ+8e(j:sBPeuf{[QwlʊsȨfx}@ "¡5B`/cH `ЀZЄr<_y)FztF؆˹/u7QEP,&P-`fwI)r3|?}SqyXC#ninQE_@=ͼUx';DyE96jQУ *nL- R sB_kF#*+t,ixJْB\84 oښZ {X՟((A zQxBEzC<PNm~sӒ.o-L*80 G;#rS=C!Ԡ9");{oOB|{v]V3&X^^6;xq̚2P )=7mC-̒Eߓƍc`=bx}}U`GBL˽ݿE'F+:u] #r_4O_,>Bh"S*K %'J,{Zh{ e[QQu-;WB N#o-U8:~ ]Yvyo_oCXb [UU>_?XXj<:1<#(--w9r6qxg˻8_w> )R^ۃ("HYuns01[,xVk%bbbPybK΃չ|w◰=xؾs^rGD˯Np\EhX?'wG>~Mo *=EMȸA(D!|-/.:q(?`hҤ R2#ݮ9VKKK7֢ {ƥ.;ozZjּpiXVTUWjth-bZwdFtN#3*%o3AòQS[h"|׌FZj6uLz7pNUW^iSSf CDDs'.Lҩ$գgJs:N(9NW 93hkP(%*BErZPCAC-Z O OF6x#CrN_n1J !JܓARe"ֽKd'L.jj9؉0~ƚAg) lډlթISSpf",%*+c@IiH\_RĀF =ZSB,@EEIsVoƪe$qsR I羍T=b߿XQ9 n`DِY0LtDv!\k;~;Ļ5x`%)!6WmoܽµZu& )/vjg؛qH~XB(t #*%8ޞ_CAtOק.#4^kP3+u\^/O H4M^(DaR`m7ѷbUti !0@7%jZ_ # _Y| 6m@Ee-[ӏ?x _YWwvV!O(Fb4j]F 1|f!@ee%X0N !P RE}ǘ`Ipnht;|-o':;b]lEEF!K7{ntnH{Rz2 -[8^4.|) Z zPkj;og [D={P =5=iՊ3x(r\*\;+, ^zn)~;>ށW_\yQ?yVxGiߓ}>J$z] EEe9 fEUu8ZwxotwO?6Av 6 3; Sg.c'~<;߄8cޣ lco&bFtT4gcN덾}1m44qƿWxvH9M;uy$Oixb<}`QshԨ|*|3/b*wx8 xqxgMʺ#XE F:qݑxju{:ʓ:_qɠrTdb C;4mΟ?߰†{: N&%av}xsO?M$(BHԍ(Etށv9wU/I /X2ŜysonxK5kuG>ٳQ[[|r7)lM],,#h%r@n Lΰ'1&ݡ44#͛IMvLhaȭ7~нxs]?^}sRw!%6&ikD;x0b'"A%[v7ߡm]޺fφv~Ȯ0=}FuTz+X\\ٲpa{yIc'!&ܣs"ʡ}tPo} RG4ZB֢⒅ј-!͌E(kw_rGoTȉ@BcD76% *gT` f/QrEK9FlynPtT2X Hw&ʬ[_ ta@):C`.цO, ?ag/>]޳Z:2>F]G.WeRޤ9Jpbh7$/.>q """pÈoWtztd/CpA= ݠlE:ζ"x4>1-{nۄ\NXv%n;G}}%Nc(y{q!yaTF(`hy%RBhbˁҎxdyDBH7h wn$8f0Shܸ1-Lע]zV+PWWP@7GAߌ.Ԏ]:6*&h%Fuz)BB=o-Eg_9c#z'p:~ՕWaڔ1fADxƏݒhd9999olu\+_@SCC_[5pS內O}VݧJ4^Nͩ}ZIZBoPؘ#4;U% R|/D"~gVs%Pq hdGDtT-F\33PK{&xrJ΂ =$K4P4Z fEOVۢijzF!4aID bƮQc47jԉ}S'hԺ_թfEş+b9s@/A0E Z ;-#P G(o̱?s,;#C='mdhP8~}Bd=;vpĵs|Fo?CJJ ڵkN> łW_}2d,C J]XB(b\bhJ뿳5ߝci?m b.̌6;> }oħ~Çc(++sw)|ظqLBQmqJ EuzZctTN YiLá QV^O}^|~/a͚5Xd ӧOGV555!]ghE.BHB] "r@0*2 I IXf6i{3ϝ;'6x?<<EƁ9Et]ܓ]fb ݠ/1$afXn5[~9*8cUaCe 7+;` Ww6x'FjJ;184g(rrr0l0lٲE@f0 d.y\,|n!*k*˩o|('wh⢓hԺuguu?hRM!޼DR{}íq@6>!n{>h^=0x` 3; SsÆMq3x~s~õexQRZ Xz v܁CHJO} +Ì(/)ljx3GUWb!BAI;MH뙆'CYy9> F~Td$?PSS}!g1|.?xNO Sfth\ݧ %(Wog",ĵ@UMG7#gE3:Bo'BAםDa<'DQQHJHŠ5+дIӋj <9sʊeİل5Ew`^v=KgW\ĹJ&GxxtX+XvHpx ;74s'^QYo~}Q^a`QU]:^կ>xajkeVE4[>^=DO*͢"i<{bAk䢐=>(Ѽys<\4k05w*\"%z,|]k,a7okWm ]aڔi NrhqXP)&"Rkټ,YQ~)FօyXHN#5%hd9}3bڬiXԳ{1쎿b ۘ| \4 V <jzۻ6.oG[__~ /Odfd:^3o.F?gao`0z"֚7&ox "22n݄!<<&žO -5-HYP~jXjwuօsʓܷFE7Cօ P7cVGt'!P9}4bcc]^KINi8wOi(MonB֍Y8, ғѪU+Lr ?|MmFkz9b1-6 t!0wc>7)ڄ-e8TqQYqZ?m 6nÏW^~ְkwk-ZPuiɵBR(YeKvuDPu+m-C >i_W#*2 Ww{Aߌؕݤ-OE]}.2XVTUU-Z#&PI1Hw_$k&R'iVߜ9sPPP?'>93ysr+ƣ%UW^iSK?Ndl.lب)悧OhX طr>jgo^"bLB}Ei3jvq0*B!Tk]PC=UMQ]PNW0R)B~X_GG]1)B ƅBE`EЈ36 @F\S+#\O䮸x6ូD&MH4Є@Ew/5y +m^3]^l7-~[FKQ CΕfDlJJJm۶11 ,R7M ޻r-%@z(0VsAo8O)YѡCkڵÓO>blYs>ibZRGC9/,j&s8g$MOl!bƌL<6uuw$Dވˮ@N!JGH$rر^}U]v?~MX]wv܉VZ_\r JKKQ]]X<32e ЫW/!??&MBaa!"""G})))jEJJ MaÆ_͛j*]w֭݅[111y檔-3AE0^r`J=I?zozͱf,Yb;L]+++gL0QUUo5j~W|WTT46c5;;ӧ;1ʒHOӘy̽)=h!S`Z,ǂ ej"##Νĉ0[w:w>4n^{-̙9s> $wxx8,oC)+ʋ֓%s|s~+鎷ҲyO=_;_ !Qvը… Ѹqc4nGFNpM7!''Æ Ö-[|ʕ5j,Y!##K,AC% 1-c0{l[bƎ9sEXz{x?gcҨqD8}]u=Y%i^˙Yz$C( !EUX1@u8#+!q f #Z 0_SBkZMTŮ vI t6"x1E "AG`GtlP޿'S !:oFޞ}mgC7 (,CN:hn0{Ytؠ p !4rC WN!BBmbZIP !1oA?"B&BHE9mBuj"#ŐP zmF8\0fBJ=J\ BT ց{3zb9y.$BHX(yTWgU1 Qc1,DP jQck#Ⱥ[ aX!ŎP z[ǠLpmBu%r8-$BGH!HB2Ĝ$C!!B+@KG(&~j Hļ!BBnyC(h( P !*9BktBH n0M ӔO8:ܜ^KB#% b 7*~R5+%XN7 b?""Uy>bڂeA)_0.0wsЮV"xP 17Qnm\G(XAz /7Q1BB$g(F r3$BBt&ňC5E 4J !!&sz4B(p^^ JsB 0v R0G#Q (rǮy!JY"( Q]ńĭlBs5NӂP)ĪHA"Bh@ #8oMP  &!Ő,L(:BBD(J(R[D41!sb!B(Bڭ:)Lj X*ŐPS Q[^B :=!zV.HuH˺F%f \WhAb%w(`K:B_[ T='ۄ:AR8B) ǍC3#d#t_LRbZGh4a6D:DbZ! , |V "@3˵6H!!,AԲcp ,tބXbDqa![لbyGnb0k;J "nF D}TkTdG@(#XB3bi!%GbD`(!%\J+RPa0SV ,@AkLs/B(]č|tBqA !cy=HO 1!&rJFf f$rMKVQ(WzU5ePJqN#zѺC)&PE >:nЛ 3!& ,xVrl| !!A] Ȅ !1 9 $DY˜Č"hs !BBdK !BBJ%8fpFQpB!$Dc=ztP 10P""X n3Ds)1(3.a #$Do@.VB(HB!$>"dB!$D 78iCC8Aݠ'oI kx ;%BbeYhϡKhO ‰Pm*rP )R? 5#$\!U&BH +l !8-]!@#$: 3wAxz6D!!& #$DV 4]ҏG(t: tFuK-hQThp5+=(J=ギ#"@@Z lj)BH(szgsĥ&%z2Ē剠4c: !!D-v]հaCP @B(P C%=3uPd?v !!:#J U (RBHTt((BH4Gbv<K5Gh 'RpYhDB\%X8zмu3닧,abIFM,Gp0.\BaQG+2Du `Ot vh|r:%/|mxsRldխkE'(F)3J[kTY?Ԏ0QîQ 7Q8M]~|.W +g7?"A~<#P9ym~zh٢%JKK$~Z@cYzu#-ӌK`U0u=oKq"քc0}rP)G55OK7*5$6,*k:2e֕kY2q2& 3{EPw^Kor(BB!4Iy{!-,O'E)ցc *t Sƃ288:BA3h w]J9ϯZ9`8C=CqQz ,ަlt EP\`eOZ3Q^EIPv&z;6@F9::,$׫['wPM(rlQwe_[뽢k X VK5-F*KXo)$ /P[]7 t`˖BH4nZ9SIϏRFBoY5= Л; RĔqbm1#>@ձP!8Z2=_ı/8r'RIA~~ƞB14 YB۹lB_Au?_`Q9d 0V JӋBGHt5)l0m)D V6Jm8#ć]ccK#AFV)eذR V+Z1S^cѢQ€=n|=FI!$tŠϔT:HE團+-y!tA/ Zo| Z8= Ŭ{J ?<}BlIOi ONbB@B:BBdzjbjY] WtV^$j4, )A:iTzY &vH!EXɴ41YJupAu׬^(PkY[Ur\uUrRhފ31~c '`+^[FHnStʮQ BDBsjA[\(@eEJ' 7B(Wdz^%V%ov!`{ |@eKbרACuo]cRSN [Vٍ*~}6B)Pzk[Zq杔{R6(NV?e]wr]6!="R%FVR/"楨2i*}]E͢ *ꓶ"O $dz!JkvI_,) >rd2A! q92. +Mmrb1eBP eVUB-]Eu5Zc:AV0UBvI640rHKеupJjV.::Pz;wp&ޮ!pj?+1B j3Bc V'4' +I"K7L+S+[o_~Ao;+Yf_~HKKCvv64hݻw;?xbL>M76OGޞCld t }dNt/{֭¡#yY&:Sg.waP4T)AR9){VT)IW(?54fZ=0l0\pǢEծ]}иqc/hݺ5ك;;mlSu9/@AӏcG~IP&qaߞ0|P-X!CoB`Pvp~]nڵ8uڰaÜ":j(TV qqqn7r,Ñܹ Eg@_n|{cR58-Zzb/7WyKοv;yQd'Ə̙3}:IOWytk`"jW^raa&{GGE… ۯq@@- 9-3\|!VҰr1?=RSRq`~]~ZwhwWy]N1/k|~K1I\J[C:BE0te!e\V;jEBF .I]I&-_nQ@lX<"##1 }œqXr/ƌ !**'^_<Śc;|K#TmB&^ t4"#"?8m>FԭSװҨ{f0֫6oCXRES9B%ObRpk%PV@cNb/sh=3P"htxըuXSn]/`WPn=3A ]2r,wD}ߓ{MHb.*.S'`MJl19B C=C^t y{aպUزsTVVm6= ǏAߌ>=9zwK0\sm59x7++[?{k'7w#<<G F\tM-?Gp~<}m΢:B E^wq*1.ESvvnŋQ^=䡬 r:œ>% QXX-ۮ c])EBh wԽsBgЃp&=e5k#p˟ow^Sbj mسnsc s1BGвy#q^xW5ҩQ`86?&? &MEߣ6SֽhҸ v;JJJ]ӻo#&&77H!oˍ VqQkgVV sQ٣19$faRDil!!4tgcC sEut&rA$x3joqw}Ie_ ] ֨^+|knv٨(nk #$^)**„ tR= KicW_HAԈkD՞d9Pj-5P@|'r=*&Zhܸ1QfMdeeaԩ~)))[oUE9yq%v{ԗ;F<HMwEkw?b6TV 0`Xkk1R5য়~>}}AII ͛K)0ubbL/ѳ5Kп^{On qhug+9a)Pu9m&M`ɒ%۷/Ν#66l6}y4ƲФq, 8v6ߟ铧aѺek,za\z T=;EE8i$uL}hug+|yKtʆ}/:w铧9{=>2cgeGVG#kP?5'OÝw܉I'/]'O7^J7H!ԋ ϟG~~8α~öO{kGh?3 EE]˒ B4?7lY|q$&$MlF_OFo@Iݳ7 򑖑cr~o:u| l݃/6@LTVV:mZѯqI棢G DB'H߸c]/|~g֠,KyUH-p 6C;Nh٢%Ν?_Ō)i& =r .h۪ ?1zBߌ>6`Ǯ[>!N< D:A zC/;!n-jl\[ǒPpY'Qp~;ꀆ дISϷz>vJJ;jp Cx{ocFF\pb_oӪ :vݍNHLh/?gΠY[VA:PCڳvq9ɓf/Ǘ_{y_vwi.JZHGB,]mZAڵ;tEkr1?=RSRQT\()-A5ܾEҹ njo ر 9իWi1)F#QG4EauiҤ n&tcƌ!C\7gϞhР8'Q;apFσ="fR/aTh!Add$;%9u tL] 2o`&^ԔTL6J>bSc0~x<=n|Ϸiw4իWG-QZZAE-NfV0-g(Gp**jV+ KHHG\8>ؾq2sU>p#6 _V.1c DVL(j&1|2D;VW[m⡬ETVVR%''eÄg':[PXzwua㿐Sɇ r,ZD&l\[*pMUrمaȑxQV-E+fH\FDD8ni |_)8{'"!f.:BlNoex钳NIz-J?'T^HꘄEee%njtG-pk@Uh2U_dj`(mٳp*맓OSS#<614oF,B(@TMW?qrT87w?aÆʕ+WV^Zj!66˗/3<Ν;cÆ (//ǓO>~<)|aJKKQvmzv&j֌ xDn~uKn]ݮկ_3}fJ !l:t(&M71czj~7p ;~ç~ nZ͘7Y#tE|v&'iX[AYV)f4B=ݠzqq1<={2220q&O유QVV?^Em;'7^un4.+Ղ15O̞VA 5Z~GeLxQRR4׳}{(G $5Z]YUDrBj.c~8zGzHHH͛ѯ_?|HII{mڴΝ;cUo^GjJ*vrM%PбBfr)Fk+C&`,BjҤqqqطoV\CbƌS֬Y'OF=ТE 4-pL;3[,CܟݵV߽FJV=[xvY #,Rg~֢'MzϠb%3m}RgKvzT66uRj]J )Z{7 eU2+>Ԝ?aL!4ST7\A0yofC¥1)_kr]6OƫzLc[AR){֣vټUS]δy)@oLB=ZbMvmJ 8ziS- t-)"+ 6GRUg-6&QQ) V:.fs9xRQ0P=t\q*1NJzB"[tpIםݷ03YVprvQ܆ڝt}6~gY%r Ԡ`x)ϓ8Bx[fB)ݢ-}ˬwvjREBdR0I=g(F}>j|{BcF *{/aⳓ7L_F֍iUu+ma#_( `0*KHHG\8T r< }ttU;s6J qnPsPly)9.)Y!#"4.sQv-H;#rSC!ԡyBzngC";<>::iEZF:''`m[..YDFFG8|^_n5>߾hۺ-&eOt_3*q~9"[Zj'Pu?Q3''5m__Z:uQPXXz|ibj8 u=H6nވ+!Z8—D;ZȧU(Y`ט<>|>~ [´^ ]жu[ bֿ%%~:R̚?} }Hy~ NL#dA6UZ }fÙʿBLL ._{K΋VTT}v7?}>ځ[zDD8ni :u8iAŕH!$&GWĔٺǽ _+_:]:wAF1G^OꘄCee%nn|3v;JJKPZZs4 \?ȉ܊f18SfnPK͞3PV^Wh"|s*Q+:&}'0fr<=v5 ')f CDDO9=0ȩuJgYY\E[+lvʝe.'5z;,ԌQPCZAC-"b%!#$BְK|QgRs"wQRG ͐'"=Vb.QN.1^oaM;іX :B:"x[UpRP dq0sI٤Z4d#J2gzf5'igKX${N $!|r݇:o[ >T^ץ5/.j FMv9 Ԫi+(I.V|gb1'HAL 1]i"Vް5j~8zu硻 (6V(B"7P0j@% \2!n}z [fqs" "/^Bk؁ҲRDFFQ5ߺxw9DA1$Bh6w-z3"O?رk^X8_։ RSN1Hwn߮&"6 7E 7ѭow~q''^DŽ_P}}`զti !0H7iv;{x76йC,[z6n@b֩?xk{G~TrZnj ˗1w9ݻwǦMF7/ŶO^ݺA}_1Ҳ2|GxvTa˞g/ !!-Hv ;!w&|۽"̽fWxcXr4 \={s͑R`(Atr1?=RSRQRZ{ҹ &<9ߟ0szؕͪuqxp/]r^߰q21~63cO B}pq|n˳u?Ǵ !JZ薁~3% RSR1i$5/-+ƠWm9#u״Tl޺w;{m~h?3 EEn=7ybC(,*r~ԿOn5kp 8aBh2U^ݺ~|v뮟qzW`=@j&uJPXT"k`5( ժU:_))oo _fVѺCko_~(++ӥ; A{G"ŹC%,:*mrJ4jT}W^Za}T맩]'%cc:辣HHSy&,BLQyEUS1cLv! EpZ5BC+zg^={av}=:rlވo»+oA\%vr;QzAAs$YX.6l܀B6!2g]"o@au5ZϮ=7?9zQfM䡬 p > >zu":* l™_qֈeM nDn8P)xn9\'8ғ2p8'o8r rdϷa;թS_^ =v ;!w&|o9P|y3wtRQjpuDP0={E/"22Z/HuCEe4nݎTT/#5%مzk[U=%}xK3^nVWhrA!+4I ^;wLիsѫG/6Lʞ< [ >1kԊn70] 33ݻv^S徃{ hZq(o 7n >S8aAg#UKPo!uLnЈqbal`!8R-XW-)xR~K?An DR)E#^]f/ۍPB!q?ŕhJL iUi`1B"ufP|1`q})JinQ !$ClپzQQIBґ"H!j ,݁JEQNP)C :C`!5S]oaox~C907s uQTF[bw9ʊ8 ebI(ClAwyxjL6$}o7S* 7\؍wJ7V^F I`,0v8kW/G|r.^T%0ncZ?#Ur3 *}ٟϢft ƍ_5HIGHW(cǏ1c99kkݡ5ׯJlb3X9ǘ ԌWǪ\Sکv/񊎐xairv~<#Ĺa<:|0/_GR$$8(o͆ań_P}axٳ;Ty+ŗ5n(" :BS#wf`ZJ*6o݌g[qo6;$w/GZF:Ə} 6 /k ^*ݟuKs^B~A cC|r;4^5-? X6ќonH(tB) sCaQۋA^¦-p3r;ɝ}~",uoY)c zKH?Zπ()+AZا)HLtT4cڕhtc#Ԩ^w`c3lŰ ժ]**? k]k` ֌ Ee`˶-l𙡜*ER0끟oBݩX~ Kzb|{PRZn \K5 tQmY6j zΚQRl6 Nx Gdᡬx/x=56>e @aa!`պUxx@<5ڐJ 3`xEGCaWYDjuyI׽ LIcFCĎnkEBF .I]I&a`'mȠ/`ѰҚ2~]۝/UVV /RҜg̛~O:_"f>;zCC׻+aˆ0`8rx?I$A9ej'vPt'sޅ3^yfBbb2%3;wnEQ\w[jTc~:>͆lx+ի٣пw&Nx ?luWcC QHYt+_)t0w @g\a8ڴ6l?3{͚6 \pϷa;թSGץGs52l'NĤiQ|5koG\]hFBNI81TTVF7э!;}ZBHEDJP63f@-0{lv̘L._(DGGsxW0}tʕ+ٳ'-Z 4ov/_ƕ+WKHH͛ѯ_?|n㓞%*-˙41GoaA0m 7ߌR_Fdd$"##͛W^DiӦ*_j%K &&RRRdt+laӧʕ+1tP̘1u5k|cLL9pF E==n2U 7O# P i>ʭpE{ax \̣П >Cq&a0+@v_1==Y^h>T}&=X Ә$ieRUT踌S+&]!ϡO]RZ8aOG3~-B\1@u8#+U q f #Z 0͗_SB4kZMTŮ vI v6weՐ'B]F1E "AG`G lP޿'S !of˾smgENHY)B!TMR !pAE"H$BH&D2u8'H(B1$V'!U!!BY@ f G!YA -jnzL!BC!B(C !)rABZV )B!R !\pB!!bU?rPm&'IENDB`ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptQ/home/sfierens/workspace/ai4r/site/src/documentation/resources/images/europe2.pngw/xsrnet.sf.ehcache.ElementlyP{VJ creationTimeJhitCountJlastAccessTimeJnextToLastAccessTimeJversionLkeytLjava/lang/Object;Lvalueq~xpP`P`P`˹sr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xpy%srjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xp[tfilet[file:/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/machineLearning.xmltbG-file-file:/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/machineLearning.xmlsq~ `GtxslttNfile:/usr/local/forrest/main/webapp/resources/stylesheets/docv20-to-docv13.xsltUT-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/docv20-to-docv13.xslxtPK_G-file-file:/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/machineLearning.xml_T-xslt-file:/usr/local/forrest/main/webapp/resources/stylesheets/docv20-to-docv13.xslsr(org.apache.cocoon.caching.CachedResponseq6?J lastModifiedL contentTypeq~LexpirestLjava/lang/Long;[responset[B[validityObjectst-[Lorg/apache/excalibur/source/SourceValidity;xpP`ȸppur[BTxpCXMLdocument header title0Machine Learning with ID3 Decision Trees in Ruby  body idCDATA mach-introsection Introduction to ID3 algorithm p  This is an implementation of the ID3 algorithm (Quinlan). Given a set of preclassified examples, it builds a top-down induction of decision tree, biased by the information gain and entropy measure.    n The good thing about this learning method is that humans learns as well. Unlike other ai techniques like nueral networks, this class can generate ruby code with if / else sentences. You can use this to evaluate parameters on realtime, copy paste them in a code, or just read them to learn about your problem domain.     mach-HowTo BMarketing target strategy example using ID3 Decision Trees in Ruby  Let's suppose that you are writtng an application that must identify people as relevant marketing targets or not. The only information that you have es collection of examples:  $http://www.w3.org/XML/1998/namespacespace xml:spacepreservesource= DATA_LABELS = [ 'city', 'age_range', 'gender', 'marketing_target' ] DATA_SET = [ ['New York', '<30', 'M', 'Y'], ['Chicago', '<30', 'M', 'Y'], ['Chicago', '<30', 'F', 'Y'], ['New York', '<30', 'M', 'Y'], ['New York', '<30', 'M', 'Y'], ['Chicago', '[30-50)', 'M', 'Y'], ['New York', '[30-50)', 'F', 'N'], ['Chicago', '[30-50)', 'F', 'Y'], ['New York', '[30-50)', 'F', 'N'], ['Chicago', '[50-80]', 'M', 'N'], ['New York', '[50-80]', 'F', 'N'], ['New York', '[50-80]', 'M', 'N'], ['Chicago', '[50-80]', 'M', 'N'], ['New York', '[50-80]', 'F', 'N'], ['Chicago', '>80', 'F', 'Y'] ]   @You can create an ID3 Decision tree to do the dirty job for you:   : id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)   wThe Decision tree will automatically create the "rules" to parse new data, and identify new posible marketing targets:    id3.to_s # => if age_range=='<30' then marketing_target='Y' elsif age_range=='[30-50)' and city=='Chicago' then marketing_target='Y' elsif age_range=='[30-50)' and city=='New York' then marketing_target='N' elsif age_range=='[50-80]' then marketing_target='N' elsif age_range=='>80' then marketing_target='Y' else raise 'There was not enough information during training to do a proper induction for this data element' end id3.eval(['New York', '<30', 'M']) # => 'Y'    mach-dataload Better data loading   In the real life you will use lot more data training examples, with more attributes. Consider moving your data to an external CSV (comma separate values) file.     data_set = [] CSV::Reader.parse(File.open("#{File.dirname(__FILE__)}/data_set.csv", 'r')) do |row| data_set << row end data_labels = data_set.shift id3 = DecisionTree::ID3.new(data_set, data_labels)    mach-eval A good tip for data evaluation  : The ID3 class provides a method to evaluate new data.    3 id3.eval(['New York', '<30', 'M']) # => 'Y'    But instead of going through the tree every time, you can take advantage of the fact that the method "to_s" generates proper ruby code!     id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS) age_range = '<30' city = 'New York' gender = 'M' marketing_target = nil eval id3.to_s puts marketing_target # => 'Y'    mach-more !More about ID3 and decision trees   href*http://en.wikipedia.org/wiki/Decision_treelink#Wikipedia article on Decision trees *http://en.wikipedia.org/wiki/ID3_algorithm"Wikipedia article on ID3 Algorithm     ur-[Lorg.apache.excalibur.source.SourceValidity;l|e0xpsr?org.apache.excalibur.source.impl.validity.FileTimeStampValidity ǹJ m_timeStampLm_filetLjava/io/File;xpAsr java.io.File-E Lpathq~xptV/home/sfierens/workspace/ai4r/site/src/documentation/content/xdocs/machineLearning.xmlw/xsrsr*org.apache.cocoon.caching.PipelineCacheKey;KJћIhashCodeLkeystLjava/util/List;LtoStringtLjava/lang/String;xpspsrjava.util.ArrayListxaIsizexpwsr+org.apache.cocoon.caching.ComponentCacheKey*cZ cachePointIhashCodeItypeL identifierq~LkeytLjava/io/Serializable;LtoStringq~xpqtfilet