Combinatorial optimization
假设我们有一个连通的无向图:G =(V,E)。
连通集的定义:属于G的V的一组点形成有效的连通集,当该组中的每个点都在距同一组中任何其他点的T-1边之内时,T是数字组中的点数。
请注意,连通集只是G的连通子图,没有边,但有点。
我们在连接集上定义了一个任意函数F,即给定一个任意连接集CS F(CS)将给我们一个实数值。
如果两个并集不是联合集,则称它们不相交。
有关直观说明,请参见下图:
在图中,红色,黑色,绿色点集都是有效的连接集,绿色集与红色集不相交,而黑色集与红色集不相交。
现在的问题是:
我们想从G中找到一堆不相交的连接集,以便:
(1)每套连接装置至少有K个点。 (K是全局参数)。
(2)将它们的函数值之和即max(?£ F(CS))最大化。
除了穷举搜索之外,是否有任何有效的算法可以解决此类问题?
谢谢!
例如,该图可以是二维欧几里得平面中的平面图,并且连通集CS的函数值F可以定义为CS中所有点的最小边界矩形的面积(最小边界矩形是包围CS中所有点的最小矩形。
如果您可以定义函数并证明它是一个子模函数(性质类似于连续优化中的凸性),那么可以使用非常有效的(强多项式)算法来解决您的问题,例如最低规范点。
要证明您的功能是次模块化的,您只需要证明以下内容:
最小范数点算法有几种可用的实现方式,例如用于亚模块功能优化的Matlab工具箱
我怀疑是否有一种有效的算法,因为例如对于一个完整的图,您无法在不知道每个子图上F的值的情况下解决问题(除非您假设F:例如单调性)。
尽管如此,我还是去寻找一种不确定的算法。尝试模拟退火,转换为:
- 从集合中删除一个点(如果它保持连接状态)
- 将一个点从一组移到另一组(如果它们保持连接)
- 删除一套
- 添加一个点集
祝你好运,这似乎是个难题。
我会使用动态编程。您可以将问题改写为节点着色问题:
- 您的目标是为每个节点分配一种颜色。 (换句话说,您正在寻找节点的颜色)
- 可用的颜色是黑色和白色。
-
为了判断颜色,您必须检查"最大连接的黑色节点集"的集合。
- 如果诱导子图已连接,则一组黑色节点称为已连接
- 连接的黑色节点集称为最大集,该集合中的所有节点在原始图中都没有黑色邻居(不包含在该集合中)
- 您的目标是找到使?£ F(CS)最大化的着色。 (这里汇总了"最大连接的黑色节点集")
- 您在原始帖子中指定了一些额外的限制。
也许您会寻找一种类似以下内容的算法
- 选择一个节点
-
尝试将所选节点涂成白色
- 寻找剩余节点的着色,以使Δ£ F(CS)最大化
-
尝试将所选节点涂成黑色
- 寻找剩余节点的着色,以使Δ£ F(CS)最大化
每次将一个节点涂成白色后,您就可以检查该图是否变为"可分解的"(我是用这个词组成的。它不是官方的):
- 如果部分着色的图形包含一对非白色节点,这些节点未通过不包含白色节点的任何路径连接,则称为"可分解"。
如果部分彩色图形是可分解的,则可以将问题分为两个子问题。
编辑:我添加了一个替代主意,然后再次将其删除。 :)
对于这样的通用
例如,由于我们想找到一堆CS,其中F(CS)最大化,因此我们假设我们实际上想找到所有CS的max(ΣF(CS))或所有可能CS的最高
同样,F是任意的,因此我们无法估计具有
的可能性。
但是,我们仍然可以讨论它:
似乎可以从我们可以独立对待每个CS的问题中得出结论,这意味着如果
这似乎也是令人信服的,这是我们应该可以获得的地方,F的计算可以从CS的任意点开始,通常是
然后,我们想在算法中注入备忘录,以加快CS逐渐长大的过程,从而找到max(F(cs))[考虑了F general,这是一种动态编程方法,用于实例从由所有要点组成的CS开始,然后一点一点地减少它,似乎并没有太大的兴趣]。
理想情况下,我们可以从一个点组成的CS开始,将其扩展一个,检查并存储F值(针对每个子集)。每个测试将首先检查
一种更合理的方法是尝试随机点并将CS增长到给定的大小,然后尝试另一个不同于前一阶段获得的更大CS的区域。可以尝试评估上述概率,然后根据结果以某种方式指导算法。
但是,再次由于缺少F属性,我们可以通过记忆(例如为所有子集存储F(p1,...,pn))来期望指数空间的需求。以及指数复杂度。