comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/genetics/OnePointCrossover.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> package org.apache.commons.math.genetics;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.util.ArrayList;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.util.List;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> <a name="line.22"></a>
26 <FONT color="green">023</FONT> /**<a name="line.23"></a>
27 <FONT color="green">024</FONT> * One point crossover policy. A random crossover point is selected and the<a name="line.24"></a>
28 <FONT color="green">025</FONT> * first part from each parent is copied to the corresponding child, and the<a name="line.25"></a>
29 <FONT color="green">026</FONT> * second parts are copied crosswise.<a name="line.26"></a>
30 <FONT color="green">027</FONT> *<a name="line.27"></a>
31 <FONT color="green">028</FONT> * Example:<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;pre&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * -C- denotes a crossover point<a name="line.30"></a>
34 <FONT color="green">031</FONT> * -C- -C-<a name="line.31"></a>
35 <FONT color="green">032</FONT> * p1 = (1 0 1 0 0 1 | 0 1 1) X p2 = (0 1 1 0 1 0 | 1 1 1)<a name="line.32"></a>
36 <FONT color="green">033</FONT> * \------------/ \-----/ \------------/ \-----/<a name="line.33"></a>
37 <FONT color="green">034</FONT> * || (*) || (**)<a name="line.34"></a>
38 <FONT color="green">035</FONT> * VV (**) VV (*)<a name="line.35"></a>
39 <FONT color="green">036</FONT> * /------------\ /-----\ /------------\ /-----\<a name="line.36"></a>
40 <FONT color="green">037</FONT> * c1 = (1 0 1 0 0 1 | 1 1 1) X p2 = (0 1 1 0 1 0 | 0 1 1)<a name="line.37"></a>
41 <FONT color="green">038</FONT> * &lt;/pre&gt;<a name="line.38"></a>
42 <FONT color="green">039</FONT> *<a name="line.39"></a>
43 <FONT color="green">040</FONT> * This policy works only on {@link AbstractListChromosome}, and therefore it<a name="line.40"></a>
44 <FONT color="green">041</FONT> * is parametrized by T. Moreover, the chromosomes must have same lengths.<a name="line.41"></a>
45 <FONT color="green">042</FONT> *<a name="line.42"></a>
46 <FONT color="green">043</FONT> * @param &lt;T&gt; generic type of the {@link AbstractListChromosome}s for crossover<a name="line.43"></a>
47 <FONT color="green">044</FONT> * @since 2.0<a name="line.44"></a>
48 <FONT color="green">045</FONT> * @version $Revision: 903046 $ $Date: 2010-01-25 21:07:26 -0500 (Mon, 25 Jan 2010) $<a name="line.45"></a>
49 <FONT color="green">046</FONT> *<a name="line.46"></a>
50 <FONT color="green">047</FONT> */<a name="line.47"></a>
51 <FONT color="green">048</FONT> public class OnePointCrossover&lt;T&gt; implements CrossoverPolicy {<a name="line.48"></a>
52 <FONT color="green">049</FONT> <a name="line.49"></a>
53 <FONT color="green">050</FONT> /**<a name="line.50"></a>
54 <FONT color="green">051</FONT> * Performs one point crossover. A random crossover point is selected and the<a name="line.51"></a>
55 <FONT color="green">052</FONT> * first part from each parent is copied to the corresponding child, and the<a name="line.52"></a>
56 <FONT color="green">053</FONT> * second parts are copied crosswise.<a name="line.53"></a>
57 <FONT color="green">054</FONT> *<a name="line.54"></a>
58 <FONT color="green">055</FONT> * Example:<a name="line.55"></a>
59 <FONT color="green">056</FONT> * -C- denotes a crossover point<a name="line.56"></a>
60 <FONT color="green">057</FONT> * -C- -C-<a name="line.57"></a>
61 <FONT color="green">058</FONT> * p1 = (1 0 1 0 0 1 | 0 1 1) X p2 = (0 1 1 0 1 0 | 1 1 1)<a name="line.58"></a>
62 <FONT color="green">059</FONT> * \------------/ \-----/ \------------/ \-----/<a name="line.59"></a>
63 <FONT color="green">060</FONT> * || (*) || (**)<a name="line.60"></a>
64 <FONT color="green">061</FONT> * VV (**) VV (*)<a name="line.61"></a>
65 <FONT color="green">062</FONT> * /------------\ /-----\ /------------\ /-----\<a name="line.62"></a>
66 <FONT color="green">063</FONT> * c1 = (1 0 1 0 0 1 | 1 1 1) X p2 = (0 1 1 0 1 0 | 0 1 1)<a name="line.63"></a>
67 <FONT color="green">064</FONT> *<a name="line.64"></a>
68 <FONT color="green">065</FONT> * @param first first parent (p1)<a name="line.65"></a>
69 <FONT color="green">066</FONT> * @param second second parent (p2)<a name="line.66"></a>
70 <FONT color="green">067</FONT> * @return pair of two children (c1,c2)<a name="line.67"></a>
71 <FONT color="green">068</FONT> */<a name="line.68"></a>
72 <FONT color="green">069</FONT> @SuppressWarnings("unchecked") // OK because of instanceof checks<a name="line.69"></a>
73 <FONT color="green">070</FONT> public ChromosomePair crossover(Chromosome first, Chromosome second) {<a name="line.70"></a>
74 <FONT color="green">071</FONT> if (! (first instanceof AbstractListChromosome&lt;?&gt; &amp;&amp; second instanceof AbstractListChromosome&lt;?&gt;)) {<a name="line.71"></a>
75 <FONT color="green">072</FONT> throw new IllegalArgumentException("One point crossover works on FixedLengthChromosomes only.");<a name="line.72"></a>
76 <FONT color="green">073</FONT> }<a name="line.73"></a>
77 <FONT color="green">074</FONT> return crossover((AbstractListChromosome&lt;T&gt;) first, (AbstractListChromosome&lt;T&gt;) second);<a name="line.74"></a>
78 <FONT color="green">075</FONT> }<a name="line.75"></a>
79 <FONT color="green">076</FONT> <a name="line.76"></a>
80 <FONT color="green">077</FONT> <a name="line.77"></a>
81 <FONT color="green">078</FONT> /**<a name="line.78"></a>
82 <FONT color="green">079</FONT> * Helper for {@link #crossover(Chromosome, Chromosome)}. Performs the actual crossover.<a name="line.79"></a>
83 <FONT color="green">080</FONT> *<a name="line.80"></a>
84 <FONT color="green">081</FONT> * @param first the first chromosome.<a name="line.81"></a>
85 <FONT color="green">082</FONT> * @param second the second chromosome.<a name="line.82"></a>
86 <FONT color="green">083</FONT> * @return the pair of new chromosomes that resulted from the crossover.<a name="line.83"></a>
87 <FONT color="green">084</FONT> */<a name="line.84"></a>
88 <FONT color="green">085</FONT> private ChromosomePair crossover(AbstractListChromosome&lt;T&gt; first, AbstractListChromosome&lt;T&gt; second) {<a name="line.85"></a>
89 <FONT color="green">086</FONT> int length = first.getLength();<a name="line.86"></a>
90 <FONT color="green">087</FONT> if (length != second.getLength())<a name="line.87"></a>
91 <FONT color="green">088</FONT> throw new IllegalArgumentException("Both chromosomes must have same lengths.");<a name="line.88"></a>
92 <FONT color="green">089</FONT> <a name="line.89"></a>
93 <FONT color="green">090</FONT> // array representations of the parents<a name="line.90"></a>
94 <FONT color="green">091</FONT> List&lt;T&gt; parent1Rep = first.getRepresentation();<a name="line.91"></a>
95 <FONT color="green">092</FONT> List&lt;T&gt; parent2Rep = second.getRepresentation();<a name="line.92"></a>
96 <FONT color="green">093</FONT> // and of the children<a name="line.93"></a>
97 <FONT color="green">094</FONT> ArrayList&lt;T&gt; child1Rep = new ArrayList&lt;T&gt; (first.getLength());<a name="line.94"></a>
98 <FONT color="green">095</FONT> ArrayList&lt;T&gt; child2Rep = new ArrayList&lt;T&gt; (second.getLength());<a name="line.95"></a>
99 <FONT color="green">096</FONT> <a name="line.96"></a>
100 <FONT color="green">097</FONT> // select a crossover point at random (0 and length makes no sense)<a name="line.97"></a>
101 <FONT color="green">098</FONT> int crossoverIndex = 1 + (GeneticAlgorithm.getRandomGenerator().nextInt(length-2));<a name="line.98"></a>
102 <FONT color="green">099</FONT> <a name="line.99"></a>
103 <FONT color="green">100</FONT> // copy the first part<a name="line.100"></a>
104 <FONT color="green">101</FONT> for (int i = 0; i &lt; crossoverIndex; i++) {<a name="line.101"></a>
105 <FONT color="green">102</FONT> child1Rep.add(parent1Rep.get(i));<a name="line.102"></a>
106 <FONT color="green">103</FONT> child2Rep.add(parent2Rep.get(i));<a name="line.103"></a>
107 <FONT color="green">104</FONT> }<a name="line.104"></a>
108 <FONT color="green">105</FONT> // and switch the second part<a name="line.105"></a>
109 <FONT color="green">106</FONT> for (int i = crossoverIndex; i &lt; length; i++) {<a name="line.106"></a>
110 <FONT color="green">107</FONT> child1Rep.add(parent2Rep.get(i));<a name="line.107"></a>
111 <FONT color="green">108</FONT> child2Rep.add(parent1Rep.get(i));<a name="line.108"></a>
112 <FONT color="green">109</FONT> }<a name="line.109"></a>
113 <FONT color="green">110</FONT> <a name="line.110"></a>
114 <FONT color="green">111</FONT> return new ChromosomePair(<a name="line.111"></a>
115 <FONT color="green">112</FONT> first.newFixedLengthChromosome(child1Rep),<a name="line.112"></a>
116 <FONT color="green">113</FONT> second.newFixedLengthChromosome(child2Rep)<a name="line.113"></a>
117 <FONT color="green">114</FONT> );<a name="line.114"></a>
118 <FONT color="green">115</FONT> }<a name="line.115"></a>
119 <FONT color="green">116</FONT> <a name="line.116"></a>
120 <FONT color="green">117</FONT> }<a name="line.117"></a>
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 </PRE>
182 </BODY>
183 </HTML>