@@ -177,6 +177,98 @@ mod population_tests {
177
177
) ;
178
178
}
179
179
180
+ #[ test]
181
+ fn unique_chromosome_indices ( ) {
182
+ let genotype = BinaryGenotype :: builder ( )
183
+ . with_genes_size ( 3 )
184
+ . with_genes_hashing ( true )
185
+ . build ( )
186
+ . unwrap ( ) ;
187
+
188
+ let mut population: Population < BinaryChromosome > =
189
+ build:: population_with_fitness_scores ( vec ! [
190
+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
191
+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
192
+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
193
+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
194
+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
195
+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
196
+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
197
+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
198
+ ( vec![ true , true , false ] , None ) ,
199
+ ( vec![ true , true , false ] , None ) ,
200
+ ] ) ;
201
+
202
+ population. chromosomes . iter_mut ( ) . for_each ( |chromosome| {
203
+ let genes_hash = genotype. calculate_genes_hash ( chromosome) ;
204
+ chromosome. set_genes_hash ( genes_hash) ;
205
+ } ) ;
206
+
207
+ assert_eq ! ( population. unique_chromosome_indices( ) , vec![ 0 , 2 , 3 , 6 , 8 ] ) ;
208
+ }
209
+
210
+ #[ test]
211
+ fn best_unique_chromosome_indices ( ) {
212
+ let genotype = BinaryGenotype :: builder ( )
213
+ . with_genes_size ( 3 )
214
+ . with_genes_hashing ( true )
215
+ . build ( )
216
+ . unwrap ( ) ;
217
+
218
+ let mut population: Population < BinaryChromosome > =
219
+ build:: population_with_fitness_scores ( vec ! [
220
+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
221
+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
222
+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
223
+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
224
+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
225
+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
226
+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
227
+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
228
+ ( vec![ true , true , false ] , None ) ,
229
+ ( vec![ true , true , false ] , None ) ,
230
+ ] ) ;
231
+
232
+ population. chromosomes . iter_mut ( ) . for_each ( |chromosome| {
233
+ let genes_hash = genotype. calculate_genes_hash ( chromosome) ;
234
+ chromosome. set_genes_hash ( genes_hash) ;
235
+ } ) ;
236
+
237
+ assert_eq ! (
238
+ population. best_unique_chromosome_indices( 2 , FitnessOrdering :: Maximize ) ,
239
+ vec![ 0 , 3 ]
240
+ ) ;
241
+ assert_eq ! (
242
+ population. best_unique_chromosome_indices( 1 , FitnessOrdering :: Maximize ) ,
243
+ vec![ 3 ]
244
+ ) ;
245
+ assert_eq ! (
246
+ population. best_unique_chromosome_indices( 0 , FitnessOrdering :: Maximize ) ,
247
+ vec![ ]
248
+ ) ;
249
+ assert_eq ! (
250
+ population. best_unique_chromosome_indices( 10 , FitnessOrdering :: Maximize ) ,
251
+ vec![ 0 , 2 , 3 , 6 ]
252
+ ) ;
253
+
254
+ assert_eq ! (
255
+ population. best_unique_chromosome_indices( 2 , FitnessOrdering :: Minimize ) ,
256
+ vec![ 2 , 6 ]
257
+ ) ;
258
+ assert_eq ! (
259
+ population. best_unique_chromosome_indices( 1 , FitnessOrdering :: Minimize ) ,
260
+ vec![ 2 ]
261
+ ) ;
262
+ assert_eq ! (
263
+ population. best_unique_chromosome_indices( 0 , FitnessOrdering :: Minimize ) ,
264
+ vec![ ]
265
+ ) ;
266
+ assert_eq ! (
267
+ population. best_unique_chromosome_indices( 10 , FitnessOrdering :: Minimize ) ,
268
+ vec![ 0 , 2 , 3 , 6 ]
269
+ ) ;
270
+ }
271
+
180
272
#[ test]
181
273
fn fitness_score_cardinality ( ) {
182
274
let population: Population < BinaryChromosome > = build:: population ( vec ! [
0 commit comments