comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/genetics/RandomKey.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.Arrays;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import java.util.Collections;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import java.util.Comparator;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import java.util.List;<a name="line.23"></a>
27 <FONT color="green">024</FONT> <a name="line.24"></a>
28 <FONT color="green">025</FONT> /**<a name="line.25"></a>
29 <FONT color="green">026</FONT> * &lt;p&gt;<a name="line.26"></a>
30 <FONT color="green">027</FONT> * Random Key chromosome is used for permutation representation. It is a vector<a name="line.27"></a>
31 <FONT color="green">028</FONT> * of a fixed length of real numbers in [0,1] interval. The index of the i-th<a name="line.28"></a>
32 <FONT color="green">029</FONT> * smallest value in the vector represents an i-th member of the permutation.<a name="line.29"></a>
33 <FONT color="green">030</FONT> * &lt;/p&gt;<a name="line.30"></a>
34 <FONT color="green">031</FONT> *<a name="line.31"></a>
35 <FONT color="green">032</FONT> * &lt;p&gt;<a name="line.32"></a>
36 <FONT color="green">033</FONT> * For example, the random key [0.2, 0.3, 0.8, 0.1] corresponds to the<a name="line.33"></a>
37 <FONT color="green">034</FONT> * permutation of indices (3,0,1,2). If the original (unpermuted) sequence would<a name="line.34"></a>
38 <FONT color="green">035</FONT> * be (a,b,c,d), this would mean the sequence (d,a,b,c).<a name="line.35"></a>
39 <FONT color="green">036</FONT> * &lt;/p&gt;<a name="line.36"></a>
40 <FONT color="green">037</FONT> *<a name="line.37"></a>
41 <FONT color="green">038</FONT> * &lt;p&gt;<a name="line.38"></a>
42 <FONT color="green">039</FONT> * With this representation, common operators like n-point crossover can be<a name="line.39"></a>
43 <FONT color="green">040</FONT> * used, because any such chromosome represents a valid permutation.<a name="line.40"></a>
44 <FONT color="green">041</FONT> * &lt;/p&gt;<a name="line.41"></a>
45 <FONT color="green">042</FONT> *<a name="line.42"></a>
46 <FONT color="green">043</FONT> * &lt;p&gt;<a name="line.43"></a>
47 <FONT color="green">044</FONT> * Since the chromosome (and thus its arrayRepresentation) is immutable, the<a name="line.44"></a>
48 <FONT color="green">045</FONT> * array representation is sorted only once in the constructor.<a name="line.45"></a>
49 <FONT color="green">046</FONT> * &lt;/p&gt;<a name="line.46"></a>
50 <FONT color="green">047</FONT> *<a name="line.47"></a>
51 <FONT color="green">048</FONT> * &lt;p&gt;<a name="line.48"></a>
52 <FONT color="green">049</FONT> * For details, see:<a name="line.49"></a>
53 <FONT color="green">050</FONT> * &lt;ul&gt;<a name="line.50"></a>
54 <FONT color="green">051</FONT> * &lt;li&gt;Bean, J.C.: Genetic algorithms and random keys for sequencing and<a name="line.51"></a>
55 <FONT color="green">052</FONT> * optimization. ORSA Journal on Computing 6 (1994) 154–160&lt;/li&gt;<a name="line.52"></a>
56 <FONT color="green">053</FONT> * &lt;li&gt;Rothlauf, F.: Representations for Genetic and Evolutionary Algorithms.<a name="line.53"></a>
57 <FONT color="green">054</FONT> * Volume 104 of Studies in Fuzziness and Soft Computing. Physica-Verlag,<a name="line.54"></a>
58 <FONT color="green">055</FONT> * Heidelberg (2002)&lt;/li&gt;<a name="line.55"></a>
59 <FONT color="green">056</FONT> * &lt;/ul&gt;<a name="line.56"></a>
60 <FONT color="green">057</FONT> * &lt;/p&gt;<a name="line.57"></a>
61 <FONT color="green">058</FONT> *<a name="line.58"></a>
62 <FONT color="green">059</FONT> * @param &lt;T&gt;<a name="line.59"></a>
63 <FONT color="green">060</FONT> * type of the permuted objects<a name="line.60"></a>
64 <FONT color="green">061</FONT> * @since 2.0<a name="line.61"></a>
65 <FONT color="green">062</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.62"></a>
66 <FONT color="green">063</FONT> */<a name="line.63"></a>
67 <FONT color="green">064</FONT> public abstract class RandomKey&lt;T&gt; extends AbstractListChromosome&lt;Double&gt; implements PermutationChromosome&lt;T&gt; {<a name="line.64"></a>
68 <FONT color="green">065</FONT> <a name="line.65"></a>
69 <FONT color="green">066</FONT> /**<a name="line.66"></a>
70 <FONT color="green">067</FONT> * Cache of sorted representation (unmodifiable).<a name="line.67"></a>
71 <FONT color="green">068</FONT> */<a name="line.68"></a>
72 <FONT color="green">069</FONT> private final List&lt;Double&gt; sortedRepresentation;<a name="line.69"></a>
73 <FONT color="green">070</FONT> <a name="line.70"></a>
74 <FONT color="green">071</FONT> /**<a name="line.71"></a>
75 <FONT color="green">072</FONT> * Base sequence [0,1,...,n-1], permuted accorting to the representation (unmodifiable).<a name="line.72"></a>
76 <FONT color="green">073</FONT> */<a name="line.73"></a>
77 <FONT color="green">074</FONT> private final List&lt;Integer&gt; baseSeqPermutation;<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> * Constructor.<a name="line.77"></a>
81 <FONT color="green">078</FONT> *<a name="line.78"></a>
82 <FONT color="green">079</FONT> * @param representation list of [0,1] values representing the permutation<a name="line.79"></a>
83 <FONT color="green">080</FONT> */<a name="line.80"></a>
84 <FONT color="green">081</FONT> public RandomKey(List&lt;Double&gt; representation) {<a name="line.81"></a>
85 <FONT color="green">082</FONT> super(representation);<a name="line.82"></a>
86 <FONT color="green">083</FONT> // store the sorted representation<a name="line.83"></a>
87 <FONT color="green">084</FONT> List&lt;Double&gt; sortedRepr = new ArrayList&lt;Double&gt; (getRepresentation());<a name="line.84"></a>
88 <FONT color="green">085</FONT> Collections.sort(sortedRepr);<a name="line.85"></a>
89 <FONT color="green">086</FONT> sortedRepresentation = Collections.unmodifiableList(sortedRepr);<a name="line.86"></a>
90 <FONT color="green">087</FONT> // store the permutation of [0,1,...,n-1] list for toString() and isSame() methods<a name="line.87"></a>
91 <FONT color="green">088</FONT> baseSeqPermutation = Collections.unmodifiableList(<a name="line.88"></a>
92 <FONT color="green">089</FONT> decodeGeneric(baseSequence(getLength()), getRepresentation(), sortedRepresentation)<a name="line.89"></a>
93 <FONT color="green">090</FONT> );<a name="line.90"></a>
94 <FONT color="green">091</FONT> }<a name="line.91"></a>
95 <FONT color="green">092</FONT> <a name="line.92"></a>
96 <FONT color="green">093</FONT> /**<a name="line.93"></a>
97 <FONT color="green">094</FONT> * Constructor.<a name="line.94"></a>
98 <FONT color="green">095</FONT> *<a name="line.95"></a>
99 <FONT color="green">096</FONT> * @param representation array of [0,1] values representing the permutation<a name="line.96"></a>
100 <FONT color="green">097</FONT> */<a name="line.97"></a>
101 <FONT color="green">098</FONT> public RandomKey(Double[] representation) {<a name="line.98"></a>
102 <FONT color="green">099</FONT> this(Arrays.asList(representation));<a name="line.99"></a>
103 <FONT color="green">100</FONT> }<a name="line.100"></a>
104 <FONT color="green">101</FONT> <a name="line.101"></a>
105 <FONT color="green">102</FONT> /**<a name="line.102"></a>
106 <FONT color="green">103</FONT> * {@inheritDoc}<a name="line.103"></a>
107 <FONT color="green">104</FONT> */<a name="line.104"></a>
108 <FONT color="green">105</FONT> public List&lt;T&gt; decode(List&lt;T&gt; sequence) {<a name="line.105"></a>
109 <FONT color="green">106</FONT> return decodeGeneric(sequence, getRepresentation(), sortedRepresentation);<a name="line.106"></a>
110 <FONT color="green">107</FONT> }<a name="line.107"></a>
111 <FONT color="green">108</FONT> <a name="line.108"></a>
112 <FONT color="green">109</FONT> /**<a name="line.109"></a>
113 <FONT color="green">110</FONT> * Decodes a permutation represented by &lt;code&gt;representation&lt;/code&gt; and<a name="line.110"></a>
114 <FONT color="green">111</FONT> * returns a (generic) list with the permuted values.<a name="line.111"></a>
115 <FONT color="green">112</FONT> *<a name="line.112"></a>
116 <FONT color="green">113</FONT> * @param &lt;S&gt; generic type of the sequence values<a name="line.113"></a>
117 <FONT color="green">114</FONT> * @param sequence the unpermuted sequence<a name="line.114"></a>
118 <FONT color="green">115</FONT> * @param representation representation of the permutation ([0,1] vector)<a name="line.115"></a>
119 <FONT color="green">116</FONT> * @param sortedRepr sorted &lt;code&gt;representation&lt;/code&gt;<a name="line.116"></a>
120 <FONT color="green">117</FONT> * @return list with the sequence values permuted according to the representation<a name="line.117"></a>
121 <FONT color="green">118</FONT> */<a name="line.118"></a>
122 <FONT color="green">119</FONT> private static &lt;S&gt; List&lt;S&gt; decodeGeneric(List&lt;S&gt; sequence, List&lt;Double&gt; representation, List&lt;Double&gt; sortedRepr) {<a name="line.119"></a>
123 <FONT color="green">120</FONT> int l = sequence.size();<a name="line.120"></a>
124 <FONT color="green">121</FONT> <a name="line.121"></a>
125 <FONT color="green">122</FONT> if (representation.size() != l) {<a name="line.122"></a>
126 <FONT color="green">123</FONT> throw new IllegalArgumentException(String.format("Length of sequence for decoding (%s) has to be equal to the length of the RandomKey (%s)", l, representation.size()));<a name="line.123"></a>
127 <FONT color="green">124</FONT> }<a name="line.124"></a>
128 <FONT color="green">125</FONT> if (representation.size() != sortedRepr.size()) {<a name="line.125"></a>
129 <FONT color="green">126</FONT> throw new IllegalArgumentException(String.format("Representation and sortedRepr must have same sizes, %d != %d", representation.size(), sortedRepr.size()));<a name="line.126"></a>
130 <FONT color="green">127</FONT> }<a name="line.127"></a>
131 <FONT color="green">128</FONT> <a name="line.128"></a>
132 <FONT color="green">129</FONT> List&lt;Double&gt; reprCopy = new ArrayList&lt;Double&gt; (representation);// do not modify the orig. representation<a name="line.129"></a>
133 <FONT color="green">130</FONT> <a name="line.130"></a>
134 <FONT color="green">131</FONT> // now find the indices in the original repr and use them for permuting<a name="line.131"></a>
135 <FONT color="green">132</FONT> List&lt;S&gt; res = new ArrayList&lt;S&gt; (l);<a name="line.132"></a>
136 <FONT color="green">133</FONT> for (int i=0; i&lt;l; i++) {<a name="line.133"></a>
137 <FONT color="green">134</FONT> int index = reprCopy.indexOf(sortedRepr.get(i));<a name="line.134"></a>
138 <FONT color="green">135</FONT> res.add(sequence.get(index));<a name="line.135"></a>
139 <FONT color="green">136</FONT> reprCopy.set(index, null);<a name="line.136"></a>
140 <FONT color="green">137</FONT> }<a name="line.137"></a>
141 <FONT color="green">138</FONT> return res;<a name="line.138"></a>
142 <FONT color="green">139</FONT> }<a name="line.139"></a>
143 <FONT color="green">140</FONT> <a name="line.140"></a>
144 <FONT color="green">141</FONT> /**<a name="line.141"></a>
145 <FONT color="green">142</FONT> * Returns &lt;code&gt;true&lt;/code&gt; iff &lt;code&gt;another&lt;/code&gt; is a RandomKey and<a name="line.142"></a>
146 <FONT color="green">143</FONT> * encodes the same permutation.<a name="line.143"></a>
147 <FONT color="green">144</FONT> *<a name="line.144"></a>
148 <FONT color="green">145</FONT> * @param another chromosome to compare<a name="line.145"></a>
149 <FONT color="green">146</FONT> * @return true iff chromosomes encode the same permutation<a name="line.146"></a>
150 <FONT color="green">147</FONT> */<a name="line.147"></a>
151 <FONT color="green">148</FONT> @Override<a name="line.148"></a>
152 <FONT color="green">149</FONT> protected boolean isSame(Chromosome another) {<a name="line.149"></a>
153 <FONT color="green">150</FONT> // type check<a name="line.150"></a>
154 <FONT color="green">151</FONT> if (! (another instanceof RandomKey&lt;?&gt;))<a name="line.151"></a>
155 <FONT color="green">152</FONT> return false;<a name="line.152"></a>
156 <FONT color="green">153</FONT> RandomKey&lt;?&gt; anotherRk = (RandomKey&lt;?&gt;) another;<a name="line.153"></a>
157 <FONT color="green">154</FONT> // size check<a name="line.154"></a>
158 <FONT color="green">155</FONT> if (getLength() != anotherRk.getLength())<a name="line.155"></a>
159 <FONT color="green">156</FONT> return false;<a name="line.156"></a>
160 <FONT color="green">157</FONT> <a name="line.157"></a>
161 <FONT color="green">158</FONT> // two different representations can still encode the same permutation<a name="line.158"></a>
162 <FONT color="green">159</FONT> // the ordering is what counts<a name="line.159"></a>
163 <FONT color="green">160</FONT> List&lt;Integer&gt; thisPerm = this.baseSeqPermutation;<a name="line.160"></a>
164 <FONT color="green">161</FONT> List&lt;Integer&gt; anotherPerm = anotherRk.baseSeqPermutation;<a name="line.161"></a>
165 <FONT color="green">162</FONT> <a name="line.162"></a>
166 <FONT color="green">163</FONT> for (int i=0; i&lt;getLength(); i++) {<a name="line.163"></a>
167 <FONT color="green">164</FONT> if (thisPerm.get(i) != anotherPerm.get(i))<a name="line.164"></a>
168 <FONT color="green">165</FONT> return false;<a name="line.165"></a>
169 <FONT color="green">166</FONT> }<a name="line.166"></a>
170 <FONT color="green">167</FONT> // the permutations are the same<a name="line.167"></a>
171 <FONT color="green">168</FONT> return true;<a name="line.168"></a>
172 <FONT color="green">169</FONT> }<a name="line.169"></a>
173 <FONT color="green">170</FONT> <a name="line.170"></a>
174 <FONT color="green">171</FONT> /**<a name="line.171"></a>
175 <FONT color="green">172</FONT> * {@inheritDoc}<a name="line.172"></a>
176 <FONT color="green">173</FONT> */<a name="line.173"></a>
177 <FONT color="green">174</FONT> @Override<a name="line.174"></a>
178 <FONT color="green">175</FONT> protected void checkValidity(java.util.List&lt;Double&gt; chromosomeRepresentation) throws InvalidRepresentationException {<a name="line.175"></a>
179 <FONT color="green">176</FONT> for (double val : chromosomeRepresentation) {<a name="line.176"></a>
180 <FONT color="green">177</FONT> if (val &lt; 0 || val &gt; 1) {<a name="line.177"></a>
181 <FONT color="green">178</FONT> throw new InvalidRepresentationException("Values of representation must be in [0,1] interval");<a name="line.178"></a>
182 <FONT color="green">179</FONT> }<a name="line.179"></a>
183 <FONT color="green">180</FONT> }<a name="line.180"></a>
184 <FONT color="green">181</FONT> }<a name="line.181"></a>
185 <FONT color="green">182</FONT> <a name="line.182"></a>
186 <FONT color="green">183</FONT> <a name="line.183"></a>
187 <FONT color="green">184</FONT> /**<a name="line.184"></a>
188 <FONT color="green">185</FONT> * Generates a representation corresponding to a random permutation of<a name="line.185"></a>
189 <FONT color="green">186</FONT> * length l which can be passed to the RandomKey constructor.<a name="line.186"></a>
190 <FONT color="green">187</FONT> *<a name="line.187"></a>
191 <FONT color="green">188</FONT> * @param l<a name="line.188"></a>
192 <FONT color="green">189</FONT> * length of the permutation<a name="line.189"></a>
193 <FONT color="green">190</FONT> * @return representation of a random permutation<a name="line.190"></a>
194 <FONT color="green">191</FONT> */<a name="line.191"></a>
195 <FONT color="green">192</FONT> public static final List&lt;Double&gt; randomPermutation(int l) {<a name="line.192"></a>
196 <FONT color="green">193</FONT> List&lt;Double&gt; repr = new ArrayList&lt;Double&gt;(l);<a name="line.193"></a>
197 <FONT color="green">194</FONT> for (int i=0; i&lt;l; i++) {<a name="line.194"></a>
198 <FONT color="green">195</FONT> repr.add(GeneticAlgorithm.getRandomGenerator().nextDouble());<a name="line.195"></a>
199 <FONT color="green">196</FONT> }<a name="line.196"></a>
200 <FONT color="green">197</FONT> return repr;<a name="line.197"></a>
201 <FONT color="green">198</FONT> }<a name="line.198"></a>
202 <FONT color="green">199</FONT> <a name="line.199"></a>
203 <FONT color="green">200</FONT> /**<a name="line.200"></a>
204 <FONT color="green">201</FONT> * Generates a representation corresponding to an identity permutation of<a name="line.201"></a>
205 <FONT color="green">202</FONT> * length l which can be passed to the RandomKey constructor.<a name="line.202"></a>
206 <FONT color="green">203</FONT> *<a name="line.203"></a>
207 <FONT color="green">204</FONT> * @param l<a name="line.204"></a>
208 <FONT color="green">205</FONT> * length of the permutation<a name="line.205"></a>
209 <FONT color="green">206</FONT> * @return representation of an identity permutation<a name="line.206"></a>
210 <FONT color="green">207</FONT> */<a name="line.207"></a>
211 <FONT color="green">208</FONT> public static final List&lt;Double&gt; identityPermutation(int l) {<a name="line.208"></a>
212 <FONT color="green">209</FONT> List&lt;Double&gt; repr = new ArrayList&lt;Double&gt;(l);<a name="line.209"></a>
213 <FONT color="green">210</FONT> for (int i=0; i&lt;l; i++) {<a name="line.210"></a>
214 <FONT color="green">211</FONT> repr.add((double)i/l);<a name="line.211"></a>
215 <FONT color="green">212</FONT> }<a name="line.212"></a>
216 <FONT color="green">213</FONT> return repr;<a name="line.213"></a>
217 <FONT color="green">214</FONT> }<a name="line.214"></a>
218 <FONT color="green">215</FONT> <a name="line.215"></a>
219 <FONT color="green">216</FONT> /**<a name="line.216"></a>
220 <FONT color="green">217</FONT> * Generates a representation of a permutation corresponding to the<a name="line.217"></a>
221 <FONT color="green">218</FONT> * &lt;code&gt;data&lt;/code&gt; sorted by &lt;code&gt;comparator&lt;/code&gt;. The<a name="line.218"></a>
222 <FONT color="green">219</FONT> * &lt;code&gt;data&lt;/code&gt; is not modified during the process.<a name="line.219"></a>
223 <FONT color="green">220</FONT> *<a name="line.220"></a>
224 <FONT color="green">221</FONT> * This is useful if you want to inject some permutations to the initial<a name="line.221"></a>
225 <FONT color="green">222</FONT> * population.<a name="line.222"></a>
226 <FONT color="green">223</FONT> *<a name="line.223"></a>
227 <FONT color="green">224</FONT> * @param &lt;S&gt; type of the data<a name="line.224"></a>
228 <FONT color="green">225</FONT> * @param data list of data determining the order<a name="line.225"></a>
229 <FONT color="green">226</FONT> * @param comparator how the data will be compared<a name="line.226"></a>
230 <FONT color="green">227</FONT> * @return list representation of the permutation corresponding to the parameters<a name="line.227"></a>
231 <FONT color="green">228</FONT> */<a name="line.228"></a>
232 <FONT color="green">229</FONT> public static &lt;S&gt; List&lt;Double&gt; comparatorPermutation(List&lt;S&gt; data, Comparator&lt;S&gt; comparator) {<a name="line.229"></a>
233 <FONT color="green">230</FONT> List&lt;S&gt; sortedData = new ArrayList&lt;S&gt; (data);<a name="line.230"></a>
234 <FONT color="green">231</FONT> Collections.sort(sortedData, comparator);<a name="line.231"></a>
235 <FONT color="green">232</FONT> <a name="line.232"></a>
236 <FONT color="green">233</FONT> return inducedPermutation(data, sortedData);<a name="line.233"></a>
237 <FONT color="green">234</FONT> }<a name="line.234"></a>
238 <FONT color="green">235</FONT> <a name="line.235"></a>
239 <FONT color="green">236</FONT> /**<a name="line.236"></a>
240 <FONT color="green">237</FONT> * Generates a representation of a permutation corresponding to a<a name="line.237"></a>
241 <FONT color="green">238</FONT> * permutation which yields &lt;code&gt;permutedData&lt;/code&gt; when applied to<a name="line.238"></a>
242 <FONT color="green">239</FONT> * &lt;code&gt;originalData&lt;/code&gt;.<a name="line.239"></a>
243 <FONT color="green">240</FONT> *<a name="line.240"></a>
244 <FONT color="green">241</FONT> * This method can be viewed as an inverse to {@link #decode(List)}.<a name="line.241"></a>
245 <FONT color="green">242</FONT> *<a name="line.242"></a>
246 <FONT color="green">243</FONT> * @param &lt;S&gt; type of the data<a name="line.243"></a>
247 <FONT color="green">244</FONT> * @param originalData the original, unpermuted data<a name="line.244"></a>
248 <FONT color="green">245</FONT> * @param permutedData the data, somehow permuted<a name="line.245"></a>
249 <FONT color="green">246</FONT> * @return representation of a permutation corresponding to the permutation &lt;code&gt;originalData -&gt; permutedData&lt;/code&gt;<a name="line.246"></a>
250 <FONT color="green">247</FONT> * @throws IllegalArgumentException iff the &lt;code&gt;permutedData&lt;/code&gt; and &lt;code&gt;originalData&lt;/code&gt; contains different data<a name="line.247"></a>
251 <FONT color="green">248</FONT> */<a name="line.248"></a>
252 <FONT color="green">249</FONT> public static &lt;S&gt; List&lt;Double&gt; inducedPermutation(List&lt;S&gt; originalData, List&lt;S&gt; permutedData) throws IllegalArgumentException {<a name="line.249"></a>
253 <FONT color="green">250</FONT> if (originalData.size() != permutedData.size()) {<a name="line.250"></a>
254 <FONT color="green">251</FONT> throw new IllegalArgumentException("originalData and permutedData must have same length");<a name="line.251"></a>
255 <FONT color="green">252</FONT> }<a name="line.252"></a>
256 <FONT color="green">253</FONT> int l = originalData.size();<a name="line.253"></a>
257 <FONT color="green">254</FONT> <a name="line.254"></a>
258 <FONT color="green">255</FONT> List&lt;S&gt; origDataCopy = new ArrayList&lt;S&gt; (originalData);<a name="line.255"></a>
259 <FONT color="green">256</FONT> <a name="line.256"></a>
260 <FONT color="green">257</FONT> Double[] res = new Double[l];<a name="line.257"></a>
261 <FONT color="green">258</FONT> for (int i=0; i&lt;l; i++) {<a name="line.258"></a>
262 <FONT color="green">259</FONT> int index = origDataCopy.indexOf(permutedData.get(i));<a name="line.259"></a>
263 <FONT color="green">260</FONT> if (index == -1) {<a name="line.260"></a>
264 <FONT color="green">261</FONT> throw new IllegalArgumentException("originalData and permutedData must contain the same objects.");<a name="line.261"></a>
265 <FONT color="green">262</FONT> }<a name="line.262"></a>
266 <FONT color="green">263</FONT> res[index] = (double) i / l;<a name="line.263"></a>
267 <FONT color="green">264</FONT> origDataCopy.set(index, null);<a name="line.264"></a>
268 <FONT color="green">265</FONT> }<a name="line.265"></a>
269 <FONT color="green">266</FONT> return Arrays.asList(res);<a name="line.266"></a>
270 <FONT color="green">267</FONT> }<a name="line.267"></a>
271 <FONT color="green">268</FONT> <a name="line.268"></a>
272 <FONT color="green">269</FONT> /**<a name="line.269"></a>
273 <FONT color="green">270</FONT> * {@inheritDoc}<a name="line.270"></a>
274 <FONT color="green">271</FONT> */<a name="line.271"></a>
275 <FONT color="green">272</FONT> @Override<a name="line.272"></a>
276 <FONT color="green">273</FONT> public String toString() {<a name="line.273"></a>
277 <FONT color="green">274</FONT> return String.format("(f=%s pi=(%s))", getFitness(), baseSeqPermutation);<a name="line.274"></a>
278 <FONT color="green">275</FONT> }<a name="line.275"></a>
279 <FONT color="green">276</FONT> <a name="line.276"></a>
280 <FONT color="green">277</FONT> /**<a name="line.277"></a>
281 <FONT color="green">278</FONT> * Helper for constructor. Generates a list of natural numbers (0,1,...,l-1).<a name="line.278"></a>
282 <FONT color="green">279</FONT> *<a name="line.279"></a>
283 <FONT color="green">280</FONT> * @param l length of list to generate<a name="line.280"></a>
284 <FONT color="green">281</FONT> * @return list of integers from 0 to l-1<a name="line.281"></a>
285 <FONT color="green">282</FONT> */<a name="line.282"></a>
286 <FONT color="green">283</FONT> private static List&lt;Integer&gt; baseSequence(int l) {<a name="line.283"></a>
287 <FONT color="green">284</FONT> List&lt;Integer&gt; baseSequence = new ArrayList&lt;Integer&gt; (l);<a name="line.284"></a>
288 <FONT color="green">285</FONT> for (int i=0; i&lt;l; i++) {<a name="line.285"></a>
289 <FONT color="green">286</FONT> baseSequence.add(i);<a name="line.286"></a>
290 <FONT color="green">287</FONT> }<a name="line.287"></a>
291 <FONT color="green">288</FONT> return baseSequence;<a name="line.288"></a>
292 <FONT color="green">289</FONT> }<a name="line.289"></a>
293 <FONT color="green">290</FONT> }<a name="line.290"></a>
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354 </PRE>
355 </BODY>
356 </HTML>