Java 为什么我的对象数组没有保留正在分配的对象?

Java 为什么我的对象数组没有保留正在分配的对象?,java,arrays,object,Java,Arrays,Object,我目前正在尝试一个遗传算法程序,因此在试图找到一个解决方案时,我利用遗传算子对一组树对象进行复制、变异和交叉。我已经根据“FULL”树方法创建了一个初始填充,之后我将尝试运行一个while循环N代。其思想是获取初始种群的数组,根据遗传算子对其进行操作,然后用新的种群替换原始种群 我遇到的问题是,复制/变异/交叉的树对象没有正确映射到树数组中的正确行。下面是我的主要方法和对象类的示例,以及用于创建新填充(标记为“regenerate”)的代码 tree= genTree.regenerate(tr

我目前正在尝试一个遗传算法程序,因此在试图找到一个解决方案时,我利用遗传算子对一组树对象进行复制、变异和交叉。我已经根据“FULL”树方法创建了一个初始填充,之后我将尝试运行一个while循环N代。其思想是获取初始种群的数组,根据遗传算子对其进行操作,然后用新的种群替换原始种群

我遇到的问题是,复制/变异/交叉的树对象没有正确映射到树数组中的正确行。下面是我的主要方法和对象类的示例,以及用于创建新填充(标记为“regenerate”)的代码

tree= genTree.regenerate(tree,repRuns, mutRuns, crossRuns,param[7],tournSize,terms,Functs);
其中tree是原始数组

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;
}
但是,“原件”和“副本”均包含以下内容:

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
有些树映射到正确的位置,但数组没有正确地完全映射

函数类:

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 basic:

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;
    }

是的,但是你在不同的元素中重复使用同一个对象,所以对一个元素的更改会影响所有元素。

所以基本上我遇到的主要问题是.clone()和深度复制方法实际上并没有复制我的对象,因此对一个对象的更改会改变所有“副本”的值该对象的副本。解决方案是创建一个副本方法,手动使用get和set方法创建相关对象的新副本。这解决了问题。

尝试在整个系统中查看您的代码。out仍然存在,这让我的眼睛很痛。我们这里有一个很难理解和复制的案例,您能解释一下吗请缩小您的代码并提供一个小的测试用例,我们也可以复制它,以检查出了什么问题?注意:genTree是一个类名吗?如果是,它应该以大写字母开头。并且在您更改大量stuf时,更喜欢不使用静态方法。@sgpalit我已经简化了我的代码并提供了一个测试用例。我希望这能实现帮助您帮助我吗?Lol您可以提供要传递以重新生成的genTree、函数和参数值吗。如果它是库,您可以提供genTree和函数的导入。@SGPAIT genTree是类名,我以后一定会更正大写问题。Function是一个类,它为中的每个节点提供属性参数基本上是繁殖、变异或交叉必须发生的次数(在这种情况下为0 3 2).terms是一组适合度案例,在评估树时将分别替换d0 d1 a1等。提供了函数类和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;
    }