UniformCrossover.java

/**
 * @(#)UniformCrossover.java
 * Copyright (C) 2008-2011 delhezi.com
 *
 * This class is released under the:
 * GNU Lesser General Public License (LGPL) version 3 or later.
 * http://www.gnu.org/copyleft/lesser.html
 */
package com.delhezi.ga.crossover.standard;

import com.delhezi.ga.Chromosome;
import java.util.Random;
import java.util.logging.Logger;

/**
 * <code>UniformCrossover</code>: Krzyżowanie równomierne
 * Uniform Crossover (UX).
 * @version 1.0 2009-06-10
 * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
 * Wojciech Wolszczak</a>
 */
public class UniformCrossover implements com.delhezi.ga.crossover.ICrossover {

    /** Logger object. */
    private static final Logger LOGGER =
        Logger.getLogger(UniformCrossover.class.getName());

    /** Delhezi Error Code. */
    //private static final String DERC = "1-1.3-6-";

    /** Class name. */
    private static final String CLASS_NAME = UniformCrossover.class.getName();

    /**
     * Random.
     */
    private static Random random = new Random();

    /**
     * Krzyżowanie.
     * @param chromosome1 Chromosom.
     * @param chromosome2 Chromosom.
     * @since 1.0
     */
    public final void crossover(Chromosome chromosome1,
                                Chromosome chromosome2) {
        LOGGER.entering(CLASS_NAME, "crossover",
                        new Object[] { chromosome1, chromosome2 });

        Object tmpCh;
        for (int i = 0; i < chromosome1.size(); i++) {
            boolean b = random.nextFloat() > 0.5;
            if (b) {
                tmpCh = chromosome1.getGene(i);
                chromosome1.setGene(i, chromosome2.getGene(i));
                chromosome2.setGene(i, tmpCh);
            }
        }
        LOGGER.exiting(CLASS_NAME, "crossover",
                       new Object[] { chromosome1, chromosome2 });
    }
}