Я пытаюсь реализовать приоритетную очередь моего типа BBNode типа, но, похоже, он не рассеивает новые узлы так, как я ожидаю. Вместо того, чтобы иметь наименьший из них во главе очереди (как это работает сейчас), я хочу, чтобы наибольшее было там, но я не могу понять, как это сделать. Вот мой класс BBNode.Приоритет приоритета Java не сортируется должным образом
public class BBNode implements Comparable<BBNode>{
public int level; //level on the tree
public int value; //value up to that node
public int weight; //weight up to that node
public double bound; //bound of that node
//...constructors
public int compareTo(BBNode node){
if(this.bound > node.bound) return -1;
if(this.bound < node.bound) return 1;
return 0;
}
}
И вот где я использую PQ.
PriorityQueue<BBNode> pq = new PriorityQueue<BBNode>();
//..other variables
while(pq.peek() != null){
v = pq.poll();
//System.out.println(v.weight + " " + v.value + " " + v.bound);
if(v.bound >= bestVal && v.level < sortedItems.length-1){
//left branch: take the next item
u.level = v.level+1;
u.weight = v.weight + sortedItems[u.level].weight;
u.value = v.value + sortedItems[u.level].value;
u.bound = bound(u);
//System.out.println(u.bound);
if(u.bound > bestVal){
pq.add(u);
System.out.println("adding " + u.bound);
System.out.println("top of pq is " + pq.peek().bound);
}
if(u.weight <= maxWt && u.value > bestVal){
bestVal = u.value;
bestWt = u.weight;
//System.out.println(bestVal + " " + bestWt);
takeList[arrIdx++] = sortedItems[u.level].item+1;
}
//right branch: don't take the next item
u.weight = v.weight;
u.value = v.value;
u.bound = bound(u);
if(u.bound > bestVal){
pq.add(u);
System.out.println("adding " + u.bound);
System.out.println("top of pq is " + pq.peek().bound);
}
}
}
Извините, что форматирование в конце отстой. Последняя скобка соответствует циклу while.
Я также попытался переключиться на -1 и 1 в методе сравнения, и я также попытался реализовать компаратор, но с теми же результатами.
Любая помощь приветствуется :)
Ваш BBNode верен, и вставка их в очередь приоритетов работает просто отлично (с самой большой привязкой первой). Так почему вы думаете, что это неправильно? Какая пара значений, которые вы вставляете, в конечном итоге неправильно вставлена? – greedybuddha
Можете ли вы добавить раздел кода, в котором вы установили 'u'? – sharakan
В приведенном коде вы не назначаете u указывать на другой объект на каждой итерации, просто изменяя поля в ссылках на объекты u. Если это имеет место в вашем реальном коде, есть только один объект, который когда-либо добавлялся, и его значение менялось в зависимости от последнего v. –