精确(纠错)图匹配算法

时间:2016-01-29 16:32:47

标签: algorithm graph

我正在寻找带有标记顶点和带标签的有向边的图上的不精确图匹配算法。我的任务是检测两个图形的变化,以便将它们显示给开发人员(想想subversion diff)。我已经实现了基于禁忌搜索(this)的优化算法,但我不能让算法考虑我的边缘标签。我的图表最多有120个顶点和200个边缘,因此我可能会使用更慢但更简单的算法来实现。

以下是您的观看乐趣示例:Cfc Chart

1 个答案:

答案 0 :(得分:1)

由于没有人提出现有的算法,我会尝试发明一个......

对于每个顶点,您可以通过将其标签与所有相邻边的标签连接来计算其“签名”。为保持一致性,请按字母顺序对标签进由于边缘是定向的,所以分别连接传入和传出边缘。

这些签名可用于检测顶点集中的变化。首先,在第一个和第二个图中找到具有相同签名的相应顶点。剩余的不成对顶点是添加顶点,删除顶点,具有更改标签的顶点,具有更改边缘连接的顶点以及边缘标签已更改的顶点。您可以通过比较签名并使用某些string matching algorithm选择最佳匹配来关联它们。显然你必须引入一些关键的相似度来区分“它是同一个顶点和许多变化的属性”,“它是一个具有一些偶然签名相似性的新顶点”。

以任何顺序排列第一个图形的所有顶点。创建另一个相同大小的数组。将第二图的匹配顶点放入与第一阵列对应的位置的第二阵列中;对所有完全匹配的顶点和所有修改的顶点执行此操作。对于第二个图形中没有匹配的第一个图形顶点(删除的顶点),将数组单元格保留为空。然后,对于第一个图形中没有匹配的第二个图形顶点(新顶点),将这些顶点添加到第二个数组的末尾,并使用相应数量的空单元格展开第一个数组。

现在,当图表的顶点列在数组中时,边可以表示为二维数组。如果边缘从第i个顶点到第j个顶点,则将其标签放入数组的(i,j)单元格中。

对两个图表执行此操作。由于您构造了两个相同大小的顶点数组,因此您将获得两个大小相同的二维数组,并且具有一对一的对应关系。以直接的方式比较这两个数组允许您检测添加的边,删除的边和带有更改标签的边。