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() { 020 super(); 021 } 022 023 /** 024 * コンストラクタ。 025 * 026 * @param representation 染色体表現 027 */ 028 public HybsTSPChromosome(final List<HybsGAObject> representation) { 029 super(representation); 030 } 031 032 /** 033 * 適合度計算。 034 * 035 * @return 適合度計算の結果 036 */ 037 public double fitness() { 038 double fitness = 0.0; 039 // int idx = 0; 040 final List<HybsGAObject> representation = getRepresentation(); 041 042 // implをここでは利用する。attrArrayを座標として距離から求めることとする 043 double[] bfr = ((HybsGAObjectImpl)( representation.get( representation.size()-1 ) )).getAttrArray(); 044 double[] now = {0,0}; 045 for ( final HybsGAObject chrom : representation ) { 046 // 一つ前との距離をプラス 047 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}