我正在为下面的场景寻找最佳分配算法。
我们要求说18件。我的货架上的库存如下。
Bin A - 10 Bin B - 6 Bin C - 3 Bin D - 4
算法应按以下顺序提出分类
Bin A(10),Bin D(4),Bin C(3)
真实场景我们有n个不同数量的垃圾箱。我们需要找到最佳组合。目标是最大化分配数量。
你能帮忙吗?
此致 Shaju
答案 0 :(得分:6)
您的问题类似于bin-packing problem和knapsack problem。
查看这些内容并了解如何将这些方法应用于您的问题。
答案 1 :(得分:0)
如果这是一个真实的东西而不是家庭作业,那么你可能会蛮力逃脱。尝试所有箱子的组合,看看哪个是最好的。
在Python中,使用http://www.technomancy.org/python/powerset-generator-python/中的超集函数,然后使用:
>>> bins=[10,6,3,4]
>>> tgt=18
>>> max( [ y<=tgt and (y,x) for (y,x) in [(sum(x),x) for x in powerset(bins)]])
(17, [10, 3, 4])
所以你去:最佳匹配是17,使用10 + 3 + 4。那就是如果你想要选择满足最多可以达到目标数量的满箱。调整味道。
答案 2 :(得分:-1)
你可以试试这个:
步骤1.
按可用空间量对箱子进行分类
最大的bin具有索引0,最小的bin具有索引Z.
挑选箱从索引0开始,直到总空间要么是您正在寻找的,要么您已经得到了太多。如果你有你想要的总数,那就停下来吧。如果没有,请继续。
步骤2.
假设您选择的最后一个bin位于索引L(您已经选择了L + 1个bin)。现在从L下降开始,在索引L-x处交换箱,使用索引Z-x处的箱。通过这些交换,您可以减少总数。在总数低于您要查找的值之前停止交换。如果您有所需的总数,请停止。否则执行第3步。
步骤3.
假设您现在已经选择了索引0和L-X之间以及Z和Z-X之间的区间,并且总数(稍微)高于您要查找的区间。
现在对于0和L-X之间的每个bin,找到索引L-X + 1和Z-X-1之间的最佳bin,你可以将它交换掉以减少总数,这样总数正是你想要的。
这个算法是线性的,让你很有可能找到一套完美的箱子。
我很想知道这是否适合你。