我正在编写一个类GenerateNeighbours
,其中将初始解Sol
传递给构造函数。要计算该解决方案的许多“邻居”。为了确保我的初始解决方案不会改变,我每次迭代都会对初始解决方案进行深度复制。
此外,我正在使用使用S_Comp
创建的arraylist 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/)