2010-04-09 4 views
0

В основном я пытаюсь создать реализацию имитированного отжига для задачи многомерного рюкзака. У меня возникла проблема с тем, чтобы система решила, принимать или не принимать состояние с более низким значением. Отжиг управляется с помощью этой функции:Java: обновлять значения, когда это не должно

функции
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; 
    } 
} 

После выполнения некоторых испытаний, я обнаружил, что поле currentBag назначается следующему значению перед вызовом функции acceptNext(). Я не могу найти другой «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; 
} 

Я не могу увидеть, что делает это обновление значения. Кто-нибудь видит что-либо в коде?

Благодаря

Бен

ответ

3

Когда вы сделаете это, следующая указывает на то же самое, что и текущий мешок, так что все изменения в следующем отражены в currentBag. В вашем методе GetNext():

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

Попробуйте вместо этого:

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

GetNext() устанавливает следующий ссылаться на объект currentBag, а затем выполняет операцию набора на нем. Вам нужно скопировать/клонировать currentBag, если вы хотите изменить значение следующего.

Смежные вопросы