    001package org.opengion.penguin.math;
    002
    003import java.util.ArrayList;
    004import java.util.List;
    005import org.apache.commons.math3.genetics.AbstractListChromosome;
    006import org.apache.commons.math3.genetics.InvalidRepresentationException;
    007
    008/**
    009 * HybsGeneticAlgorithmで利用するChromosomeインターフェースです。
    010 *
    011 * AbstractListChromosomeだと少し使いにくいので、AbstractListChromosomeを継承して
    012 * 独自にAbstractクラスを作成しています。
    013 * （大半はAbstractListChromosomeそのものです）
    014 *
    015 */
    016public abstract class AbstractHybsGAChromosome extends AbstractListChromosome<HybsGAObject> {
    017
    018        protected Object optionData; // 染色体に何らかのオプション情報を持たせる場合に利用
    019
    020        /**
    021     * デフォルトコンストラクタ。
    022     * 空の染色体配列を持つインスタンスを作成する。
    023         * newInstanceメソッドでインスタンスを作成するために、若干トリッキーな事をする。
    024         * このコンストラクタを利用する場合はcloneで染色体セットし、増殖させて利用する。
    025         * @throws InvalidRepresentationException
    026     */
    027        public AbstractHybsGAChromosome() throws InvalidRepresentationException {
    028                        super( new HybsGAObject[] {} );
    029        }
    030
    031        /**
    032         * @param representation 染色体表現
    033         * @throws InvalidRepresentationException
    034         */
    035        public AbstractHybsGAChromosome(final List<HybsGAObject> representation) throws InvalidRepresentationException {
    036        super(representation);
    037    }
    038
    039        /**
    040     * 初期化用のsetter
    041     * 通常、copyListにはtrueをセットして染色体表現のインスタンスを新たに作成する。
    042     *
    043         * @param chromosomeRepresentation 染色体表現
    044         * @param copyList newを利用してクローンするかどうか
    045         * @return クローン
    046     */
    047    public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation, final boolean copyList)  {
    048        checkValidity(chromosomeRepresentation);
    049        return newFixedLengthChromosome(copyList ? new ArrayList<HybsGAObject>(chromosomeRepresentation) : chromosomeRepresentation);
    050    }
    051
    052        /**
    053     * 初期化用のsetter
    054         * @param chromosomeRepresentation 染色体表現
    055         * @return クローン
    056         * @throws InvalidRepresentationException
    057     */
    058    public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation) throws InvalidRepresentationException {
    059        return clone( chromosomeRepresentation, true );
    060    }
    061
    062    /**
    063     * 自分と同じクラスを作成するメソッド
    064     * 各クラスで実装する。
    065     * 必要に応じてoptionDataをセットすること。
    066     *
    067     * @param repr 作成する際に渡す染色体
    068     * @return 作成されたクラス
    069     */
    070    abstract public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr);
    071
    072
    073    /**
    074     * 染色体配列を返す
    075     * @return the representation of the chromosome
    076     */
    077    public List<HybsGAObject> getThisRepresentation() {
    078        return getRepresentation();
    079    }
    080
    081    /**
    082     * オプション情報を渡す場合に利用
    083     * @param option
    084     */
    085    public void setOptionData( Object option ) {
    086        this.optionData = option;
    087    }
    088}