python - 精确覆盖问题,但对解决方案中子集的精确数量有限制
问题描述
我对精确覆盖和类似问题相对较新,所以请多多包涵。假设我有一个典型的精确覆盖问题,即。给定一组X和一组X的子集S,我想找到完全覆盖X的S * ( S 的子集)。但是,我希望解决方案S * 恰好包含k 个元素。此外,一种解决方案就足够了。
我知道 Knuth 的算法 X 旨在返回所有可能的解决方案。我应该只运行 Knuth 的算法并遍历解决方案,直到找到具有k个元素的解决方案,还是(我怀疑)有更好的方法?我正在使用 Python 顺便说一句。
对于上下文,X的大小 <100 但S的大小可以是 10^6。k在 <10 时相对较小。
解决方案
如果k
很小,您可以简单地尝试添加k
额外元素,并复制每个子集k
时间,每个副本都包含一个k
额外元素。
另一种方法是将精确覆盖问题作为整数线性程序求解,并使用 ILP 求解器求解。然后,您将有 0-1 个变量x_i
来说明i
第 th 子集是否包含在解决方案中,并具有防止重叠集包含在解决方案中的约束。在这个公式中,为了提供一个完全包含k
子集的覆盖,您只需有一个额外的约束sum(x_i) = k
.
也可以修改算法 X 以直接处理约束。只需计算到目前为止您选择了多少行,如果您已经选择了k
,则直接失败,无需进一步搜索。同样,忽略行数少于的解决方案k
。
推荐阅读
- spring-boot - 使用自定义身份验证令牌调用 setAuthentication 后,SecurityContextHolder 返回 null
- java - 检测文件中的行尾
- angular - 在填充组件变量之前调用 Reactive Forms 异步验证器
- java - Android SQLite:W / System.err:java.io.FileNotFoundException无法从资产复制数据库
- xcode - 预览时如何在 Mac Catalyst 中为依赖项指定 Mac OSX 部署目标
- upgrade - 如何在 UBUNTU 上安装稳定和新鲜的 Pandoc?
- java - JPA 存储库读取、删除和保存具有旧 ID 的对象
- windows - Windows 中的 Ansible 文件处理/blockinfile 模块
- database - 如何设计一个多个用户可以拥有同一个对象(冰箱)的数据库?
- scala - 使用 gatling 将 json 中的变量保存并获取到另一个场景