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 // 6.9.8.0 (2018/05/28) FindBugs:ローカル変数への無効な代入 043// double[] now = {0,0}; 044 for ( final HybsGAObject chrom : representation ) { 045 // 一つ前との距離をプラス 046// now = ((HybsGAObjectImpl)chrom).getAttrArray(); 047 final double[] 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}