我目前正在尝试一个遗传算法程序,因此试图找到一个解决方案,我正在利用遗传算子的复制,突变和交叉对一组树对象。我已经根据“FULL”树方法创建了一个初始种群,之后我试图为N代运行一个while循环。这个想法是采用初始种群的数组,根据遗传算子进行操作,然后用新种群代替原始种群。为什么我的对象数组不保留它被分配的对象?
我遇到的问题是,我的树对象复制/变异/交叉没有正确映射到树数组中正确的行。下面是我的主要方法和我的对象类的样本以及我使用创建一个新的人口的代码,标有“再生”
tree= genTree.regenerate(tree,repRuns, mutRuns, crossRuns,param[7],tournSize,terms,Functs);
,其中树是原来的阵列
public static genTree[] regenerate(genTree[] original, int repRuns, int mutRuns, int crossRuns, int newDep, int tournSize, Function terms[][], Function Functs[]) {
genTree[] copy = new genTree[original.length];
int trace = 0;
genTree tournResult;
while (trace < repRuns) {
tournResult = genTree.beginTourn(tournSize, original);
genTree reprodOperation = genTree.reprodOperator(tournResult);
copy[trace] = reprodOperation;
trace++;
}
while (trace < (mutRuns + repRuns)) {
tournResult = genTree.beginTourn(tournSize, original);
genTree mutateOP = genTree.mutateOperator(tournResult, newDep, terms, Functs);
copy[trace] = mutateOP;
trace++;
}
while (trace < (repRuns + mutRuns + crossRuns)) {
tournResult = genTree.beginTourn(tournSize, original);
genTree winner2 = genTree.beginTourn(tournSize, original);
genTree[] crossover = genTree.crossoverOperator(tournResult, winner2);
copy[trace] = crossover[0];
trace++;
copy[trace] = crossover[1];
trace++;
}
for (int i = 0; i < copy.length; i++) { //tried deep copy here
original[i] = copy[i];
}
//used to trace through the original array,see what it looks like
System.out.println("ORIGINAL ARRAY : ");
for (int i = 0; i < original.length; i++) {
System.out.println(original[i].displayTreeOnly());
}
//see whhat copy array looks like
System.out.println("COPY ARRAY : ");
for (int i = 0; i < copy.length; i++) {
System.out.println(copy[i].displayTreeOnly());
}
// original =copy.clone();
copy = null;
return original;
}
以上是我尝试创建一个新的人口。我试过.clone(),但我仍然得到相同的结果。作为测试案例,请考虑以下几点。 “原始”包含下面的树:
OR AND NOT NOT NOT AND d5 a0 d0 d1 AND AND NOT OR NOT NOT a0 d4 d3 d6 AND NOT AND AND AND OR a3 d1 d3 d1 d4 a3 AND OR AND OR NOT NOT OR d0 d6 d4 d4 d5 a1 OR AND AND AND AND AND AND d0 d2 d2 d7 d2 a1 a3 d7
和运行方法(前拷贝到等于原发)后,副本应包含
AND AND NOT OR NOT NOT OR d2 d3 d6 OR AND OR OR NOT d2 d0 d7 d5 a0 d6
AND OR AND OR NOT NOT OR AND d6 d4 d4 d5 a1 d5 d4
AND OR AND OR NOT NOT OR AND d6 AND d4 d5 a1 d5 d4 NOT NOT d2 d3
AND NOT AND AND AND OR a3 d1 d3 d1 d4 d2
AND AND NOT OR NOT NOT OR d2 d3 d6 OR AND OR OR NOT a3 d0 d7 d5 a0 d6
但是相反,这两个“原始”和“复制”包含以下内容:
AND AND NOT OR NOT NOT OR d2 d3 d6 OR AND OR OR NOT a3 d0 d7 d5 a0 d6
AND OR AND OR NOT NOT OR AND d6 AND d4 d5 a1 d5 d4 NOT NOT d2 d3
AND OR AND OR NOT NOT OR AND d6 AND d4 d5 a1 d5 d4 NOT NOT d2 d3
AND NOT AND AND AND OR a3 d1 d3 d1 d4 d2
AND AND NOT OR NOT NOT OR d2 d3 d6 OR AND OR OR NOT a3 d0 d7 d5 a0 d6
当一些树木被映射到正确的位置,但阵列无法正确映射ç ompletely
功能类:
public class Function {
private String label;
private int arity;
public Function() {
}
public void setArity(int arty) {
arity = arty;
}
public void setLabel(String lbl) {
label = lbl;
}
public String getLabel() {
return label;
}
public int getArity() {
return arity;
}
}
genTree基本:
public class genTree {
public Node root;
private int hits = 0;
static long seed = System.currentTimeMillis();
static Random rand = new Random(seed);
static Random randBool = new Random();
static genTree[] newPop;
static genTree winner;
private int numberNodes = 0;
private boolean success;
public genTree() {
numberNodes = 0;
}
试图看看你的代码与所有system.out的仍然是在让我的眼睛受伤。 – hownowbrowncow
我们在这里有一个很难理解和重现的情况,请问您可以缩小您的代码并提供一个小的测试用例,我们也可以复制这些用例来检查发生了什么问题?注意:genTree是一个类名,如果是的话,它应该以大写字母开头。并且更改大量的stuf时,不要使用静态方法。 – sgpalit
@sgpalit我简化了我的代码并提供了一个测试用例。我希望这会帮助你帮助我?大声笑 –