Я пишу класс 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/)