2016-03-10 53 views
0

我目前正在尝试一个遗传算法程序,因此试图找到一个解决方案,我正在利用遗传算子的复制,突变和交叉对一组树对象。我已经根据“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; 
    } 
+0

试图看看你的代码与所有system.out的仍然是在让我的眼睛受伤。 – hownowbrowncow

+1

我们在这里有一个很难理解和重现的情况,请问您可以缩小您的代码并提供一个小的测试用例,我们也可以复制这些用例来检查发生了什么问题?注意:genTree是一个类名,如果是的话,它应该以大写字母开头。并且更改大量的stuf时,不要使用静态方法。 – sgpalit

+0

@sgpalit我简化了我的代码并提供了一个测试用例。我希望这会帮助你帮助我?大声笑 –

回答

0

它,但你重复使用相同的对象在不同的​​元素,所以更改一个元素会影响他们。

+0

你介意请详细说明一下吗?不会克隆该对象使其成为技术上的另一个对象? –

0

所以基本上我有主要问题是.clone()以及深拷贝方法实际上并不让我对象的副本,因此一个变化的一个对象被改变的所有“副本”的价值目的。解决方案是创建一个复制方法,手动使用get和set方法创建相关对象的新副本。这解决了这个问题。

相关问题