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}