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                double[] now = {0,0};
043                for ( final HybsGAObject chrom : representation ) {
044                        // 一つ前との距離をプラス
045                        now = ((HybsGAObjectImpl)chrom).getAttrArray();
046                        fitness += Math.sqrt( (bfr[0]-now[0])*(bfr[0]-now[0]) + (bfr[1]-now[1])*(bfr[1]-now[1]) );
047
048                        bfr=now;
049        //              idx++;
050                }
051
052                // fitnessが最小になると適合度が最大になる
053                // 交差等は特に考えず、単純に計算
054                return 1 / fitness;
055        }
056
057        /**
058         * 自身のクラスを新たに作成するメソッド。
059         * 
060         * @param repr 染色体表現
061         * @return 作成された自分自身のクラス
062         */
063        @Override
064        public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr) {
065                return new HybsTSPChromosome(repr);
066        }
067
068        /**
069         * 染色体表現のチェック。
070         * 
071         * @param repr 染色体表現リスト
072         */
073        @Override
074        protected void checkValidity(final List<HybsGAObject> repr) throws InvalidRepresentationException {
075                // Listの中身のチェックをする箇所。必要であれば記述する
076        }
077}