MutationFactory.java

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

import com.delhezi.ga.exception.GeneticAlgorithmException;
import com.delhezi.ga.mutation.IMutation;
import com.delhezi.ga.mutation.InversionMutation;
import com.delhezi.ga.mutation.SwapMutation;
import com.delhezi.ga.mutation.heuristics.LinKernighan;
import com.delhezi.ga.mutation.heuristics._2Opt;
import com.delhezi.ga.mutation.heuristics._3Opt;

import java.util.logging.Level;
import java.util.logging.Logger;

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

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

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

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

    /**
     * Tworzy nowy obiekt operatora mutacji i zwraca referencję do niego.
     * @param mutationOperator Określa typ tworzonego obiektu
     * operatora mutacji.
     * @return Referencja do obiektu operatora mutacji.
     * @throws GeneticAlgorithmException DERC-1-6.1-1-1
     * @since 1.0
     */
    public static IMutation getMutationOperator(
                                 final MutationOperatorType mutationOperator)
    throws GeneticAlgorithmException {
    LOGGER.entering(CLASS_NAME, "getMutationOperator", mutationOperator);
    switch (mutationOperator) {
        case _2Opt:
            return new _2Opt();
        case _3Opt:
            return new _3Opt();
        case LinKernighan:
            return new LinKernighan();
        case InversionMutation:
            return new InversionMutation();
        case SwapMutation:
            return new SwapMutation();
        }

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

    /**
     * Zwraca typ operatora mutacji określony dla parametru.
     * @param mutationOperator Referencja do obiektu operatora mutacji.
     * @return Typ operatora mutacji.
     * @throws GeneticAlgorithmException DERC-1-6.1-1-2
     * @since 1.0
     */
    public static MutationOperatorType getMutationOperatorType(
                                             final IMutation mutationOperator)
  throws GeneticAlgorithmException {
        LOGGER.entering(CLASS_NAME, "getMutationOperatorType",
                        mutationOperator);

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

        if (pClassName.equals("com.delhezi.ga.mutation.heuristics._2Opt")) {
            return MutationOperatorType._2Opt;
        } else if (pClassName.equals("com.delhezi.ga.mutation.heuristics._3Opt")) {
            return MutationOperatorType._3Opt;
        } else if (pClassName.equals("com.delhezi.ga.mutation.heuristics.LinKernighan")) {
            return MutationOperatorType.LinKernighan;
        } else if (pClassName.equals("com.delhezi.ga.mutation.InversionMutation")) {
            return MutationOperatorType.InversionMutation;
        } else if (pClassName.equals("com.delhezi.ga.mutation.SwapMutation")) {
            return MutationOperatorType.SwapMutation;
        }

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