0
최악의 적합성을 가진 휴리스틱을 사용하여 bin-packing 프로그램을 작성하려고합니다. 파일에 의해 읽혀질 때까지 더 이상 저장할 수 없을 때까지는 가중치를 추가합니다. 빈의 순서를 우선 순위 대기열에 넣고 나머지 빈 공간이 가장 적은 빈을 맨 위에 놓습니다. 하지만 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();
}
}
}
가장자리가있는 경우, 곧바로 빼기를 권유하지 않기 때문에 오버플로가 잘못된 결과를 초래할 수 있습니다. 일반적인 접근법은 실제로 비교를 수행하고 적절하게 -1, 0 또는 1을 반환하는 것입니다. 뿐만 아니라, null에 대한 방어는 가치가 있습니다. – dlev
수정 됨. 그 점을 지적 해 주셔서 감사합니다. 내가 모서리를 조금만자를 수 있다고 생각 했었습니다 ... – Sinkingpoint
정직하게 말하자면, 다른 곳의 합리적인 코드가'remSpace'에 음의 값을 할당한다고 상상할 수 없기 때문에,이 경우는별로 문제가되지 않을 것입니다. 나오다. 그냥 길 아래에서 염두에 두어야 할 것 : – dlev