关于算法:组合优化

Combinatorial optimization

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

连通集的定义:属于G的V的一组点形成有效的连通集,当该组中的每个点都在距同一组中任何其他点的T-1边之内时,T是数字组中的点数。

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

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

如果两个并集不是联合集,则称它们不相交。

有关直观说明,请参见下图:
在图中,红色,黑色,绿色点集都是有效的连接集,绿色集与红色集不相交,而黑色集与红色集不相交。
alt


如果您可以定义函数并证明它是一个子模函数(性质类似于连续优化中的凸性),那么可以使用非常有效的(强多项式)算法来解决您的问题,例如最低规范点。

要证明您的功能是次模块化的,您只需要证明以下内容:

Definition

最小范数点算法有几种可用的实现方式,例如用于亚模块功能优化的Matlab工具箱


我怀疑是否有一种有效的算法,因为例如对于一个完整的图,您无法在不知道每个子图上F的值的情况下解决问题(除非您假设F:例如单调性)。

尽管如此,我还是去寻找一种不确定的算法。尝试模拟退火,转换为:

  • 从集合中删除一个点(如果它保持连接状态)
  • 将一个点从一组移到另一组(如果它们保持连接)
  • 删除一套
  • 添加一个点集

祝你好运,这似乎是个难题。


我会使用动态编程。您可以将问题改写为节点着色问题:

  • 您的目标是为每个节点分配一种颜色。 (换句话说,您正在寻找节点的颜色)
  • 可用的颜色是黑色和白色。
  • 为了判断颜色,您必须检查"最大连接的黑色节点集"的集合。

    • 如果诱导子图已连接,则一组黑色节点称为已连接
    • 连接的黑色节点集称为最大集,该集合中的所有节点在原始图中都没有黑色邻居(不包含在该集合中)
  • 您的目标是找到使?£ F(CS)最大化的着色。 (这里汇总了"最大连接的黑色节点集")
  • 您在原始帖子中指定了一些额外的限制。

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

  • 选择一个节点
  • 尝试将所选节点涂成白色

    • 寻找剩余节点的着色,以使Δ£ F(CS)最大化
  • 尝试将所选节点涂成黑色

    • 寻找剩余节点的着色,以使Δ£ F(CS)最大化

每次将一个节点涂成白色后,您就可以检查该图是否变为"可分解的"(我是用这个词组成的。它不是官方的):

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

如果部分彩色图形是可分解的,则可以将问题分为两个子问题。

编辑:我添加了一个替代主意,然后再次将其删除。 :)


对于这样的通用F来说,起草一种优化的算法并非易事,这与蛮力方法相去甚远。
例如,由于我们想找到一堆CS,其中F(CS)最大化,因此我们假设我们实际上想找到所有CS的max(ΣF(CS))或所有可能CS的最高F值。 ,最大值(F(csi))?我们不
同样,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)

然后,我们想在算法中注入备忘录,以加快CS逐渐长大的过程,从而找到max(F(cs))[考虑了F general,这是一种动态编程方法,用于实例从由所有要点组成的CS开始,然后一点一点地减少它,似乎并没有太大的兴趣]。

理想情况下,我们可以从一个点组成的CS开始,将其扩展一个,检查并存储F值(针对每个子集)。每个测试将首先检查F值是否存在,以便不进行计算;然后对另一个点重复该过程,等等...,找到使F最大化的最佳子集。对于大量点,这是一个非常漫长的体验。

一种更合理的方法是尝试随机点并将CS增长到给定的大小,然后尝试另一个不同于前一阶段获得的更大CS的区域。可以尝试评估上述概率,然后根据结果以某种方式指导算法。

但是,再次由于缺少F属性,我们可以通过记忆(例如为所有子集存储F(p1,...,pn))来期望指数空间的需求。以及指数复杂度。