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}