【发布时间】:2013-08-28 16:22:59
【问题描述】:
我正在实现 simulated annealing (SA) 算法,我需要在其中复制状态(例如,记住迄今为止的最佳解决方案)。
我实现了一个复制方法,因为不鼓励使用java的clone()。
SA 是一种启发式算法,因此下一步要采取的措施是随机确定的。这是通过使用Random 对象来完成的,我也想复制它。
虽然算法不需要它,但我希望副本具有完全相同的状态。 但这只是这种情况,如果我在创建对象后直接进行“复制”并使用相同的种子对其进行初始化。
但是如果我在复制过程之前随机执行一些操作,Random 对象的内在状态(即种子)会发生变化,并且复制的行为会有所不同。
那么我怎样才能获得java.util.Random 实例的精确副本?
示例
public class State
{
private final Random r;
private final long seed;
private Object currentOperand;
public State()
{
this(System.nanoTime(), null);
}
private State(long seed, Object currentOperand)
{
this.seed = seed;
this.r = new Random(seed);
this.currentOperand = currentOperand;
}
public State copy()
{
return new State(seed, currentOperand);
}
public void doSth()
{
/* operation with random operand */
currentOperand = r.nextInt(100);
}
public void redo()
{
// redo then set to null
currentOperand = null;
}
/* for completeness' sake... since it's simulated annealing */
public int computeEnergy() { return 0; }
}
【问题讨论】:
-
我猜想在 java doc 合同中指定,不是复制确切的状态,并指定什么是可能的,而不是遵循链接答案中的方法。
-
我接受了我自己的答案,因为我提供的解决方案很容易(重新)使用。
标签: java algorithm random copy clone