1 10 package org.jgap.gp.impl; 11 12 import java.io.*; 13 import java.util.*; 14 import org.jgap.*; 15 import org.jgap.gp.*; 16 17 23 public class GPPopulation 24 implements Serializable, Comparable { 25 26 private final static String CVS_REVISION = "$Revision: 1.14 $"; 27 28 31 private IGPProgram[] m_programs; 32 33 private transient float[] m_fitnessRank; 34 35 private int m_popSize; 36 37 private transient IGPProgram m_fittestProgram; 38 39 private GPConfiguration m_config; 40 41 45 private boolean m_changed; 46 47 50 private boolean m_sorted; 51 52 private IGPProgram m_fittestToAdd; 53 54 60 public GPPopulation(GPConfiguration a_config, int a_size) 61 throws InvalidConfigurationException { 62 if (a_config == null) { 63 throw new InvalidConfigurationException("Configuration must not be null!"); 64 } 65 m_config = a_config; 66 m_programs = new GPProgram[a_size]; 67 m_popSize = a_size; 68 m_fitnessRank = new float[a_size]; 69 for (int i = 0; i < a_size; i++) { 70 m_fitnessRank[i] = 0.5f; 71 } 72 } 73 74 78 public GPPopulation(GPPopulation a_pop) 79 throws InvalidConfigurationException { 80 this(a_pop, false); 81 } 82 public GPPopulation(GPPopulation a_pop, boolean a_keepPrograms) 83 throws InvalidConfigurationException { 84 m_config = a_pop.getGPConfiguration(); 85 m_popSize = a_pop.getPopSize(); 86 m_programs = new GPProgram[m_popSize]; 87 m_fitnessRank = new float[m_popSize]; 88 if (a_keepPrograms) { 89 synchronized (m_programs) { 90 for (int i = 0; i < m_popSize; i++) { 91 m_programs[i] = a_pop.getGPProgram(i); 92 m_fitnessRank[i] = a_pop.getFitnessRank(i); 93 } 94 } 95 m_fittestProgram = a_pop.determineFittestProgramComputed(); 96 if (m_fittestProgram != null) { 97 m_fittestProgram = (IGPProgram) m_fittestProgram.clone(); 98 } 99 setChanged(a_pop.isChanged()); 100 if (!m_changed) { 101 m_sorted = true; 102 } 103 } 104 else { 105 for (int i = 0; i < m_popSize; i++) { 106 m_fitnessRank[i] = 0.5f; 107 } 108 } 109 } 110 111 122 public void sort(Comparator c) { 123 Arrays.sort(m_programs, c); 124 float f = 0; 125 for (int i = 0; i < m_programs.length; i++) { 126 m_fitnessRank[i] = f; 127 f += m_programs[i].getFitnessValue(); 128 } 129 } 130 131 155 public void create(Class [] a_types, Class [][] a_argTypes, 156 CommandGene[][] a_nodeSets, int[] a_minDepths, 157 int[] a_maxDepths, int a_maxNodes, 158 boolean[] a_fullModeAllowed) 159 throws InvalidConfigurationException { 160 int divisor; 161 if (m_popSize < 2) { 162 divisor = 1; 163 } 164 else { 165 divisor = m_popSize - 1; 166 } 167 for (int i = 0; i < m_popSize; i++) { 168 IGPProgram program = null; 169 int depth = 2 + (getGPConfiguration().getMaxInitDepth() - 1) * i 172 / divisor; 173 int tries = 0; 176 do { 177 try { 178 program = create(a_types, a_argTypes, a_nodeSets, 179 a_minDepths, 180 a_maxDepths, depth, (i % 2) == 0, 181 a_maxNodes, 182 a_fullModeAllowed); 183 if (i == 0) { 184 getGPConfiguration().setPrototypeProgram(program); 190 191 } 192 break; 193 } catch (IllegalStateException iex) { 194 tries++; 195 if (tries > getGPConfiguration().getProgramCreationMaxtries()) { 196 ICloneHandler cloner = getGPConfiguration().getJGAPFactory(). 197 getCloneHandlerFor( 198 getGPConfiguration().getPrototypeProgram(), null); 199 if (cloner != null) { 200 try { 201 program = (IGPProgram) cloner.perform( 202 getGPConfiguration().getPrototypeProgram(), null, null); 203 break; 204 } catch (Exception ex) { 205 ex.printStackTrace(); 206 throw new IllegalStateException (iex.getMessage()); 209 } 210 } 211 throw new IllegalStateException (iex.getMessage()); 212 } 213 } 214 } while (true); 215 setGPProgram(i, program); 216 } 217 setChanged(true); 218 } 219 220 246 public IGPProgram create(Class [] a_types, Class [][] a_argTypes, 247 CommandGene[][] a_nodeSets, int[] a_minDepths, 248 int[] a_maxDepths, 249 int a_depth, boolean a_grow, int a_maxNodes, 250 boolean[] a_fullModeAllowed) 251 throws InvalidConfigurationException { 252 GPProgram program; 253 if (m_fittestToAdd != null) { 256 ICloneHandler cloner = getGPConfiguration().getJGAPFactory(). 257 getCloneHandlerFor(m_fittestToAdd, null); 258 if (cloner == null) { 259 program = (GPProgram)m_fittestToAdd; 260 } 261 else { 262 try { 263 program = (GPProgram) cloner.perform(m_fittestToAdd, null, null); 264 } catch (Exception ex) { 265 ex.printStackTrace(); 266 program = (GPProgram)m_fittestToAdd; 267 } 268 } 269 m_fittestToAdd = null; 270 } 271 else { 272 program = new GPProgram(getGPConfiguration(), a_types, 275 a_argTypes, 276 a_nodeSets, a_minDepths, a_maxDepths, 277 a_maxNodes); 278 program.growOrFull(a_depth, a_grow, a_maxNodes, a_fullModeAllowed); 279 } 280 return program; 281 } 282 283 289 public int getPopSize() { 290 return m_popSize; 291 } 292 293 299 public GPConfiguration getGPConfiguration() { 300 return m_config; 301 } 302 303 314 public void setGPProgram(final int a_index, final IGPProgram a_program) { 315 synchronized (m_programs) { 316 m_programs[a_index] = a_program; 317 } 318 setChanged(true); 319 } 320 321 public IGPProgram getGPProgram(int a_index) { 322 return m_programs[a_index]; 323 } 324 325 public IGPProgram[] getGPPrograms() { 326 return m_programs; 327 } 328 329 public int size() { 330 return m_programs.length; 331 } 332 333 343 public IGPProgram determineFittestProgram() { 344 if (!m_changed && m_fittestProgram != null) { 345 return m_fittestProgram; 346 } 347 double bestFitness = -1.0d; 348 IGPFitnessEvaluator evaluator = getGPConfiguration().getGPFitnessEvaluator(); 349 double fitness; 350 for (int i = 0; i < m_programs.length && m_programs[i] != null; i++) { 351 IGPProgram program = m_programs[i]; 352 fitness = program.getFitnessValue(); 353 if (m_fittestProgram == null || evaluator.isFitter(fitness, bestFitness)) { 354 bestFitness = fitness; 355 m_fittestProgram = program; 356 } 357 } 358 setChanged(false); 359 if (m_fittestProgram != null) { 360 ICloneHandler cloner = getGPConfiguration().getJGAPFactory(). 361 getCloneHandlerFor( 362 m_fittestProgram, null); 363 if (cloner != null) { 364 try { 365 m_fittestProgram = (IGPProgram) cloner.perform(m_fittestProgram, null, null); 366 } catch (Exception ex) { 367 ; } 369 } 370 } 371 return m_fittestProgram; 372 } 373 374 383 public IGPProgram determineFittestProgramComputed() { 384 double bestFitness = -1.0d; 385 IGPFitnessEvaluator evaluator = getGPConfiguration().getGPFitnessEvaluator(); 386 double fitness; 387 IGPProgram fittest = null; 388 for (int i = 0; i < m_programs.length && m_programs[i] != null; i++) { 389 IGPProgram program = m_programs[i]; 390 if (program instanceof GPProgramBase) { 391 GPProgramBase program1 = (GPProgramBase) program; 392 fitness = program1.getFitnessValueDirectly(); 393 } 394 else { 395 fitness = program.getFitnessValue(); 396 } 397 if (Math.abs(fitness - FitnessFunction.NO_FITNESS_VALUE) > 398 FitnessFunction.DELTA) { 399 if (fittest == null || evaluator.isFitter(fitness, bestFitness)) { 400 fittest = program; 401 bestFitness = fitness; 402 } 403 } 404 } 405 return fittest; 406 } 407 408 420 public List determineFittestChromosomes(final int a_numberOfPrograms) { 421 int numberOfChromosomes = Math.min(a_numberOfPrograms, m_programs.length); 422 if (numberOfChromosomes <= 0) { 423 return null; 424 } 425 if (!m_changed && m_sorted) { 426 return Arrays.asList(m_programs).subList(0, numberOfChromosomes); 427 } 428 sortByFitness(); 430 return Arrays.asList(m_programs).subList(0, numberOfChromosomes); 432 } 433 434 441 public void sortByFitness() { 442 sort(new GPProgramFitnessComparator(getGPConfiguration(). 446 getGPFitnessEvaluator())); 447 setChanged(false); 448 setSorted(true); 449 m_fittestProgram = m_programs[0]; 450 } 451 452 public float[] getFitnessRanks() { 453 return m_fitnessRank; 454 } 455 456 public float getFitnessRank(int a_index) { 457 return m_fitnessRank[a_index]; 458 } 459 460 469 protected void setChanged(final boolean a_changed) { 470 m_changed = a_changed; 471 setSorted(false); 472 } 473 474 480 public boolean isChanged() { 481 return m_changed; 482 } 483 484 491 protected void setSorted(final boolean a_sorted) { 492 m_sorted = a_sorted; 493 } 494 495 508 public int compareTo(Object a_pop) { 509 GPPopulation other = (GPPopulation) a_pop; 510 if (a_pop == null) { 511 return 1; 512 } 513 int size1 = size(); 514 int size2 = other.size(); 515 if (size1 != size2) { 516 if (size1 < size2) { 517 return -1; 518 } 519 else { 520 return 1; 521 } 522 } 523 IGPProgram[] progs2 = other.getGPPrograms(); 524 for (int i = 0; i < size1; i++) { 525 if (!containedInArray(progs2, m_programs[i])) { 526 return 1; 527 } 528 } 529 return 0; 530 } 531 532 543 protected boolean containedInArray(IGPProgram[] a_progs, IGPProgram a_prog) { 544 for (int i = 0; i < a_progs.length; i++) { 545 if (a_progs[i] == null) { 546 return false; 547 } 548 if (a_progs[i].equals(a_prog)) { 549 return true; 550 } 551 } 552 return false; 553 } 554 555 564 public boolean equals(Object a_pop) { 565 try { 566 return compareTo(a_pop) == 0; 567 } catch (ClassCastException e) { 568 return false; 572 } 573 } 574 575 584 public void addFittestProgram(final IGPProgram a_toAdd) { 585 if (a_toAdd != null) { 586 m_fittestToAdd = a_toAdd; 587 } 588 } 589 } 590 | Popular Tags |