    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}