我正在尝试使用最差拟合启发式编写bin-packing程序,以便它将权重添加到bin中,直到它们无法存储,因为它们被文件读取并将bin序列放入优先级队列这样它就会将剩余空间最少的垃圾箱放在顶部。但是我在编写Bin类的比较器时遇到了麻烦。这是完整的代码:
public class BinPacking{
public static class Bin implements Comparable<Bin> {
int ID ;
int remSpace;
ArrayList<Integer> weights = new ArrayList<Integer>();
public Bin(int ID){
this.ID = ID;
remSpace = 100;
}
public void add(int size){
remSpace -= size;
weights.add(size);
}
@Override
public int compareTo(Bin o) {
return remSpace;
}
}
public static void main(String[] args) throws FileNotFoundException{
PriorityQueue<Bin> pq =new PriorityQueue<Bin>();
File myFile = new File("input.txt");
int binId = 1;
Bin d = new Bin(binId);
pq.add(d);
int size;
Scanner input = new Scanner(myFile);
while (input.hasNext())
{
size = input.nextInt();
d = (Bin)pq.peek();
if (d.remSpace >= size)
{
pq.remove(d);
d.add(size);
pq.add(d);
}
else
{
binId++;
d = new Bin(binId);
d.add(size);
pq.add(d);
}
}
System.out.println("Number of bins used: " + binId);
int mylst[][] = new int[binId][1000];
int k =1;
for(int i=0;i<binId;i++){
System.out.println("Bin" + k + ": ");
k++;
for(int j=0;j<pq.peek().weights.size();j++){
mylst[i][j] = pq.peek().weights.get(j);
System.out.print(" "+mylst[i][j]);
}
System.out.println();
pq.poll();
}
}
}
答案 0 :(得分:2)
Comparable#compareTo(T)旨在返回两个对象之间的差异,允许算法决定一个项目是否等于,小于或大于另一个项目。返回一个剩余空间将不会给出您想要的顺序,因为这不会比较这两个对象。尝试:
public int compareTo(Bin o) {
if(o == null)return 1;
if(remSpace > o.remSpace)return 1;
else if(remSpace < o.remSpace)return -1;
return 0;
}
注意这是如何返回两个Bins的空格中的差异,以便可以衡量差异。