【问题标题】:Knapsack Optimal Solution(Brute Force)背包最优解(蛮力)
【发布时间】:2016-03-18 14:00:07
【问题描述】:

用户将输入三个对象的重量阈值、对象数量以及重量和成本。 输出应该是背包图并且应该显示最优解。

重量应该最大,成本应该最小。

样本输出:

w=60
n=3
w = 10
w2 = 35
w3 = 30
c=8
c1=4
c2=7

output:
A   10  8
B   35  4
C   30  7
AB  45  12
AC  40  15
BC  65  11
ABC 75  19

OPTIMAL SOLUTION: AB with total weight of 45 and total cost of 12.

我的问题是我的最佳解决方案是错误的。它输出OPTIMAL SOLUTION: A with total weight of 40 and total cost of 15.

我应该如何解决它?

谢谢!

import java.util.*;
public class KnapsackBruteForce {
    static int numObject;
    static int weightThreshold = 0;
    static String variables[] = new String[100];
    static double numCombination;
    static KnapsackBruteForce knapsack = new KnapsackBruteForce();
    static Scanner input = new Scanner(System.in);
    public static void main(String args[]){
        System.out.print("Enter weight threshold: ");
        weightThreshold = input.nextInt();
        System.out.print("Enter number of objects: ");
        numObject = input.nextInt();

        int weightObject[] = new int[numObject+1];
        int costObject[] = new int[numObject+1];

        System.out.println("Enter variables: ");
        for(int i=0;i<numObject;i++){
            variables[i] = input.next();
        }
        for(int i=0;i<numObject;i++){
            System.out.print("Enter weight of object "+variables[i]+": ");
            weightObject[i] = input.nextInt();
        }
        for(int i=0;i<numObject;i++){
            System.out.print("Enter cost of object "+variables[i]+": ");
            costObject[i] = input.nextInt();
        }

        knapsack.possibleCombinations(variables, weightObject, costObject, weightThreshold, numObject);
    }

    public void possibleCombinations(String variables[], int weightObject[], int costObject[], int weightThreshold, int numObject){
        int weight = 0;
        int cost = 0;
        int optWeight = 0;
        int optCost = 0;
        String optVar = "";
        String newVar = "";

        for (int i = 1; i < (1 << numObject); i++) {
            String newVariable = Integer.toBinaryString(i);

            for (int j = newVariable.length() - 1, k = numObject - 1; j >= 0; j--, k--) {
                if (newVariable.charAt(j) == '1') {
                    newVar = variables[k];
                    weight += weightObject[k];
                    cost += costObject[k];
                    System.out.print(newVar);
                }
            }

            System.out.println("\t" + weight + "\t" + cost);

            if (weight <= weightThreshold) {
                if (optWeight == 0 && optCost == 0) {
                    optWeight = weight;
                    optCost = cost;
                } else if (optWeight <= weight) {
                    if (optCost <= cost) {
                        optVar = newVar;
                        optWeight = weight;
                        optCost = cost;
                    }
                }
            }

            weight = 0;
            cost = 0;
        }

        System.out.println("OPTIMAL SOLUTION: " + optVar + " with total weight of " + optWeight + " and total cost of " + optCost + ".");
    }
}

【问题讨论】:

  • 将信息记录添加到代码中的关键位置,或通过调试器运行它以查看算法在什么时候没有像您认为的那样工作。

标签: java brute-force knapsack-problem


【解决方案1】:

您的逻辑中有一个优先级问题,如果您的解决方案中有两个最好的 45 12 和 50 13,您会选择哪一个?

由于这种模棱两可,您无法在以下部分中选择:

            else if (optWeight <= weight) {
                if (optCost <= cost) {
                    optVar = newVar;
                    optWeight = weight;
                    optCost = cost;
                }
            } 

即使在您的逻辑中,您也应该采取更低的成本而不是更高的optCost &lt;= cost

如果你清除了这个歧义,你应该关注的部分就是我提到的部分。

还可以使用日志记录或至少将一些信息打印到控制台以查看代码的行为方式。

【讨论】:

  • 谢谢!它现在正在工作。我删除了optCost &lt;= cost 条件。
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多