解决分数背包的方法

时间:2014-12-04 15:39:40

标签: algorithm knapsack-problem

我必须实现两个算法来解决fractional knapsack,但到目前为止我刚刚找到并实现了贪婪的方法。

我已经搜索了很多其他算法(作为动态编程我已经读过,它也可以解决分数背包,但我找不到任何伪代码)。我发现的所有内容都是0/1背包。

有没有人有链接或任何可以解决分数背包的算法?

3 个答案:

答案 0 :(得分:1)

@ yola21回答 java code
自己定义未定义的函数,它们是关于接受用户的输入。

//define your variables here 


        System.out.println("Enter number of items:");
        size = acceptNumberOfItems()

        System.out.println("Enter size of your knapsack:");
        size = acceptKnapsackSize()

        System.out.println("Enter weight of each item:");

        acceptWeightArray(weight)

        System.out.println("Enter value of each item:");

        acceptWeightArray(value)

        double[][] valuePerWeight = new double[size][2];

        double maxValue = 0;

        for(int i=0; i<size; ++i){
            valuePerWeight[i][0] = value[i]/weight[i];
            valuePerWeight[i][1] = weight[i];
        }

        java.util.Arrays.sort(valuePerWeight, new java.util.Comparator<double[]>() {
                    public int compare(double[] a, double[] b) {
                        return Double.compare(a[0], b[0]);
                    }
                });



        int i = size-1;
        while(knapsackSize > 0  && size >0){
            //while not full

            if(valuePerWeight[i][1] > knapsackSize){
                maxValue += knapsackSize * valuePerWeight[i][0];
                knapsackSize = 0;
            }
            else{

                maxValue +=  valuePerWeight[i][1] * valuePerWeight[i][0];
                knapsackSize -= valuePerWeight[i][1];
            }


            --i;
        }
        System.out.println("Max Value:" + maxValue);
    }

答案 1 :(得分:0)

我不知道你的意思是两种算法,但这里是分数背包问题的解决方案。

与0/1背包问题btw相比,非常容易。

  1. 准备第三个数组,每个重量数组的,将每个项目的权重除以其对应的值

  2. 根据每个重量的值按降序对项目进行排序

  3. 将项目清单中的项目带入您的麻袋直至装满

  4. N.B 如果您的麻袋无法完全接受,请务必取最后一项的分数。

    例如,如果你的口袋里有80公斤,下一个项目的重量是23:
    1。你必须拿20 k.g
    2。计算23 k.g中20 k.g的值,并将其加到您将获得的总值中。

答案 2 :(得分:0)

您可以使用genetic algorithm

如果有n个材料,您的染色体将会有n - 1从0到1加倍。i - 双倍指定我们采用的材料i。对于材料n,我们取余数,即1 - (n - 1双倍之和)。

例如对于n = 4材料,染色体可以是[0.1, 0.2, 0.3]。我们采用0.1第一个材料,0.2第二个材料,0.3第三个材料和0.4第四个材料。

据我所知,它不一定非常有效,它只是用于比较不同的算法。因此,你可以从随机染色体开始,改变它们,丢弃最弱(最小整体值),改变它们,丢弃最弱,等等。您还可以考虑添加交叉。