Java:值不应该更新

时间:2010-04-09 13:28:42

标签: java field simulated-annealing

基本上我正在尝试为多维背包问题创建模拟退火的实现。我在让系统决定是否接受具有较低值的状态时遇到问题。用这个函数控制退火:

while (this.temp > 0)
    {
        System.out.println("Temperature: "+this.temp);
        System.out.println("Current bag: "+bagString(currentBag)+" (Value "+problem.getValue(currentBag)+")");
        next = getNext();
        System.out.println("Next bag: "+bagString(next)+" (Value "+problem.getValue(next)+")");
        if (acceptNext(next))
        {
            System.out.println("Accepted");
            this.currentBag = next;
        } else {
            System.out.println("Not accepted");
        }
        this.temp -= this.delta;
    }

acceptNext()函数决定是否接受下一个状态,并由此定义:

public boolean acceptNext(ArrayList<Boolean> next)
{
    if (problem.getValue(next) > problem.getValue(this.currentBag))
    {
        return true;
    } else {
        int loss = (problem.getValue(this.currentBag) - problem.getValue(next));
        double prob = Math.exp(loss/this.temp);
        Random generator = new Random();
        double selection = generator.nextDouble();
        System.out.println("Prob: "+prob+", random number: "+selection);
        if (selection < prob) {
            return true;
        }
        return false;
    }
}

在进行一些测试之后,我发现在调用acceptNext()函数之前,currentBag字段被赋值给下一个值。在我的任何代码中都找不到另一个“this.currentBag = next”。为了完整起见,这里是getNext()函数:

public ArrayList<Boolean> getNext()
{
    Random generator = new Random();
    boolean valid = false;
    ArrayList<Boolean> next = new ArrayList<Boolean>();
    int j;
    while (!valid)
    {
        next = this.currentBag;
        j = generator.nextInt(problem.getNumObjects());
        if (next.get(j) == true)
        {
            next.set(j, false);
        } else {
            next.set(j, true);
        }
        if (problem.isValid(next))
        {
            valid = true;
        }
    }
    return next;
}

我看不出是什么让这个值更新。有没有人在代码中看到任何内容?

由于

2 个答案:

答案 0 :(得分:3)

执行此操作时,next指向与当前行李相同的内容,因此对next的所有更改都会反映在currentBag中。 在你的getNext()方法中:

while (!valid)
{
    next = this.currentBag;
    ...
}

请改为尝试:

while (!valid)
{
    next = new ArrayList<Boolean>(this.currentBag);
    ...
}

答案 1 :(得分:1)

getNext()接下来设置引用currentBag对象,然后对其执行set操作。如果要修改next的值,则需要复制/克隆currentBag。