【问题标题】:Methods to solve fractional knapsack解决分数背包的方法
【发布时间】:2014-12-04 15:39:40
【问题描述】:

我必须实现两个算法来解决fractional knapsack,但直到现在我才发现并实现了贪心方法。

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

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

【问题讨论】:

  • 为什么要使用动态规划?维基百科文章中的贪心算法总是给出正确的解决方案。
  • @user2040251 我认为他需要实现两个算法只是为了比较,可能用于学术项目等。
  • @Adam Stelmaszczyk 你说的是真的

标签: algorithm knapsack-problem


【解决方案1】:

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

//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);
    }

【讨论】:

    【解决方案2】:

    您可以使用genetic algorithm

    如果有n 材料,您的染色体将有从0 到1 的n - 1 双倍。i-th 双表示我们需要多少材料i。对于材料 n,我们取余数,即 1 -(n - 1 的总和加倍)。

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

    据我了解,它不一定非常有效,它只是为了比较不同的算法。因此,您可以从随机染色体开始,对它们进行变异,丢弃最弱的(最小的整体值),对它们进行变异,丢弃最弱的,等等。您也可以考虑添加分频器。

    【讨论】:

    • 我不允许使用任何遗传算法..请问您有其他算法吗?
    • @yemanyyemany 以后请在您的问题中发布此类限制,以免回答者浪费时间。请编辑您的问题,我将编辑我的答案。
    【解决方案3】:

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

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

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

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

    3. 将物品从物品列表中取出,直到装满为止

    注意如果您的麻袋无法完全接受,请务必取出最后一件物品的一部分。

    例如,如果您的麻袋中有 80 公斤,而下一件物品的重量是 23:
    1.你必须采取 20 公斤
    2。从 23 公斤中计算出 20 公斤的价值,并将其添加到您将获得的总价值中。

    【讨论】:

    • 不正确。物品应根据其每重量单位的价值进行分类,而不是总价值。
    • @yola21 你解释的是贪心方法,物品应该根据它们的重量值排序。我想要另一种算法
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多