2016-09-30 45 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

此解决方案不起作用。基因价值的类型并不总是双重的。它可以是double,integer,boolean或枚举。同样,如果有两个基因,每个基因的价值可能有不同的类型。 –

+0

所有这些将适合一个双。你也可以引入泛型,但它可能不值得付出努力。 – dbugger

+0

缺乏数学支持使得泛型的工作比值得。决定使用Double,最小值,最大值和增量值。我将在基因价值和它的解释之间使用一个适配器。 –

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()); 
     } 
    }