我正在制作一种遗传算法,用于将char
的数组演变为“Hello World”。问题是每当我初始化Chromosome
对象并调用generateChromosome
方法时,“测试”群体的所有染色体都保持不变?
public class Chromosome{
private static int defaultLength = 11;
private static char []genes = new char[defaultLength]; <--- this remains the same for each object :/
//Generates a random char chromosome
public void generateChromosome(){
char []newGene = new char[defaultLength];
for(int x = 0; x<size(); x++){
char gene = (char)(32+Math.round(96*Math.random()));
newGene[x] = gene;
}
genes = newGene;
}
//Returns a specific gene in the chromosome
public char getGene(int index){
return genes[index];
}
public char[] getChromosome(){
return genes;
}
public void setGene(char value, int index){
genes[index] = value;
}
public static void setDefaultLength(int amount){
defaultLength = amount;
}
public static int getDefaultLength(){
return defaultLength;
}
public int size(){
return genes.length;
}
@Override
public String toString(){
String geneString = "";
for(int x= 0; x<genes.length; x++){
geneString += genes[x];
}
return geneString;
}
}
答案 0 :(得分:3)
那是因为你的变量是static
,即类变量。它们在你班级的每个实例中都是一样的。
如果需要实例变量,请删除static关键字。
答案 1 :(得分:2)
static
表示每个类一个(每个实例不是一个)。删除static
private char[] genes = new char[defaultLength];
,您的genes
成为实例字段。
答案 2 :(得分:2)
static
个成员属于类 - 它们在所有实例中共享。您应该通过删除genes
关键字
static
定义为实例成员
public class Chromosome{
private static int defaultLength = 11; // should probably be final, BTW
private char[] genes = new char[defaultLength]; // not static!
答案 3 :(得分:1)
由于您在基因中使用static
关键字,因此它不是实例变量。因此,虽然您已将创建的数组分配给它,但将只有一个实例通过应用程序。
您可以移除static关键字并使用实例基因变量。
答案 4 :(得分:1)
删除genes
关键字,将static
设为实例变量。
因为,
1)static
表示每个班级一个
2)instance
表示每个实例一个
有关static
的更多信息,
见https://stackoverflow.com/a/413904/2127125