子图同构进阶版-advanced subgraph matching

  1. local candidate reduction
    在之前的compute candidate的基础上增加一个profile选项,profile包含S中每个node的neighbour所拥有的label(可以重复),按照字母顺序排序,在判断candidate时考虑是否G中对应的node(v)的profile包含S中node(u)的profile
    伪代码:

 

candidate_node=list()
for node_u in S:
    for node_v in G:
        if v拥有所有u的label and len(v.neighbours)>=len(u.neighbours) and v的neighbour拥有所有u的neighbour的label:
            candidate_node.append(v)
  1. Global candidate reduction
    这个基本思路就是查看每个node(u)和其对应的candidate(v)的neighbour,如果v的neighbour无法在u的neighbour中找到相对应的node,那么就排除v。一个比较直观的图示:

    Graphs-at-a-time: Query Language and Access Methods for Graph Databases
for 所有node(u)和其candidate(v)的组合T:
    针对每对<u,v>构建一个双向图B,里面的node是u和v的所有neighbour
    u'=u的neighbour
    v'=v的neighbour
    foreach u':
        foreach v':
            如果v'是u'的candidate的话我们就把(u',v')这个edge加到B里面
    构建一个M,使之为B的最大匹配(Maximum matching下面会说怎么找)
    if M里的data node与u的neighbour不相等:
        v就不是u的candidate
        不过这时候我们要把所有u',v'的组合加到T中进行遍历
    直到T里面没有东西了才停止

为了找maximum matching,我们首先需要一个辅助function去寻找augmenting path

方程接受两个input:B:原始的双向图,M:匹配到一半的maximum matching双向图
# 先获取所有free node
U'=U 去掉 M.query_node
V'=V 去掉 M.data_node
构建一个全新的双向图B_m,里面的node是所有u和v
在B_m中加入所有B中的(u,v)edge
在B_m中加入所有M中的(u,v)的反向edge,也即(v,u)edge
对于所有U'和V'中node的组合:
    # 因为U中node不会互相直连,V中node也不会,所以只要有路径就一定是最短的,当然,前提是不重复走同一个edge
    P=找到u'到v'的最短路径.
    if 找到了P:
        return P
    else:
        继续找

以下是find maximum matching的主function
Maximum matching, 也即maximum bipartite matching,目的是找到一个biparite graph的最大匹配,也即尽量多的让左边的node映射到右边的Node上。而算法就是挨个帮助左边的空node找到右边的空node,path可以帮助一路上的pair挨个switch。

方程接受一个input,就是B:原始的双向图
M=一个空双向图
while true:
    P=用前一个function找到B,M之间的任意一个P
    if 找不到P了:
        break
    else:
        # 这里i就是P中edge的序号
        for i in range(1,|P|):
            # 也即第1,3,5,7个edge的时候,这些都是从U到V的edge
            if i%2==1:
                这时候就把这个edge作为新的(u,v)存到M中
            # 当这是从V到U的edge的时候
            else:
                把M中的query node u移除(u这时候是edge的第二个node)
  1. Query processing order
    基本思路就是先process分支少,candidate少的node
u_next=拥有最少candidate的node
min=拥有最少candidate的node的candidate数量
while processing order还没有包含所有的query node:
    foreach 没包含的query node:
        计算搜索需要用的estimate cost(cost of previous node*current node's candidate number*gama^(connections between current node and all node already exist in the processing order))
        把cost最小的一个node加到order里
  1. VF2 rule
    这个是用来提前结束搜索的方法。叫做k-look-ahead
    比如1-look-ahead:
    假设u是query node, v是想加的data node。
    则我们就看u的neighbour和已匹配的所有node的neighbour的重合的node数量 是不是小于等于 v的neighbour和已匹配的所有node的neighbour的重合的node数量。如果成立的话就继续,不成立就终止。
    2-look-ahead:
    在上面的前提上要求那些node也需要属于已匹配的node
    要注意的是induced和noninduced是不同的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图同构算法是一种用于检测两个图是否具有相同结构的算法。在计算机科学和数学领域,图同构是一种等价关系,用于比较两个图的结构。如果两个图具有相同的结构,那么它们被称为同构的。 QuickSI算法是一种基于快速匹配和启发式搜索的图同构算法。该算法使用了一种基于图的表示和匹配的方法,通过快速匹配和启发式搜索来找到两个图的同构关系。 以下是QuickSI算法的基本步骤: 1. 初始化:将每个顶点表示为一个字符串,其中字符串的长度等于顶点的数量。对于每对顶点,创建一个与之匹配的字符串,称为对应顶点的映射。 2. 快速匹配:使用字符串匹配算法(如朴素匹配或Brute-Force匹配)在对应的字符串中进行匹配。在每次匹配失败时,重新开始搜索以避免无限循环。 3. 启发式搜索:通过遍历每对顶点的对应字符串中的相邻字符来逐步逼近图的同构关系。当匹配失败时,停止搜索并考虑其他的候选顶点对。 4. 验证:使用一个已知的图同构测试函数来验证是否找到了正确的同构关系。如果测试函数返回真,则找到了同构关系;否则,重新开始搜索。 QuickSI算法的主要优点是它的时间复杂度较低,通常可以在较短的时间内找到两个图的同构关系。此外,该算法还具有较好的鲁棒性和适应性,可以处理不同类型的图结构。 要了解更多关于QuickSI算法的信息,您可以查阅相关的研究文献或相关资料。同时,您也可以尝试使用该算法来解决实际问题,以更好地理解其应用场景和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值