使用Java中的bruteforce解决3D背包问题

时间:2012-01-16 09:54:32

标签: java knapsack-problem

我想解决一个三维背包问题。

我有很多不同宽度,高度,长度和价值的盒子。我有一个指定的空间,我想把盒子放进那个空间,这样我就能获得最佳的利润。我想用bruteforce做这件事。

我正在用Java编程。 我尝试用递归来做,所以:

public void solveBruteforce(double freeX, double freeY, double freeZ) {
   for(int i = 0; i < numOfBoxes; i++) {
      for(int j = 0; j < BoxObject.numOfVariations; j++) {
         if(possible to place box) {
            place(box);
            add(value);
            solveBruteforce(newX, newY, newZ);
         }
      }
   }
   remove(box);
   remove(value);
}

但我会遇到问题,即每一行都有不同的自由x,y和z。

有人可以帮我找另一种方法吗?

1 个答案:

答案 0 :(得分:0)

首先,使用八叉树来跟踪空间中的事物。占用树是一个3D 4度树,每个节点都有占用标志,将您的空间划分为一个有效搜索的地方。如果您想使用某种启发式搜索来放置框,即使您正在尝试所有可能性,这将非常有用。它可以快捷禁止(拥挤)的展示位置。

蛮力将花费时间。但如果这就是你想要的,你需要定义一个排序来尝试排列的排列。

由于您需要多次迭代,因此递归并不是很好,因为您将获得堆栈溢出。

第一个草案备选方案将涉及贪婪算法。拿出最大化你的利润(比如最大)的方框,然后选择下一个最大的方框,找到最适合的方式,依此类推。

但是,假设您想尝试所有可能的组合:

def maximize_profit(boxes,space):
    max_profit = 0
    best_fits = list()
    while(Arranger.hasNext()):
        a_fit,a_profit = Arranger.next(boxes,space)
        if (a_profit == max_profit):
            best_fits.append(a_fit)
        elif (a_profit > max_profit):
            max_profit = a_profit
            best_fits = [ a_profit ]
    return best_fits, max_profit  

关于如何定义编者的想法,考虑从#{space}的可能性中选择#{box}插槽,尊重相同的安排w.r.t.对称。或者,也许“洪水填充”方法会给你一些想法。