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