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