001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.penguin.math.ga;
017
018import java.util.ArrayList;
019import java.util.List;
020import org.apache.commons.math3.genetics.AbstractListChromosome;
021import org.apache.commons.math3.genetics.InvalidRepresentationException;
022
023/**
024 * HybsGeneticAlgorithmで利用するChromosomeインターフェースです。
025 *
026 * AbstractListChromosomeだと少し使いにくいので、AbstractListChromosomeを継承して
027 * 独自にAbstractクラスを作成しています。
028 * (大半はAbstractListChromosomeそのものです)
029 *
030 */
031public abstract class AbstractHybsGAChromosome extends AbstractListChromosome<HybsGAObject> {
032
033        /** 染色体に何らかのオプション情報を持たせる場合に利用 */
034        protected Object optionData;
035
036        /**
037         * デフォルトコンストラクタ。
038         *
039         * 空の染色体配列を持つインスタンスを作成する。
040         * newInstanceメソッドでインスタンスを作成するために、若干トリッキーな事をする。
041         * このコンストラクタを利用する場合はcloneで染色体セットし、増殖させて利用する。
042         *
043         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
044         */
045        public AbstractHybsGAChromosome() throws InvalidRepresentationException {
046                super( new HybsGAObject[] {} );
047        }
048
049        /**
050         * 染色体のリストを引数に持つコンストラクタ。
051         *
052         * @param representation 染色体表現のリスト
053         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
054         */
055        public AbstractHybsGAChromosome(final List<HybsGAObject> representation) throws InvalidRepresentationException {
056                super(representation);
057        }
058
059        /**
060         * 初期化用のsetter。
061         * 通常、copyListにはtrueをセットして染色体表現のインスタンスを新たに作成する。
062         *
063         * @param chromosomeRepresentation 染色体表現
064         * @param copyList newを利用してクローンするかどうか
065         * @return クローン
066         */
067        public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation, final boolean copyList)  {
068                checkValidity(chromosomeRepresentation);
069                return newFixedLengthChromosome(copyList ? new ArrayList<HybsGAObject>(chromosomeRepresentation) : chromosomeRepresentation);
070        }
071
072        /**
073         * 初期化用のsetter。
074         *
075         * @param chromosomeRepresentation 染色体表現
076         * @return クローン
077         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
078         */
079        public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation) throws InvalidRepresentationException {
080                return clone( chromosomeRepresentation, true );
081        }
082
083        /**
084         * 自分と同じクラスを作成するメソッド。
085         * 各クラスで実装する。
086         * 必要に応じてoptionDataをセットすること。
087         *
088         * @param repr 作成する際に渡す染色体
089         * @return 作成されたクラス
090         */
091        @Override
092        abstract public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr);
093
094        /**
095         * 染色体配列を返す。
096         *
097         * @return 染色体配列
098         */
099        public List<HybsGAObject> getThisRepresentation() {
100                return getRepresentation();
101        }
102
103        /**
104         * オプション情報を渡す場合に利用。
105         *
106         * @param option オプション情報
107         */
108        public void setOptionData( final Object option ) {
109                this.optionData = option;
110        }
111}