完美的Bin Packing解算法

时间:2014-10-22 13:50:45

标签: algorithm solution bin packing

有没有办法解决1D垃圾箱包装完全有效,不同于蛮力?如果不是,那么暴力攻击问题的最佳方法是什么?我尝试过降低最佳状态,减少第一次合身,但他们都不能完全有效地工作。我现在直到下面的代码如下:(某些功能没有显示,即排序和交换,但假设这些功能完美无缺,他们会这样做!)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

void swap(int* x, int* y);
void sort(int values[], int n);
int choose(int fill[], int *fills, int val, int max);

int main(void){
    int lw, cn;

    //  get first two numbers
    scanf("%i", &lw);
    scanf("%i", &cn);   

    //
    int cw[cn], i, lf[1000], lc = 0, lp;
    memset(lf, 0 , sizeof(lf));
    //  get width of all the clothes
    for(i = 0; i < cn; i++){
        scanf("%i", &cw[i]);
    }

    //  sort cw 
    sort(cw, cn);

    //  apply bin packing - bestfit, sorted
    for( i = 0; i < cn; i++){
        lp = choose(lf, &lc, cw[i], lw);
        lf[lp] += cw[i];
        printf("lf[%i] += %i, maakt %i \n", lp , cw[i], lf[lp]);
    }

    //  return nr of bins
    printf("Uiteindelijke lc= %i\n", lc);

}


int choose(int fill[], int *fills, int val, int max){
    int x, lessid, less = 0;
    bool changed = 0;
    for(x = 0; x <= *fills; x++){

    /* best fit
    if( ((fill[x] + val) < max) && ((fill[x] + val) > less)){
            lessid = x;
            less = fill[x];
            changed = 1;
        }

        if (changed == 1) { return lessid;}
        else {
            *fills+=1;
            return *fills;
        }

    }*/

    //First fit
    if( (fill[x] + val) < max) {
            return x;
    }

    *fills+=1;
    return *fills;
    }
}

1 个答案:

答案 0 :(得分:0)

Branch and Bound暴力更有效。但它仍然是一个详尽的搜索,它仍然在可扩展性墙上。