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}