CrossoverFactory.java

/**
 * @(#)CrossoverFactory.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.factory;

import com.delhezi.ga.crossover.ICrossover;
import com.delhezi.ga.crossover.permutation.OrderCrossover;
import com.delhezi.ga.crossover.permutation.PartiallyMatchedCrossover;
import com.delhezi.ga.crossover.standard.KPointCrossover;
import com.delhezi.ga.crossover.standard.UniformCrossover;
import com.delhezi.ga.exception.GeneticAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Sparametryzowana metoda wytwórcza operatora krzyżowania.
 * @version 1.0 2009-06-10
 * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
 * Wojciech Wolszczak</a>
 */
public class CrossoverFactory {

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

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

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

    /**
     * Tworzy nowy obiekt operatora krzyżowania i zwraca referencję do niego.
     * @param crossoverOperator Określa typ tworzonego obiektu
     * operatora krzyżowania.
     * @return Referencja do obiektu operatora krzyżowania.
     * @throws GeneticAlgorithmException DERC-1-1.1-1-1
     * @since 1.0
     */
    public static ICrossover getCrossoverOperator(final CrossoverOperatorType crossoverOperator) throws GeneticAlgorithmException {
        LOGGER.entering(CLASS_NAME, "getCrossoverOperator", crossoverOperator);
        switch (crossoverOperator) {
        case OrderCrossover:
            return new OrderCrossover();
        case PartiallyMatchedCrossover:
            return new PartiallyMatchedCrossover();
        case KPointCrossover:
            return new KPointCrossover();
        case UniformCrossover:
            return new UniformCrossover();
        }

        GeneticAlgorithmException e =
            new GeneticAlgorithmException("DERC-" + DERC +
                                          "1: Parametr crossoverOperator=" +
                                          crossoverOperator +
                                          " is not recognized.");
        LOGGER.log(Level.WARNING, "CrossoverFactory", e);
        throw e;
    }

    /**
     * Zwraca typ operatora krzyżowania określony dla parametru.
     * @param crossoverOperator Referencja do obiektu operatora krzyżowania.
     * @return Typ operatora krzyżowania.
     * @throws GeneticAlgorithmException DERC-1-1.1-1-2
     * @since 1.0
     */
    public static CrossoverOperatorType getCrossoverOperatorType(final ICrossover crossoverOperator) throws GeneticAlgorithmException {
        LOGGER.entering(CLASS_NAME, "getCrossoverOperatorType",
                        crossoverOperator);

        String pClassName = crossoverOperator.getClass().getName();

        if (pClassName.equals("com.delhezi.ga.crossover.permutation.OrderCrossover")) {
            return CrossoverOperatorType.OrderCrossover;
        } else if (pClassName.equals("com.delhezi.ga.crossover.permutation.PartiallyMatchedCrossover")) {
            return CrossoverOperatorType.PartiallyMatchedCrossover;
        } else if (pClassName.equals("com.delhezi.ga.crossover.standard.KPointCrossover")) {
            return CrossoverOperatorType.KPointCrossover;
        } else if (pClassName.equals("com.delhezi.ga.crossover.standard.UniformCrossover")) {
            return CrossoverOperatorType.UniformCrossover;
        }

        GeneticAlgorithmException e =
            new GeneticAlgorithmException("DERC-" + DERC +
                                          "2: Parametr crossoverOperator=" +
                                          pClassName + " is not recognized.");
        LOGGER.log(Level.WARNING, "CrossoverFactory", e);
        throw e;
    }
}