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         * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LongVariable 対応
064         *
065         * @param chromosome 染色体表現
066         * @param copyList newを利用してクローンするかどうか
067         * @return クローン
068         */
069//      public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation, final boolean copyList)  {
070        public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosome, final boolean copyList)  {
071//              checkValidity(chromosomeRepresentation);
072//              return newFixedLengthChromosome(copyList ? new ArrayList<HybsGAObject>(chromosomeRepresentation) : chromosomeRepresentation);
073                checkValidity(chromosome);
074                // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseDiamondOperator 対応
075//              return newFixedLengthChromosome(copyList ? new ArrayList<HybsGAObject>(chromosome) : chromosome);
076                return newFixedLengthChromosome(copyList ? new ArrayList<>(chromosome) : chromosome);
077        }
078
079        /**
080         * 初期化用のsetter。
081         *
082         * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LongVariable 対応
083         *
084//       * @param chromosomeRepresentation 染色体表現
085         * @param chromosome 染色体表現
086         * @return クローン
087         * @throws InvalidRepresentationException 染色体の表現が無効であることを示す例外
088         */
089        // 8.5.4.2 (2024/01/12) PMD 7.0.0 LongVariable 対応
090//      public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosomeRepresentation) throws InvalidRepresentationException {
091        public AbstractListChromosome<HybsGAObject> clone(final List<HybsGAObject> chromosome) throws InvalidRepresentationException {
092//              return clone( chromosomeRepresentation, true );
093                return clone( chromosome, true );
094        }
095
096        /**
097         * 自分と同じクラスを作成するメソッド。
098         * 各クラスで実装する。
099         * 必要に応じてoptionDataをセットすること。
100         *
101         * @param repr 作成する際に渡す染色体
102         * @return 作成されたクラス
103         */
104        @Override
105        abstract public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr);
106
107        /**
108         * 染色体配列を返す。
109         *
110         * @return 染色体配列
111         */
112        public List<HybsGAObject> getThisRepresentation() {
113                return getRepresentation();
114        }
115
116        /**
117         * オプション情報を渡す場合に利用。
118         *
119         * @param option オプション情報
120         */
121        public void setOptionData( final Object option ) {
122                this.optionData = option;
123        }
124}