Как эффективно использовать глубокую копию? - PullRequest
0 голосов
/ 08 июня 2018

Я пишу класс GenerateNeighbours, в котором исходное решение Sol передается конструктору.Число «соседей» этого решения должно быть вычислено.Чтобы убедиться, что мое первоначальное решение не меняется, я делаю глубокую копию исходного решения каждую итерацию.

Кроме того, я использую массив S_Comp, который был создан с использованием generateSComp().В начале каждой итерации должна использоваться эта версия S_Comp.Поэтому я не называю generateSComp() каждую итерацию, так как я полагал, что это будет ненужным и потребует чрезмерного количества времени.

Поскольку S_Comp меняется в каждой итерации, и я хочу убедиться, что я начинаю с того же S_Comp каждой итерации, я также использую для этого глубокую копию.Тем не менее, я чувствую, что мой подход не настолько эффективен, поскольку время выполнения моей программы едва улучшается в отношении вызова generateSComp каждой итерации.

Ниже вы можете найти код, о котором я говорю:

public GenerateNeighbours(DataFile testDataFile, ArrayList<Route> Sol, Random randomGen) throws IOException
    {       
        solution = (ArrayList<Route>) DeepCopy.copy(Sol);
        S_Comp = new ArrayList<MyNodesData>();
        S_Comp = generateSComp(testDataFile, solution, S_Comp);
        ArrayList<MyNodesData> originalS_Comp = (ArrayList<MyNodesData>) DeepCopy.copy(S_Comp);

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

        //---------Generating neighborhood solutions---------
        for(int i=0; i<parameterSet.getBeta(); i++)         
        {
            solution = (ArrayList<Route>) DeepCopy.copy(Sol);      <---- making a deep copy every iteration     
            S_Comp = (ArrayList<MyNodesData>) DeepCopy.copy(originalS_Comp);    <---- making a deep copy every iteration
//          S_Comp = new ArrayList<MyNodesData>();          
//          generateSComp(testDataFile, solution, S_Comp);      <------- This is what should be unnecessary since S_Comp is the same at the start of every iteration 
            step1to6(i);
            rewards.add(getSolutionReward(solution));
            neighbours.add(solution);
        }
    }

Поскольку я делаю две глубокие копии на каждую итерацию, я чувствую, что моя программа довольно неэффективна.У кого-нибудь есть предложения о том, как более эффективно использовать мои глубокие копии?Или это именно так, как это должно быть сделано?

(Для класса DeepCopy я использовал тот, который предлагался в http://javatechniques.com/blog/faster-deep-copies-of-java-objects/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...