【发布时间】:2023-02-02 07:46:02
【问题描述】:
我正在寻找有关如何解决以下问题的一些想法。我的主要语言是 R。
我有一套小号和有效子集的集合ü.我想找到所有确切的封面小号从ü完全使用k子集。
例如
- 设置小号= {1,2,3,4}
- 有效子集ü= {{1,2,3,4},{1,2},{3,4},{1,4},{2,3},{1},{4}}
- 什么时候k= 1 有 1 个解 {1,2,3,4}
- 什么时候k= 2 有 2 个解 {{{1,2}{3,4}},{{1,4}{2,3}}}
- 什么时候k= 3 有 1 个解
- 什么时候k>= 4 没有解决方案
在我现实生活中的例子中小号有 500 个元素和ü有 500,000 个子集。每个子集有 1 到 8 个元素。使用线性程序,我发现最小的精确封面大小为 70。我正在寻找所有大小为 70 的封面。理论上,我可以循环线性程序,为现有解决方案添加约束,以找到新的解决方案。我怀疑这会很慢。
如果深度大于k.这适用于较小的示例,但似乎陷入了更深入的搜索。我可以通过切换到 C++ 或使用更高级的数据结构(例如 ZDD)来进行一些改进。
任何替代方法的建议将不胜感激。
下面的代码是我如何使用线性规划找到最小覆盖
library(Rsymphony)
mat #sparse matrix of 1s with dimensions 500 x 500,000
dir <- rep("==",500)
rhs <- rep(1,500)
types <- rep("B",500000)
score <- rep(-1,500000)
max <- T
soln <- Rsymphony_solve_LP(score,mat,dir,rhs,max = max,types = types)
【问题讨论】:
-
如果您分享目前拥有的代码,您更有可能在此处获得支持
-
添加了一些代码来展示我如何获得一个最小的封面。找到 1 花了 15 分钟。我想找到所有其他的那个大小。我知道有多个,根据数据的性质,我怀疑它远小于 500k。
标签: r algorithm combinatorics