001package org.opengion.penguin.math;
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() {
020                super();
021        }
022        
023        /**
024         * コンストラクタ
025         * @param representation 染色体表現
026         */
027        public HybsTSPChromosome(final List<HybsGAObject> representation) {
028                super(representation);
029        }
030        
031        /**
032         * 適合度計算
033         */
034        public double fitness() { 
035                double fitness = 0.0;
036                int idx = 0;
037                List<HybsGAObject> representation = getRepresentation();
038                
039                // implをここでは利用する。attrArrayを座標として距離から求めることとする
040                double[] bfr = ((HybsGAObjectImpl)( representation.get( representation.size()-1 ) )).getAttrArray();
041                double[] now = {0,0};
042                for ( HybsGAObject chrom : representation ) {
043                        // 一つ前との距離をプラス
044                        now = ((HybsGAObjectImpl)chrom).getAttrArray();
045                        fitness += Math.sqrt( (bfr[0]-now[0])*(bfr[0]-now[0]) + (bfr[1]-now[1])*(bfr[1]-now[1]) );
046                        
047                        bfr=now;
048                        idx++;
049                }
050                        
051                // fitnessが最小になると適合度が最大になる
052                // 交差等は特に考えず、単純に計算
053                return 1 / fitness;
054                
055        
056        }
057        
058        /**
059         * 自身のクラスを新たに作成するメソッド。
060         * 
061         *  @param repr 染色体表現
062         * @return 作成された自分自身のクラス
063         */
064        public AbstractHybsGAChromosome newFixedLengthChromosome(final List<HybsGAObject> repr) {
065                return new HybsTSPChromosome(repr);
066        }
067        
068        /**
069         * 染色体表現のチェック
070         */
071        protected void checkValidity(List<HybsGAObject> repr) throws InvalidRepresentationException {
072                // Listの中身のチェックをする箇所。必要であれば記述する
073        }
074}