如果染色体仅仅是基因对象的集合,它们会变得更容易处理,特别是如果边界也被视为对象。
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}}
}
};
由于所有的染色体现在具有相同的结构,它成为使染色体创建数据驱动相对微不足道。染色体定义可以保存在配置文件或数据库中,并根据需要添加新的。每个染色体对象可以通过一个简单的循环来填充,该循环读取它所包含的基因列表。
此解决方案不起作用。基因价值的类型并不总是双重的。它可以是double,integer,boolean或枚举。同样,如果有两个基因,每个基因的价值可能有不同的类型。 –
所有这些将适合一个双。你也可以引入泛型,但它可能不值得付出努力。 – dbugger
缺乏数学支持使得泛型的工作比值得。决定使用Double,最小值,最大值和增量值。我将在基因价值和它的解释之间使用一个适配器。 –