我正在实施一个贪婪的算法来解决背包问题,我一直在讨论这个我无法弄清楚的问题。
public void greedySort() {
int curW = 0;
Collections.sort(sorted);
for(int i = 0; i < sorted.size(); i++) {
Entry temp = sorted.get(i);
System.out.println("Index: " + temp.index + "Ratio: " + temp.ratio);
}
System.out.println("Sorted size: "+sorted.size());
while(sorted.size() > 0 && curW < maxW) {
Entry temp = sorted.get(0);
if(curW + temp.weight <= maxW) {
ret.add(temp);
curW += temp.weight;
}
sorted.remove(0);
}
}
当我运行
时Entry temp = sorted.get(0);
我得到一个IndexOutOfBoundsException,即使Collections.sort(已排序)之后的for循环将正确迭代“已排序”并以正确的顺序打印出所有值。我究竟做错了什么?另外,如果您在此代码中看到我的算法设计有任何错误,请告诉我这些。
编辑:添加了Sorted.size println。它应该打印20。 Sorted是背包条目的ArrayList,按其值/重量比排序。 Sorted不为空,这是通过它运行20值输入文件后的输出
Index: 14 Ratio: 14.0
Index: 0 Ratio: 3.1379310344827585
Index: 15 Ratio: 2.7
Index: 4 Ratio: 1.7555555555555555
Index: 17 Ratio: 1.72
Index: 19 Ratio: 1.4210526315789473
Index: 8 Ratio: 1.3333333333333333
Index: 18 Ratio: 1.2195121951219512
Index: 11 Ratio: 1.2
Index: 1 Ratio: 0.9230769230769231
Index: 9 Ratio: 0.9230769230769231
Index: 6 Ratio: 0.8636363636363636
Index: 2 Ratio: 0.8591549295774648
Index: 12 Ratio: 0.6530612244897959
Index: 5 Ratio: 0.647887323943662
Index: 16 Ratio: 0.6111111111111112
Index: 7 Ratio: 0.5876288659793815
Index: 10 Ratio: 0.3508771929824561
Index: 13 Ratio: 0.34831460674157305
Index: 3 Ratio: 0.15
Sorted size: 20
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
此处使用驱动程序为函数指定的值创建Sorted
public void Greedy(int[] val, int[] weight, int maxVal) {
final long startTime = System.currentTimeMillis();
GreedyAlgorithm alg = new GreedyAlgorithm();
alg.sorted = new ArrayList<Entry>();
alg.ret = new ArrayList<Entry>();
alg.maxW = maxVal;
for(int i = 0; i < val.length; i++) {
Entry newE = new Entry();
newE.index = i;
newE.value = val[i];
newE.weight = weight[i];
newE.ratio = ((double)newE.value)/((double)newE.weight);
alg.sorted.add(newE);
}
alg.greedySort();
final long endTime = System.currentTimeMillis();
System.out.println("Total execution time: " + (endTime - startTime) );
}
答案 0 :(得分:0)
正如之前的评论者指出的那样,你继续删除ArrayList中的第一个元素。当你遍历所有20个元素时,你已经删除了ArrayList中的所有内容。
因此,请确保在列表为空时结束循环。将您的while条件更改为:
while(sorted.size() > 0 && curW < maxW) {
// Put this print line inside the loop to debug.
System.out.println("Sorted size: "+sorted.size());
Entry temp = sorted.get(0);
if(curW + temp.weight <= maxW) {
ret.add(temp);
curW += temp.weight;
}
sorted.remove(0);
}
答案 1 :(得分:0)
显然我的IDE造成了某种问题,最近有点不稳定。重新启动后,我打开文件并运行它们,错误消失了。
感谢Thilo和hungryghost,在重启任何一种方式后,while循环问题都会出现。