组合优化

时间:2010-10-13 09:03:58

标签: algorithm optimization math graph

假设我们有一个连通和无向图:G =(V,E)。

连接集的定义:如果该组中的每个点都在远离同一组中任何其他点的T-1个边缘内,则属于G的V的一组点形成有效的连接集,T是数字小组中的分数。

请注意,连接集只是G的连接子图,没有边但有点。

我们在连接集上定义了一个任意函数F,即给定任意连接集CS F(CS)将给出一个实数值。

如果他们的联合不是连接集,则说两个连接集是不相交的。

有关视觉说明,请参阅下图: 在图中,红色,黑色,绿色点集都是有效的连接集,绿色集与红色集不相交,但黑色集与红色集不相交。 alt text

现在的问题是: 我们想从G中找到一堆不相交的连接集,这样: (1)每个连接集至少有K个点。 (K是全局参数)。 (2)它们的函数值之和,即max(ΣF(CS))最大化。

除了详尽的搜索之外,是否有任何有效的算法可以解决这样的问题? THX!

例如,图形可以是2D欧几里得平面中的平面图形,连通集合CS的函数值F可以定义为CS中所有点的最小边界矩形的面积(最小边界)矩形是包围CS中所有点的最小矩形。

4 个答案:

答案 0 :(得分:3)

如果您可以定义您的函数并证明它是Submodular Function(类似于连续优化中凸度的属性),那么有非常有效的(强多项式)算法可以解决您的问题,例如: Minimum Norm Point

要证明您的函数是Submodular,您只需要证明以下内容:

Definition of Submodularity

最小标准点算法有几种可用的实现,例如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+cs2F(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)

我会使用动态编程。您可以将问题重新定义为节点着色问题:

  • 您的目标是为每个节点指定一种颜色。 (换句话说,你正在寻找节点的颜色)
  • 可用颜色为黑白色。
  • 为了判断颜色,你必须检查“最大连接的黑色节点集”的集合。
    • 如果感应子图已连接,则称一组黑色节点连接
    • 一组连接的黑色节点被称为最大集合中没有一个节点在原始图中没有包含在集合中的黑色邻居)
  • 您的目标是找到最大化ΣF(CS)的着色。 (这里总结“最大连接的黑色节点集”)
  • 您的原始帖子中指定了一些额外的约束。

也许您可以寻找一种类似于以下内容的算法

  • 选择一个节点
  • 尝试将所选节点着色为白色
    • 查找最大化ΣF(CS)
    • 的剩余节点的着色
  • 尝试将所选节点着色为黑色
    • 查找最大化ΣF(CS)
    • 的剩余节点的着色

每次将节点着色为白色,就可以检查图形是否已经“可分解”(我编写了这个词。它不是官方的):

  • 如果部分着色的图形包含一对未通过任何不包含白色节点的路径连接的非白色节点,则称为“可分解”图形。

如果您的部分彩色图表是可分解的,那么您可以将问题分成两个子问题。

编辑:我添加了另一个想法并再次将其删除。 :)