Почему мой массив содержит n одинаковых элементов, когда поля не являются статичными? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь добавить объекты в массив.Ни один из этих объектов не содержит никаких статических полей или статических методов, но, тем не менее, когда обновляется массив, все элементы принимают новое значение.Кроме того, каждый раз при создании цикла создается новый экземпляр, поэтому я не думаю, что добавляю один и тот же объект все время.

ArrayList<Integer> rewards = new ArrayList<Integer>(); 
ArrayList<ArrayList<Route>> neighbours = new ArrayList<ArrayList<Route>>();

for(int i=0; i<10; i++)
{
    Generate1Neighbour neighbour = new Generate1Neighbour(testDataFile,amp2Solution,randomGenerator,i);
    System.out.println("Generated neighbour (Reward " + getSolutionReward(neighbour.solution)+ "): " + neighbour.solution.toString());
    rewards.add(getSolutionReward(neighbour.solution));
    neighbours.add(neighbour.solution);
}

testDataFile и amp2Solution остаются неизменными в течение цикла.

Когда я печатаю сгенерированный сосед, я вижу, что в каждой итерации цикла создается другой сосед.Однако после этого цикла соседи содержат 10 одинаковых элементов.

Награды содержат 10 различных значений.В классе Generate1Neighbour никакие поля или методы не являются статическими.

Здесь решение определяется следующим образом:

public ArrayList<Route> solution;

В классе Generate1Neighbour используются несколько методов, в которых обновляется решение.

Что я могу делать не так?

Редактировать: метод getSolutionReward выглядит следующим образом:

public static int getSolutionReward(ArrayList<Route> solution)
{
    int totalReward = 0;
    for(Route route : solution)
    {
        totalReward += route.getReward();
    }
    return totalReward;
}

amp2solution - это ArrayList.В конструкторе Generate1Neighbour переменная 'solution' установлена ​​равной amp2solution, которая была передана конструктору.Эта переменная 'solution' обновляется в многочисленных методах класса Generate1Neighbour.

Конструктор Generate1Neighbour выглядит следующим образом:

public Generate1Neighbour(DataFile testDataFile, ArrayList<Route> Sol, Random randomGen, int q_tabu) throws IOException
{
    System.out.println("Starting Tabu procedure ");
    neighbourhoodSize = "Small";
    solution = Sol;
    S_Comp = new ArrayList<MyNodesData>();
    startPoint = testDataFile.getStartPoint();
    finishPoint = testDataFile.getFinishPoint();
    maxDuration = testDataFile.getMaxDuration();
    randomGenerator = randomGen;
    toRemoveRVI = 3;

    //----------------(A) : Initialization---------------- 
    parameterSet = new ParameterSet(neighbourhoodSize, testDataFile);
    generateSComp(testDataFile, solution, S_Comp);

    //---------Generating neighborhood solutions---------   //Generate number of neighborhood solutions (feasible and 
                                                            //infeasible) to the current solution, based on current
                                                            //tabu parameters.

    routeNumbers = twoRandomTours(solution, randomGenerator);   
    r1 = solution.get(routeNumbers[0]);
    r2 = solution.get(routeNumbers[1]);         

    solution = insertInS(solution, routeNumbers, maxDuration, startPoint, finishPoint, S_Comp, SE, successfulInsert);           
    if(!successfulInsert)
    {
        solution = exchangeWithSComp(solution, parameterSet, routeNumbers, maxDuration, S_Comp, randomGenerator);       
        new RoutesToXLS(solution, "Tabu3");
    }
    else
    {
        new RoutesToXLS(solution, "Tabu2");
    }

    //----------------(B) : Improvement---------------- 

    solution = balance(solution,r1,r2);     
    if(!successfulBalance)
    { 
        exchangeBetweenTours(r1,r2);                    
        new RoutesToXLS(solution, "Tabu5");
    }
    else
    {
        new RoutesToXLS(solution, "Tabu4");
    }
    if(q_tabu % parameterSet.getChi() == 0 && q_tabu!=0)        
    {   
        solution = RVI(solution, routeNumbers, maxDuration, startPoint, finishPoint, S_Comp, SE, randomGenerator, toRemoveRVI, successfulInsert);
        new RoutesToXLS(solution,"AfterRVI");
    }
}
...