2016-09-30 10 views
2

頻繁に変更されるデータオブジェクト構造のデザインパターンはありますか?頻繁に変更されるデータオブジェクト構造のデザインパターンはありますか?

私は染色体の構造(遺伝子数、遺伝子の種類、遺伝子の境界)が問題から問題に変わる遺伝的アルゴリズムをリファクタリングしています。たとえば:

一つの問題は

class Chromosome{ 
    double gene1; // 0.0 < gene1 < 100.0 
    double gene2; // -7.3 < gene2 < 9.0 
} 

を使用することができます別の問題が

class Chromosome{ 
    int gene1;  // 200 < gene1 < 1000 
    double gene2; // 50.0 < gene2 
    double gene3; // gene3 < -5.0 
} 

を使用することが現在、染色体構造は、ハードコーディングされ、新たな問題のために変更することが困難です。私は誰かが良いアイデアを持っていない限り、染色体の変化のための戦略パターンを修正することを検討しています。

答えて

0

染色体が単なる遺伝子オブジェクトの集まりである場合、特に境界もオブジェクトと見なされている場合、染色体は扱いやすくなります。そして染色体の新しいインスタンスが必要な遺伝子のリストでそれを供給することによって簡単に行うことができる

public class Gene 
{ 
    public string Id { get; set; } 
    public double Value { get; set; } 
    public Boundary Boundary { get; set; } 
} 

public class Boundary 
{ 
    public double? Minimum { get; set; } 
    public double? Maximum { get; set; } 
} 

public class Chromosome 
{ 
    public string Name { get; set; } 
    public List<Gene> Genes { get; set; } 
} 

...

var chromosome1 = new Chromosome 
    { 
     Name = "Biggie", 
     Genes = new List<Gene> 
       { 
        new Gene {Id = "1", Boundary = new Boundary {Minimum = 0, Maximum = 100}}, 
        new Gene {Id = "2", Boundary = new Boundary {Minimum = -7.3, Maximum = 9}} 
       } 
    }; 

var chromosome2 = new Chromosome 
     { 
      Name = "Fusion", 
      Genes = new List<Gene> 
      { 
       new Gene {Id = "1", Boundary = new Boundary {Minimum = 200, Maximum = 1000}}, 
       new Gene {Id = "2", Boundary = new Boundary {Minimum = 50}}, 
       new Gene {Id = "3", Boundary = new Boundary {Maximum = -5}} 
       } 
     }; 

全ての染色体が今同じ構造を有するので、それはなります染色体作成データを駆動するのは比較的簡単です。染色体定義は、設定ファイルまたはデータベースに格納することができ、必要に応じて新しいものを追加することができます。各染色体オブジェクトには、それに含まれる遺伝子のリストを読み取る単純なループを介して取り込むことができます。

+0

この解決方法は機能しません。遺伝子値の型は必ずしも二倍ではありません。これは、倍精度、整数、ブール値、または列挙型にすることができます。また、2つの遺伝子がある場合、各遺伝子はその値に対して異なるタイプを有することができる。 –

+0

すべてがダブルに収まるでしょう。ジェネリックスを導入することもできますが、努力する価値はありません。 – dbugger

+0

数学のサポートがなかったので、ジェネリック医薬品は価値あるものより多くの仕事をしました。 Doubleをmin、max、incrementで使用することを決定しました。私は遺伝子価値とその解釈の間にアダプターを使用します。 –

0

dbuggerのおかげで、私は解決策があると信じています。わかりやすくするためにIDと境界線を省略しました。 IGeneとGeneクラスが解決策です。 TestGeneはテスト実装です。

public interface IGene<T>{ 
    //Accessors 
    public T   getValue(); 

    public void   setValue(T value); 
} 

public class Gene<T> implements IGene<T> { 
    //Attributes 
    T   _value; 

    //Accessors 
    public T   getValue(){ return this._value;} 

    public void   setValue(T value){ this._value = value; } 
} 

import java.util.ArrayList; 
import java.util.List; 

public class TestGene { 
    public enum EnumType {VALUE1, VALUE2} 

    public TestGene() { 
     IGene gene; 

     List<IGene> chromosome = new ArrayList(); 

     gene= new Gene<Double>(); 
     gene.setValue(1.08); 
     chromosome.add(gene); 

     gene = new Gene<Integer>(); 
     gene.setValue(3); 
     chromosome.add(gene); 

     gene = new Gene<EnumType>(); 
     gene.setValue(EnumType.VALUE1); 
     chromosome.add(gene); 

     for (int i = 0; i < chromosome.size(); i++){ 
      System.out.println(chromosome.get(i).getValue()); 
     } 
    } 
関連する問題