所以,我有几个集合,我需要找到最少数量的集合,其中包含所有集合中的至少一个元素。为了更具体,我有一组服务器名称,每个服务器都有一个服务窗口。给定特定的持续时间,我想找到覆盖所有给定服务器的最小服务窗口集。
我已经有代码为每台所需的机器生成所有不重叠的 N 分钟时间段的列表。我打算通过生成所有可能的组合来强制它,并选择具有最少数量的唯一元素的组合,但这似乎非常低效,即使我首先将集合减少到所有主机的唯一窗口(尤其是更多比几个系统)。
然后我想我会做一些事情,比如按适合每个时间槽的主机数量对时间槽进行排序,选择主机数量最多的槽,然后为未分配的主机重新生成所有槽的列表,选择最多流行的插槽,重新计算等,直到所有主机都被考虑在内。虽然这会给我一个答案,但它并没有真正让我有机会选择最平衡的集合 - 次要目标是找到一组服务窗口,每个服务的主机数量的标准偏差最小窗户。因此,如果我有 100 台主机,我想优先选择每个窗口提供大约 50 台主机的窗口,而不是执行上述算法可能找到的三个“98、1 和 1”窗口。但如果我的选项是“98, 1, 1” 或 10 个窗口,每个窗口 10 个。我宁愿做这三个。
无论如何,似乎某种图形可以用来表示这个问题,但在我的 CS 路径中,我更多地关注硬件而不是软件,解决图形问题从来都不是我的强项。所以我什至会感谢一些关于在哪里阅读更多关于这个特定问题或适当搜索词的建议。:)