【发布时间】:2020-01-26 18:16:50
【问题描述】:
我正在尝试在 C# 中创建遗传算法,但我想将基因分成几类(染色体)
基本上我有一个定义为的 DNA 类
public class DNA<T> { public T[] Genes { get; private set; } }
所以我可以拥有 double、bool、int 等类型的基因...
那我想定义一条染色体为
class Chromosome
{
Dictionary<string, DNA<T>> chromosomes;
}
所以我可以在染色体上添加多种 DNA 类型,例如
chromosomes.add("brain", new DNA<double>(...));
chromosomes.add("traits", new DNA<bool>(...));
chromosomes.add("body", new DNA<int>(...));
字典值应该是object 还是我应该为DNA 类创建一个IDNA 接口来保存对象,然后在每次需要时进行转换?或者有更简单/最好的方法来做到这一点?谢谢!
【问题讨论】:
-
你应该使
Chromosome类通用,否则Dictionary<string, DNA<T>> chromosomes;将无法编译 -
我首先强调了这一点,但随后它会使 Chromosome 类只接受一种基因(例如,仅 int)我希望它接受多种基因
-
您的字典必须声明为采用这些子类型之间共有的类型,无论是基类还是接口,
DNA<T>继承自/实现。 -
@feehmt:总的来说,您可以考虑在这里使用
KeyedCollection而不是Dictionary。这样,您可以将表型的名称添加到您的DNA<T>类中,同时仍然可以通过该键名进行查找。这可能会使代码更简单和直观,因为您的键将与底层值对象相关联,因此只要您引用该对象就可以随时访问。 -
@feehmt:也与您的问题无关,并承认这可能是一个简化的示例,以说明您的问题:大多数表型源自跨多个染色体的基因表达,就像我一样你当然知道。因此,按染色体对
DNA<T>进行分类可能不是建模许多表型的最有效方法(假设DNA<T>类旨在表示与特定表型特征相关的基因集合)。
标签: c# generics generic-programming generic-list