当前位置: 首页 > 知识库问答 >
问题:

求一个图算法:如何让图开心?

岳茂
2023-03-14

背景:

如下图所示,图的左边有一个无向图。顶点由S2的S1表示...S6,并且边由顶点之间的线段表示。每条边都有一个权重(边附近的数字),可以是正的,也可以是负的。

定义:

在图中,如果一个简单的循环有奇数条负边,则称为冲突循环,如果一个偶数(或零)条负边,则称为一致循环。在下图的左侧,例如,该图有两个冲突循环(S1-S2-S3-S1和S2-S3-S4-S2),其他循环是一致的。如果一个图没有冲突循环,则称为快乐。

目标:

通过删除一些边来使图形满意,同时确保成本(删除边的权重的绝对值之和)最低。在下图中,例如,在移除边缘(红线段)后,没有冲突的循环。因此,图形变得快乐,并且成本仅为2。

共有2个答案

寇丰
2023-03-14

我为这个问题写了一个求解器(名为“符号图平衡”)。它基于固定参数算法,如果只需要删除很少的边,该算法速度很快。该方法在论文“基于分隔符的符号图平衡数据约简”中描述。

闾丘昊然
2023-03-14

这个问题是NP难的,通过从最大割减少。给定一个最大割的实例,将所有边权重乘以-1。这个问题的约束要求删除边以消除所有奇数循环,即我们需要找到最大权重二部子图。

这个问题实际上相当于2标签唯一标签覆盖问题。目标是将每个顶点着色为黑色或白色,以最小化(i)连接不同颜色顶点的正边(ii)连接相同颜色顶点的负边的总成本。删除所有这些边是原始问题的有效解决方案。相反,给定一组要删除的有效边,我们可以确定一个着色。我希望有一种基于半定规划的近似算法(松弛可以用于分支和定界)。

但是,除非您熟悉组合优化,否则我建议的算法是整数规划。如果我们删除edgee,则让x(e)为1,如果我们不删除edge,则让x(e)为0。

minimize sum_{edges e} cost(e) x(e)
subject to
for every simple cycle C with an odd number of negative edges,
    sum_{edges e in C} x(e) >= 1
for each edge e, x(e) in {0, 1}

求解器将完成大部分工作。问题是处理我写的指数数量的约束。最简单的做法是生成所有简单的循环,并给求解器整个程序。另一种可能性是用约束的子集求解最优性,测试解决方案是否真的有效,如果无效,则引入一个或多个缺失的约束。要做测试,尝试对未删除的子图进行双色处理,这样由正边连接的顶点具有相同的颜色,由负边连接的顶点具有不同的颜色。贪婪地着色;如果我们卡住了,那么就有一个奇怪的循环出错了。

更复杂的是,可以通过一种称为列生成的技术来解决编写的程序。

 类似资料:
  • 我正在解决编程中一个有趣的问题。它是这样的:我们不断地给一个图添加无向边,直到这个图(或子图)是连通的(即我们可以使用某种路径从那个子图中的每个顶点到达任何其他顶点)。图一连接起来我们就停下来。例如,如果我们有顶点1,2,3和4,我们希望子图1,2,3是连通的。假设我们有边(3,4),然后(2,3),然后(1,4),然后(1,3)。我们只需要添加前3条边来连接子图,然后我们停止(边1,3是不需要的

  • GraphX包括一组图算法来简化分析任务。这些算法包含在org.apache.spark.graphx.lib包中,可以被直接访问。 PageRank算法 PageRank度量一个图中每个顶点的重要程度,假定从u到v的一条边代表v的重要性标签。例如,一个Twitter用户被许多其它人粉,该用户排名很高。GraphX带有静态和动态PageRank的实现方法 ,这些方法在PageRank object

  • 我想给图例新增一些文字描述,期望在图表底部新增一个图例和图例的文字描述。预期的布局效果是,文字左对齐,图例右对齐,并且文字和图例在同一行。 有什么图表库可以实现这种比较特殊定制的逻辑吗?

  • 1.自我介绍 2.成绩排名 3.相机标定 标定的参数 4.项目用到模型的介绍,是不是开源的 5.帧差法 6.腐蚀 膨胀的作用 7.腐蚀的运算细节 原理 8.内存泄漏产生原因 影响 9.static关键字的作用 10.反问

  • 视图(在本例中,ViewPager)有自己的保存和恢复状态的实现,我依靠它在设备旋转后将ViewPager保持在同一页面上。 当ViewPager在活动中时,它工作得非常好。我滚动到一个页面,旋转设备,它仍然在那个页面上。在SaveInstanceState中不需要任何代码。 我已经把那个活动转化成了一个片段。现在,ViewPager无法保持其状态!如果我滚动到一个页面并旋转设备,它会返回到第1页

  • 大家好,我有一个TestNG测试套件,它按顺序执行测试。但在它开始运行测试之前。它打开所需数量的浏览器,然后逐个运行测试。我想将此行为更改为打开一个浏览器,运行test/s并关闭浏览器。然后打开另一个浏览器,运行test/s并关闭,依此类推。这可能吗? 我在IntelliJ上使用TestNG,JAVA。示例测试套件: 所有的测试都继承了主类,它有@BeforeClass和@AfterClass方法