类bin packing属性匹配最大化装包问题有哪些成熟算法可参考?
问题对应算法方案解答
你描述的属于带属性约束的最大化装载问题,是经典二分图匹配的扩展场景,也可归为多约束背包的特殊变种,目前有非常成熟的求解方案,可根据你的数据规模和精度要求选择:
精确最优解方案(适合万级及以下数据规模,要求全局最优的场景)
可以直接建模为最大流问题求解,能100%得到全局最优的分配结果,还能直接输出具体分配方案,建图逻辑如下:
- 构造四层有向图:源点 → 所有bag节点 → 所有兼容的bin节点 → 汇点
- 源点到每个bag节点的边容量设为1(每个bag只能被分配一次)
- 每个bag节点到它属性兼容的bin节点的边容量设为1
- 每个bin节点到汇点的边容量设为该bin的槽位上限
- 运行Dinic/ISAP等最大流算法,最终的最大流数值就是可装载的最大bag总数
你给出的示例用该方案建模计算,正好能得到你预期的最优分配结果。
近似启发式方案(适合十万级及以上大规模数据,对运行效率要求高的场景)
你提到的「优先填充可匹配属性最少的bin」思路完全正确,这个就是业内常用的最稀缺资源优先分配策略,在这类属性匹配的调度场景下已经被验证近似最优率可达95%以上,实现简单运行效率极高,优化后执行逻辑可以参考:
- 先统计每个bin的兼容bag总数,按数量从小到大排序(兼容数越少说明资源越稀缺,优先分配避免浪费)
- 遍历排序后的bin,优先给它分配还未被占用、兼容的、同时自身兼容其他bin数量更少的bag(通用性越差的bag越先分配,避免后续无bin可放)
- 直到bin槽位填满或者无可用兼容bag后,处理下一个bin
你提到的Best Fit算法也可以改造后使用:每次取一个未分配的bag,放到有剩余槽位、且剩余槽位最少的兼容bin中即可,不过这类按bag遍历的策略在属性约束场景下的近似最优率会比稀缺资源优先策略低5%~10%左右。
选型建议
如果你的数据量不大,或者业务要求必须得到最优结果,直接用最大流建模求解即可,现有成熟实现非常多,只需调整建图逻辑即可适配你的场景。如果数据规模极大、对调度延迟要求高,直接用你构思的最稀缺优先启发式策略即可,效果完全可以满足绝大多数工业场景需求。
内容的提问来源于stack exchange,提问作者Fabricio Ferreira
相关产品推荐
相关产品推荐

