    001package org.opengion.penguin.math.ga;
    002
    003import java.util.List;
    004import org.apache.commons.math3.genetics.InvalidRepresentationException;
    005
    006/**
    007 * AbstractHybsGAChromosomeのサンプル実装クラスです.
    008 * HybsGAObjectImplを利用してます。
    009 * Implの配列に各都市の座標が入っており、座標間の距離を元にして
    010 * 単純な巡回セールスマン問題を解きます。
    011 * （ルートが交差するかどうかは問いません)
    012 *
    013 */
    014public class HybsTSPChromosome extends AbstractHybsGAChromosome {
    015
    016        /**
    017         * コンストラクタ。
    018         */
    019        public HybsTSPChromosome() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    020
    021        /**
    022         * コンストラクタ。
    023         *
    024         * @param representation 染色体表現
    025         */
    026        public HybsTSPChromosome(final List<HybsGAObject> representation) {
    027                super(representation);
    028        }
    029
    030        /**
    031         * 適合度計算。
    032         *
    033         * @return 適合度計算の結果
    034         */
    035        public double fitness() {
    036                double fitness = 0.0;
    037        //      int idx = 0;
    038                final List<HybsGAObject> representation = getRepresentation();
    039
    040                // implをここでは利用する。attrArrayを座標として距離から求めることとする
    041                double[] bfr = ((HybsGAObjectImpl)( representation.get( representation.size()-1 ) )).getAttrArray();
    042                // 6.9.8.0 (2018/05/28) FindBugs:ローカル変数への無効な代入
    043//              double[] now = {0,0};
    044                for ( final HybsGAObject chrom : representation ) {
    045                        // 一つ前との距離をプラス
    046//                      now = ((HybsGAObjectImpl)chrom).getAttrArray();
    047                        final double[] now = ((HybsGAObjectImpl)chrom).getAttrArray();
    048                        fitness += Math.sqrt( (bfr[0]-now[0])*(bfr[0]-now[0]) + (bfr[1]-now[1])*(bfr[1]-now[1]) );
    049
    050                        bfr=now;
    051        //              idx++;
    052                }
    053
    054                // fitnessが最小になると適合度が最大になる
    055                // 交差等は特に考えず、単純に計算
    056                return 1 / fitness;
    057        }
    058
    059        /**
    060         * 自身のクラスを新たに作成するメソッド。
    061         *
    062         * @param repr 染色体表現
    063         * @return 作成された自分自身のクラス
    064         */
    065        @Override
    066        public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr) {
    067                return new HybsTSPChromosome(repr);
    068        }
    069
    070        /**
    071         * 染色体表現のチェック。
    072         *
    073         * @param repr 染色体表現リスト
    074         */
    075        @Override
    076        protected void checkValidity(final List<HybsGAObject> repr) throws InvalidRepresentationException {
    077                // Listの中身のチェックをする箇所。必要であれば記述する
    078        }
    079}