【问题标题】:Packing problem : items into constrained bins (Solution to singular matrix)包装问题:物品放入受约束的箱中(奇异矩阵的解决方案)
【发布时间】:2019-06-13 14:40:22
【问题描述】:

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

我有一组容器,每个容器的最大容量为 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。

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

我尝试构建线性联立方程并使用 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 求解。

【问题讨论】:

  • 这听起来像线性规划,但不完全是。如果你不熟悉这项技术,你至少应该看看基础知识,以备将来需要。

标签: java algorithm sorting matrix packing


【解决方案1】:

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

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

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

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

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

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

物品:4d、3b

最初将 2 d 分配给 bin 0,另外 2 d 分配给 bin 1。

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

算法然后找到可以容纳 b 的完整容器,它只有 bin 0,并尝试在那里重新分配 1 个 d 类型的项目。它可以做到这一点,因为 bin 1 仍然有 1 个开放容量并且可以容纳类型 d(但不是 b),现在我们在 bin 0 中有剩余的 b 类型项目的可用容量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多