/* * This file is part of JGAP. * * JGAP offers a dual license model containing the LGPL as well as the MPL. * * For licensing information please see the file license.txt included with JGAP * or have a look at the top of class org.jgap.Chromosome which representatively * includes the JGAP license policy applicable for any file delivered with JGAP. */ package org.jgap.impl.job; import org.jgap.*; /** * Simple implementation of IPopulationSplitter. * * @author Klaus Meffert * @since 3.2 */ public class SimplePopulationSplitter implements IPopulationSplitter { /** String containing the CVS revision. Read out via reflection!*/ private final static String CVS_REVISION = "$Revision: 1.4 $"; private int m_count; /** * @param a_count number of chunks to create by splitting the population. * * @author Klaus Meffert * @since 3.2 */ public SimplePopulationSplitter(int a_count) { if (a_count < 1) { throw new IllegalArgumentException("Count must be greater than zero!"); } m_count = a_count; } /** * Splits a single population into smaller sub-populations. * * @param a_pop input population * @return resulting chunks * @throws Exception */ public Population[] split(Population a_pop) throws Exception { int popSize = a_pop.size(); int count = m_count; int chunkSize = popSize / count; if (chunkSize < 1) { chunkSize = 1; count = 1; } Population[] result = new Population[count]; int index = 0; for (int i = 0; i < count; i++) { Population chunk = new Population(a_pop.getConfiguration(), chunkSize); // Fill chunk with chromosomes. // ---------------------------- for (int j = 0; j < chunkSize; j++) { chunk.addChromosome(a_pop.getChromosome(index)); index++; } result[i] = chunk; popSize -= chunkSize; if (popSize < 1) { break; } // Care for the last chunk. // ------------------------ if (popSize < chunkSize) { chunkSize = popSize; } } return result; } }