背包最佳解决方案(蛮力)

时间:2016-03-18 14:00:08

标签: java brute-force knapsack-problem

用户将输入权重阈值,对象数量以及3个对象的权重和成本。 输出应该是背包图,它应该显示最佳解决方案。

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

示例输出:

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 + ".");
    }
}

1 个答案:

答案 0 :(得分:0)

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

由于这种模糊性,在下面的部分你不能选择:

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

即使在您的逻辑中,您也应该采用较低的费用而不是较高的optCost <= cost

如果你清楚这种歧义,你应该关注的部分是我提到的部分。

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