假设我们有一个连通和无向图:G =(V,E)。
连接集的定义:如果该组中的每个点都在远离同一组中任何其他点的T-1个边缘内,则属于G的V的一组点形成有效的连接集,T是数字小组中的分数。
请注意,连接集只是G的连接子图,没有边但有点。
我们在连接集上定义了一个任意函数F,即给定任意连接集CS F(CS)将给出一个实数值。
如果他们的联合不是连接集,则说两个连接集是不相交的。
有关视觉说明,请参阅下图: 在图中,红色,黑色,绿色点集都是有效的连接集,绿色集与红色集不相交,但黑色集与红色集不相交。
现在的问题是: 我们想从G中找到一堆不相交的连接集,这样: (1)每个连接集至少有K个点。 (K是全局参数)。 (2)它们的函数值之和,即max(ΣF(CS))最大化。
除了详尽的搜索之外,是否有任何有效的算法可以解决这样的问题? THX!
例如,图形可以是2D欧几里得平面中的平面图形,连通集合CS的函数值F可以定义为CS中所有点的最小边界矩形的面积(最小边界)矩形是包围CS中所有点的最小矩形。
答案 0 :(得分:3)
如果您可以定义您的函数并证明它是Submodular Function(类似于连续优化中凸度的属性),那么有非常有效的(强多项式)算法可以解决您的问题,例如: Minimum Norm Point
要证明您的函数是Submodular,您只需要证明以下内容:
最小标准点算法有几种可用的实现,例如Matlab Toolbox for Submodular Function Optimization
答案 1 :(得分:2)
我怀疑是否存在一种有效的算法,因为对于完整的图形,例如,如果不知道每个子图上的F值,就无法解决问题(除非你对F有假设:单调性为实例)。
然而,我会选择非确定性算法。尝试模拟退火,过渡为:
答案 2 :(得分:1)
对于这样的一般F
,草拟优化算法并非易事,远非强力方法。
例如,由于我们想要找到 CS 的束,其中F( CS )被最大化,我们是否应该假设我们想要实际找到最大值(ΣF( CS ))所有 CS 或所有可能的 CS 的最高F
值,最大值(F(cs) I 的))?我们不确定
此外,F是任意的,我们无法估计F(cs+p1) > F(cs) => F(cs+p1+p2) > F(cs)
的概率。
但是,我们仍然可以讨论它:
似乎我们可以从问题中推断出我们可以独立地处理每个 CS ,这意味着如果n = F(cs1)
添加任何 cs2 (与脱节) cs1 )对n
值没有影响。
这似乎也是可信的,这是我们应该能够获得一些收益的地方,F的计算可以从 CS 的任何一点开始,一般来说,如果CS = cs1+cs2
,F(CS) = F(cs1+cs2) = F(cs2+cs1)
。
然后我们想在算法中注入memoization,以便在 CS 一点一点地长大以便找到最大值时加快进程(F( cs ))[考虑到F一般,动态编程方法,例如从一个由所有点组成的CS开始,然后逐渐减少它,似乎没有太大的兴趣]。
理想情况下,我们可以从由点组成的CS开始,将其扩展为1,检查并存储F值(对于每个子集)。每个测试首先检查F
值是否存在以便不计算它;然后重复该过程以获得另一个点等...,找到最大化F的最佳子集。对于大量的点,这是非常冗长的体验。
更合理的方法是尝试随机点并将CS增长到给定大小,然后尝试与前一阶段获得的较大CS不同的另一个区域。可以尝试评估上面解释的概率,并根据结果以某种方式指导算法。
但是,由于缺少F属性,我们可以期望通过memoization(如存储F(p1,...,pn)对所有子集进行指数空间)。并且具有指数复杂性。
答案 3 :(得分:1)
我会使用动态编程。您可以将问题重新定义为节点着色问题:
也许您可以寻找一种类似于以下内容的算法
每次将节点着色为白色,就可以检查图形是否已经“可分解”(我编写了这个词。它不是官方的):
如果您的部分彩色图表是可分解的,那么您可以将问题分成两个子问题。
编辑:我添加了另一个想法并再次将其删除。 :)