本文根据PuLP文档翻译而来,原文请参考
https://pythonhosted.org/PuLP/CaseStudies/a_set_partitioning_problem.html
集合分区问题
集合分区问题确定如何将一个集合(S)中的项目划分为更小的子集。S中的所有项目必须包含在一个且仅包含一个分区中。相关问题是:
- 集合分包- 所有项目必须包含在零个或一个分区中;
- 集合覆盖 - 所有项目必须至少包含在一个分区中。
在这个案例研究中,婚礼策划师必须确定婚礼的客人座位分配。为了模拟这个问题,桌子被建模为分区,邀请参加婚礼的嘉宾被建模为S的元素。婚礼策划者希望最大化所有桌子的总幸福感。
可以通过显式枚举每个可能的子集来建模集合划分问题。虽然这种方法确实变得难以处理大量项目(不使用列生成),但它确实具有以下优点:分区的目标函数系数可以是非线性表达式(如幸福),并且仍然可以解决此问题使用线性编程。
首先,我们使用allcombinations()生成所有可能的桌座位列表。
#create list of all possible tables
possible_tables = [tuple(c) for c in pulp.allcombinations(guests, max_table_size)]
然后我们创建