algorithm - 组合优化

标签 algorithm optimization math graph

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

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

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

并且我们在连通集上定义了一个任意函数 F,即给定一个任意连通集 CS F(CS) 将为我们提供一个实数值。

如果两个连通集的并集不是连通集,则称它们不相交。

为了直观的解释,请看下图: 图中,红、黑、绿点集都是有效的连通集,绿集与红集不相交,黑集与红集不相交。 alt text

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

除了穷举搜索之外,是否有任何有效的算法来解决此类问题? 谢谢!

例如,图可以是二维欧几里德平面上的平面图,连通集CS的函数值F可以定义为CS中所有点的最小外接矩形的面积(minimum bounding rectangle 是包含 CS 中所有点的最小矩形)。

最佳答案

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

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

Definition of Submodularity

最小范数点算法有几种可用的实现方式,例如Matlab Toolbox for Submodular Function Optimization

关于algorithm - 组合优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3922144/

相关文章:

optimization - Intel Skylake 的统一调度器与 AMD Zen 的单独调度器

c# - 将数字字符串转换为四舍五入的小数 (C#)

algorithm - 最坏情况时间复杂度为 O(n) 的算法是否总是比最坏情况时间复杂度为 O(n^2) 的算法快?

c++ - 增强型 FrogRiverN

python - python 的 NetworkX 中的最低共同祖先

c# - 有没有人有 C++ 和 C# 中的 CRC128 和 CRC256 代码?

optimization - 优化深度网络的超参数

linux - 对于服务器来说,写入大的日志文件比写入较小的日志文件压力更大吗?

c - 奇怪的十六进制到十进制的转换

algorithm - 是否有计算 x 模 y 的乘法阶数的算法(对于 y > 1000 execpt mod(x,y).multipliative_order())?