包装问题:将物品放入受限的箱中(求解奇异矩阵)

时间:2019-06-13 14:40:22

标签: java algorithm sorting matrix packing

编辑:我试图用联立方程解决这个问题的方法可能实际上不起作用,任何其他方法将不胜感激。

我有一组容器,每个容器的最大容量为n,以及它们可以包含的一组物品类型。

然后我有一些项目的组合,我想知道我的容器是否可以容纳所有项目。

EG:

Bin 0, capacity 2, item types stored (b,d)
Bin 1, capacity 3, item types stored (b,c)
Bin 2, capacity 2, item types stored (c,d)

尝试存储3d,2c,2b-成功:Bin 0-dd,Bin 1-cbb,Bin 2-dc。

如果一个或多个存在,我需要一个解决方案作为输出,如果没有解决方案,则为null。

注意:箱可以容纳的项目类型数量或项目总数没有限制。

我尝试构造线性联立方程并使用JAMA求解它们,但是矩阵不是奇异的,我认为这意味着无限解/无解。如果有无限的解决方案,那么我只需要其中之一。

    EG I get these equations
    d0 + d2 = 3
    b0 + b1 = 2
    c1 + c2 = 2
    b0 + d0 = 2
    b1 + c1 = 3
    c2 + d2 = 2
    with these variables
    [d0, d2, c1, c2, b0, b1] where d0 is the number of d in bin 0

    Leading to these arrays LHS
    [1.0, 1.0, 0.0, 0.0, 0.0, 0.0],
    [0.0, 0.0, 0.0, 0.0, 1.0, 1.0],
    [0.0, 0.0, 1.0, 1.0, 0.0, 0.0],
    [1.0, 0.0, 0.0, 0.0, 1.0, 0.0], 
    [0.0, 0.0, 1.0, 0.0, 0.0, 1.0],
    [0.0, 1.0, 0.0, 1.0, 0.0, 0.0]]

   RHS
   [3.0, 2.0, 2.0, 2.0, 3.0, 2.0]
    Matrix lhs = new Matrix(lhsArray);
    Matrix rhs = new Matrix(rhsArray, rhsArray.length);
    Matrix ans = lhs.solve(rhs);

我收到一个错误消息,说数组是奇异的。这不是说它无法解决吗?随着解d0 = 2,c1 = 1,b1 = 2,d2 = 1,c2 = 1求解。

1 个答案:

答案 0 :(得分:0)

我建议您按类型对项目进行排序,以便最终得到类型列表以及该类型的数量按递减顺序排列。

然后计算您拥有最多物品的容器的容量。如果您有足够的容量,请添加项目并更新容器,然后重复下一种类型。如果您的剩余容器在任何时候都没有足够的容量容纳列表中的下一类物品,请获取可以包含当前类型的当前已满容器的列表,然后尝试将其当前包含的物品重新分配给无法容纳的物品包含当前类型。如果满容器+空容器的数量不足以容纳所有当前类型,或者无法从当前满容器中重新分配足够的项目,那么您的问题将无法解决。

请注意,可能会有更有效的方法来计划容器分配,但是这种通用方法应该有效,即使存在多个解决方案,也只会返回一个(所需的)解决方案。

编辑:在您的示例中,该算法会将您的项目分类为3d,2b,2c。然后,它将检查d的容量,该容量将为4(来自bin 0的2,来自bin 2的2)。然后,将放置3个d类型项,分别为2 in 0和1 in2。接下来考虑2b。剩余容量为3(来自箱1),因此它将两个物料都放入箱1。最后考虑2c。总容量为2(1号槽中剩余1个,2号槽中剩余1个)。它将相应地放置这些项目,现在您的列表为空,因此它返回一个解决方案(Bin 0:2d; Bin 1:2b,1c; Bin 2:1d,1c)。

另一个示例,显示了重新分配:

Bin 0,容量2(b,d) 箱1,容量3(c,d) Bin 2,容量2(b,c)

项目:4d,3b

最初将2 d分配给bin 0,将其他2分配给bin 1。

现在我们有一个问题-我们只有3b容量,只有2个打开容量(在bin 2中)。

然后,算法找到可以容纳b(仅是bin 0)的完整容器,并尝试在其中重新分配d个类型项中的1个。之所以可以这样做,是因为bin 1仍具有1个未清容量,并且可以容纳类型d(但不包括b),现在我们在bin 0中具有剩余的b类型项可用容量。

请注意,您当然仍然可以将容器实现为矩阵(或可能以任何其他方式),但是此解决方案并不依赖于将它们作为线性方程组求解。