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}