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}