我想解决一个三维背包问题。
我有很多不同宽度,高度,长度和价值的盒子。我有一个指定的空间,我想把盒子放进那个空间,这样我就能获得最佳的利润。我想用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。
有人可以帮我找另一种方法吗?
答案 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.对称。或者,也许“洪水填充”方法会给你一些想法。