【问题标题】:Python Packing Optimization by Grouping通过分组进行 Python 打包优化
【发布时间】:2014-06-25 01:52:51
【问题描述】:

我有一个现实世界的问题,我认为需要对我关心的数据数组进行某种比简单排序更大的优化。我将在下面概述问题:

我有一个由不同设备组成的数据集,每个设备都有属性 A 和 B。A 和 B 不相互依赖,但是,我想以特定方式打包其中 3 个设备。

选择的 3 个设备之间的 A 值应该彼此相似。

B 值也应该彼此相似。

例如,在这个数据中,有:

  • 250 台设备(A 和 B 各有一个值)

  • A 的 90 个唯一值

  • B 的 36 个唯一值

最终,这些设备应该三包在一起,分别在 A 值和 B 值之间取得良好的平衡。对于每个属性,如果没有包含每个标准的相同值的三元组,也可以使用相邻的 bin。

我想将这些设备分成 3 个包,因为在限制条件下可以有尽可能多的包。

所以我的问题是:这是一个什么样的组合问题,有什么方法可以在 Python 中实现它?非常感谢有关这些类型问题的任何资源,因为我对这个引人入胜的主题相当陌生。

如果解释的任何部分不清楚,请告诉我,我会尽力澄清。谢谢!

为清晰起见进行编辑: 以下是一些示例数据:

DeviceNumber = [1,2,3,4,5,6]
A = [0.3, 0.3, 0.4, 0.2, 0.3, 0.4]
B = [0.02, 0.04, 0.03, 0.02, 0.02, 0.03]

我希望它对它进行分组,以便

模块 1 将具有设备 1、4、5

模块 2 将具有设备 2、3、6

让我们假设 A 和 B 的数据是正态分布的。

我想我正在尝试将 A 值和 B 值之间的差异最小化,并找到将它们按三组分组的方法。

编辑 2: 所以,数据在起作用,而我现在不在,但这里有一些图表,我用 12 台设备绘制了 A 和 B 的值分布

http://imgur.com/a/Zvdtm

多个设备具有相同的 A 值。这些设备之间也可能具有相似的 B 值。如果是这样,我想将其中三个放在一起,删除它们,然后重复检查值和分组。随着匹配的减少,我想扩大我的分组搜索条件。

我希望这能解决更多问题。再次感谢迄今为止的所有反馈!

【问题讨论】:

  • 如何定义 3 个唯一值之间的相似性?
  • 对于唯一值,相似是什么意思? A 和 B 的唯一值在总共 250 个中的分布有多均匀? A & B 的所有值都有效吗?尺寸有问题吗?
  • 分布相当正常,所有值都有效。这些值是每个设备的固有属性。你指的是什么尺寸?我试图通过对原始帖子的编辑来进一步澄清。
  • 我指的是 a&b 的所有组合以及包装物品的物理尺寸。
  • 也许包装对我来说不是最好的术语,我的意思是值 a 和 b 是我的约束,我必须选择 3 个设备(具有这两个独立值)来打包垃圾桶。因此,本身并没有大小,而是 a 值与 b 值一致性的次要目标之间的相对一致性。

标签: python algorithm optimization


【解决方案1】:

您的问题似乎是标准聚类分析,特别是k-medoids。鉴于 k-medoids 的工作方式,您不需要从集合中删除集群,您只需将 k 设置为 n / 3。

似乎没有实现该算法的“权威”k-medoids Python 包,但pyCluster 看起来很合理(只有基于 C 的文档)。 SciPy.cluster 中明显没有它。

鉴于您在图像中呈现的示例数据,您最终会得到类似这样的 k-medoids 聚类:

【讨论】:

    【解决方案2】:

    这不是一个答案,但我需要的澄清不适合评论。

    首先,如果您可以通过更多地说明您要完成的工作来减少问题的抽象性,那将有很大帮助。

    我希望它对它进行分组,以便模块 1 具有设备 1、4、5

    {1, 4, 5} 表示什么?是(0.3, 0.2, 0.3)从 A 中提取的吗?我不这么认为。 (0.02, 0.02, 0.02) 从 B 中提取也没有。这两个集合的并集也没有意义。

    对于每个属性,如果没有包含每个条件的相同值的三元组,也可以使用相邻的 bin。

    如何选择“相同的值”?

    看起来里面可能隐藏着一个有趣的问题,但是很难理解任务规范。

    【讨论】:

    • 谢谢。我尝试添加更多信息作为编辑。我希望这能把事情弄清楚一点。
    【解决方案3】:

    如果条件实际上类似于示例数据,您可以创建一个包含的元组列表

        [(a[ii]+b[ii], ii)...]
    

    然后对列表进行排序,从两端一次拉出 3 个,直到在中间相遇。这将得到最相似的组合。

    【讨论】:

    • 感谢回复,我明天试试!
    猜你喜欢
    • 1970-01-01
    • 2014-01-23
    • 2012-07-01
    • 1970-01-01
    • 2014-07-04
    • 2023-03-22
    • 1970-01-01
    • 2015-06-16
    • 2018-07-27
    相关资源
    最近更新 更多