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}