Алгоритм ранца Javascript - поиск по минимальному значению

1

Я нашел реализацию проблемы Knapsack. Как вы, наверное, все знаете, что этот алгоритм предназначен для поиска решения с наивысшим значением предметов, которые подходят в рюкзаке. Я хочу, чтобы он нашел решение с наименьшими значениями.

Вот код:

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.

  • 2
    Пожалуйста, добавьте больше деталей к вашему вопросу: что происходит, что вы ожидали и что вы пробовали?
  • 0
    Алгоритм находит элементы, которые помещаются в контейнер емкостью 400, поэтому он может содержать элементы весом не более 400 единиц. Это также пытается соответствовать предметам, которые имеют лучшее значение. Например, если 1 элемент имеет 10 весовых и 5 значений, алгоритм возьмет этот элемент вместо элемента с 10 весовыми и 4 значениями. Я хочу сделать все наоборот, когда дело доходит до значения, чтобы алгоритм выбрал элемент с 4 значениями вместо 5.
Показать ещё 1 комментарий
Теги:
algorithm
knapsack-problem

1 ответ

0

В общем, решение проблемы ванильного рюкзака для самых низких значений тривиально: вы можете просто не принимать ничего. Если вы говорите о самом низком значении для определенного порога веса, то вот подсказка: попробуйте отрицать все ваши значения. В этом случае наименьшее отрицательное значение имеет старший рюкзак.

  • 0
    Да, я хочу принять минимальное значение для определенного веса. Вначале ваша идея казалась блестящей, но пока я обращал значения к отрицательным, алгоритм не находил никакого решения. Постараюсь выяснить почему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню