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}