Javascript背包算法 - 按最低值

时间:2017-11-01 14:41:00

标签: javascript algorithm knapsack-problem

我找到了背包问题的实现。您可能都知道这个算法旨在找到适合背包的物品最高值的解决方案。我想让它找到最低值的解决方案。

以下是代码:

var data= [
    {name: 'map',                    weight:  9, value:150, pieces:1},
    {name: 'compass',                weight: 13, value: 35, pieces:1},
    {name: 'water',                  weight:153, value:200, pieces:2},
    {name: 'sandwich',               weight: 50, value: 60, pieces:2},
    {name: 'glucose',                weight: 15, value: 60, pieces:2},
    {name: 'tin',                    weight: 68, value: 45, pieces:3},
    {name: 'banana',                 weight: 27, value: 60, pieces:3},
    {name: 'apple',                  weight: 39, value: 40, pieces:3},
    {name: 'cheese',                 weight: 23, value: 30, pieces:1},
    {name: 'beer',                   weight: 52, value: 10, pieces:3},
    {name: 'suntan, cream',          weight: 11, value: 70, pieces:1},
    {name: 'camera',                 weight: 32, value: 30, pieces:1},
    {name: 'T-shirt',                weight: 24, value: 15, pieces:2},
    {name: 'trousers',               weight: 48, value: 10, pieces:2},
    {name: 'umbrella',               weight: 73, value: 40, pieces:1},
    {name: 'waterproof, trousers',   weight: 42, value: 70, pieces:1},
    {name: 'waterproof, overclothes',weight: 43, value: 75, pieces:1},
    {name: 'note-case',              weight: 22, value: 80, pieces:1},
    {name: 'sunglasses',             weight:  7, value: 20, pieces:1},
    {name: 'towel',                  weight: 18, value: 12, pieces:2},
    {name: 'socks',                  weight:  4, value: 50, pieces:1},
    {name: 'book',                   weight: 30, value: 10, pieces:2}
];

function findBestPack() {
    var m= [[0]]; // maximum pack value found so far
    var b= [[0]]; // best combination found so far
    var opts= [0]; // item index for 0 of item 0
    var P= [1]; // item encoding for 0 of item 0
    var choose= 0;
    for (var j= 0; j<data.length; j++) {
        opts[j+1]= opts[j]+data[j].pieces; // item index for 0 of item j+1
        P[j+1]= P[j]*(1+data[j].pieces); // item encoding for 0 of item j+1
    }
    for (var j= 0; j<opts[data.length]; j++) {
        m[0][j+1]= b[0][j+1]= 0; // best values and combos for empty pack: nothing
    }
    for (var w=1; w<=400; w++) {
        m[w]= [0];
        b[w]= [0];
        for (var j=0; j<data.length; j++) {
            var N= data[j].pieces; // how many of these can we have?
            var base= opts[j]; // what is the item index for 0 of these?
            for (var n= 1; n<=N; n++) {
                var W= n*data[j].weight; // how much do these items weigh?
                var s= w>=W ?1 :0; // can we carry this many?
                var v= s*n*data[j].value; // how much are they worth?
                var I= base+n; // what is the item number for this many?
                var wN= w-s*W; // how much other stuff can we be carrying?
                var C= n*P[j] + b[wN][base]; // encoded combination
                m[w][I]= Math.max(m[w][I-1], v+m[wN][base]); // best value
                choose= b[w][I]= m[w][I]>m[w][I-1] ?C :b[w][I-1];
            }
        }
    }
    var best= [];
    for (var j= data.length-1; j>=0; j--) {
        best[j]= Math.floor(choose/P[j]);
        choose-= best[j]*P[j];
    }

我尝试了几件事,但它对我没有用,你们可以帮帮我吗?

算法查找适合容量为400容量的项目,以便它可以包含重量不超过400的项目。它还尝试适合具有最佳价值的物品。例如,如果1个项目具有10个权重,则5个值算法将采用此项目而不是具有10个权重和4个值的项目。我希望在涉及到价值时使其反转,因此算法将选择具有4值而非5的项目。

1 个答案:

答案 0 :(得分:0)

一般来说,对于最低值的vanilla背包问题的解决方案是微不足道的:你可以简单地选择什么都不做。如果您正在谈论特定权重阈值的最低值,那么这里有一个提示:尝试否定您的所有值。在这种情况下,最高值的背包是最不利的。