是否有经常更改的数据对象结构的设计模式?
我正在重构一个遗传算法,在这个算法中,染色体的结构(基因的数目、基因的类型和基因的边界)从一个问题变化到另一个问题。例如:
一个问题可能会使用
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
}目前染色体的结构是硬编码的,很难针对新的问题进行修改。我正在考虑修改染色体改变的策略模式,除非有人有更好的想法。
发布于 2016-09-30 16:23:46
如果染色体只是基因对象的集合,它们就会变得更容易处理,特别是当边界也被认为是一个对象的时候。
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}}
}
};由于现在所有的染色体都有相同的结构,因此使染色体的生成数据驱动变得相对琐碎。染色体定义可以存储在配置文件或数据库中,并根据需要添加新的定义。每个染色体对象都可以通过一个简单的循环来填充,这个循环可以读取它包含的基因列表。
发布于 2016-10-24 18:05:52
多亏了dbugger的帮助,我相信我有办法了。为了简单起见,我取消了ID和边界。IGene和基因类是解决方案。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() );
}
}https://stackoverflow.com/questions/39792760
复制相似问题