Leg*_*end 6 python algorithm numpy linear-programming scipy
这个问题来自我在这里发布的相关问题.@mhum建议我的问题属于覆盖问题领域.我尝试将我的问题编码为最小集合覆盖问题,目前我有一个这种形式的数据集:
Set Cost
(1,2) 1
(1) 1
(1,2,3) 2
(1) 2
(3,4) 2
(4) 3
(1,2) 3
(3,4) 4
(1,2,3,4) 4
Run Code Online (Sandbox Code Playgroud)
目标是找到一个覆盖所有数字的好套装,并试图将总成本降至最低.我的数据集很大,至少有30000套(大小从5-40个元素不等),就像这样.是否有任何好的贪婪实现来解决这个问题,还是我自己实现这个?我不是LP的专家,但任何可以解决这个问题的LP解算器(来自numpy/scipy)都是可以接受的.
有一种众所周知的用于集合封面的贪婪近似算法,它也可以用您选择的任何语言轻松实现.算法本身在这里描述:
http://en.wikipedia.org/wiki/Set_cover_problem#Greedy_algorithm
它是如此简单,最简单的事情就是从头开始编写它.
值得注意的是,它也是已知用于集合覆盖的最佳多项式时间近似算法.这意味着要获得更好的最坏情况性能(更紧凑的结果集),您需要具有非多项式运行时间(=大型集的慢速算法).
不幸的是,维基百科条目实际上并没有涵盖加权集合覆盖,这就是这里的情况.扩展很简单,例如:
http://pages.cs.wisc.edu/~shuchi/courses/880-S07/scribe-notes/lecture03.pdf
一些更有用的笔记:
http://www.cs.ucr.edu/~neal/non_arxiv/Young08SetCover.pdf http://www.cs.uiuc.edu/class/sp08/cs473/Lectures/lec20.pdf