    001package org.opengion.penguin.math.ga;
    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         * 空の染色体配列を持つインスタンスを作成する。
    024         * newInstanceメソッドでインスタンスを作成するために、若干トリッキーな事をする。
    025         * このコンストラクタを利用する場合はcloneで染色体セットし、増殖させて利用する。
    026         *
    027         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
    028         */
    029        public AbstractHybsGAChromosome() throws InvalidRepresentationException {
    030                super( new HybsGAObject[] {} );
    031        }
    032
    033        /**
    034         * 染色体のリストを引数に持つコンストラクタ。
    035         *
    036         * @param representation 染色体表現のリスト
    037         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
    038         */
    039        public AbstractHybsGAChromosome(final List<HybsGAObject> representation) throws InvalidRepresentationException {
    040                super(representation);
    041        }
    042
    043        /**
    044         * 初期化用のsetter。
    045         * 通常、copyListにはtrueをセットして染色体表現のインスタンスを新たに作成する。
    046         *
    047         * @param chromosomeRepresentation 染色体表現
    048         * @param copyList newを利用してクローンするかどうか
    049         * @return クローン
    050         */
    051        public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation, final boolean copyList)  {
    052                checkValidity(chromosomeRepresentation);
    053                return newFixedLengthChromosome(copyList ? new ArrayList<HybsGAObject>(chromosomeRepresentation) : chromosomeRepresentation);
    054        }
    055
    056        /**
    057         * 初期化用のsetter。
    058         *
    059         * @param chromosomeRepresentation 染色体表現
    060         * @return クローン
    061         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
    062         */
    063        public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation) throws InvalidRepresentationException {
    064                return clone( chromosomeRepresentation, true );
    065        }
    066
    067        /**
    068         * 自分と同じクラスを作成するメソッド。
    069         * 各クラスで実装する。
    070         * 必要に応じてoptionDataをセットすること。
    071         *
    072         * @param repr 作成する際に渡す染色体
    073         * @return 作成されたクラス
    074         */
    075        @Override
    076        abstract public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr);
    077
    078        /**
    079         * 染色体配列を返す。
    080         *
    081         * @return 染色体配列
    082         */
    083        public List<HybsGAObject> getThisRepresentation() {
    084                return getRepresentation();
    085        }
    086
    087        /**
    088         * オプション情報を渡す場合に利用。
    089         *
    090         * @param option オプション情報
    091         */
    092        public void setOptionData( final Object option ) {
    093                this.optionData = option;
    094        }
    095}