c语言实现判断两个子图是否同构问题_子图同构之VF3

1.子图同构问题描述

​ 首先描述一下子图同构是什么意思,一个图由一系列节点和一系列连接节点的边构成,节点和边都可以有标签,也就是可以给他们按属性分类。

​ 精确点:一个图

equation?tex=G%3D%28V%2CE%29由集合
equation?tex=V和集合
equation?tex=E组成,
equation?tex=V是节点(node)集合,
equation?tex=E是边(edge)集合,且
equation?tex=E%5Csubset+V%5Ctimes+V ,用
equation?tex=L_v表示节点上的标签集合,
equation?tex=L_e表示边上的标签集合,那么每个节点对应的标签由函数(或者说映射)
equation?tex=%5Clambda_v%3AV%5Crightarrow+L_v 确定,每条边对应的标签由函数
equation?tex=%5Clambda_e%3AE%5Crightarrow+L_e 确定。

​ 现在给定两个图

equation?tex=G_1%3D%28V_1%2CE_1%29,
equation?tex=G_2%3D%28V_2%2CE_2%29 ,其中
equation?tex=G_1是比较小的图(我们把它叫做pattern graph),
equation?tex=G_2是比较大的图(我们把它叫做target graph),用集合
equation?tex=M%5Csubset+V_1%5Ctimes+V_2 表示两个图中节点的对应关系。如果节点
equation?tex=u%5Cin+V_1,则
equation?tex=%5Cmu%28u%29%5Cin+V_2表示与节点
equation?tex=u对应的
equation?tex=G_2中的节点;如果节点
equation?tex=v%5Cin+V_2,则
equation?tex=%5Cnu%28v%29%5Cin+V_1表示与节点
equation?tex=v对应的
equation?tex=G_1中的节点。

equation?tex=%5Cbegin%7Barray%7D%5Bb%5D+%7B%7Cc%7Cc%7C%7D++%5Chline++%26+G_1+%26+G_2+%5C%5C++%5Chline+%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB++%26+u+%26+%5Cmu%28u%29++%5C%5C++%5Chline+%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB++%26+%5Cmu%5E%7B-1%7D+%28v%29+%26+v++%5C%5C+%5Chline+%5Cend%7Barray%7D%5C%5C

​ 如果以下6个条件成立,则这两个图是子图同构的。

  1. equation?tex=%5Cforall+u%5Cin+V_1++%5Cquad++%5Cexists+%5Cmu%28u%29%5Cin+V_2%3A%28u%2C%5Cmu%28u%29%29%5Cin+M+%5C%5C
  2. equation?tex=%5Cforall+u%2Cu%5E%7B%27%7D%5Cin+V_1++%5Cquad++u%5Cneq+u%5E%7B%27%7D%5CRightarrow+%5Cmu%28u%29%5Cneq+%5Cmu%28u%5E%7B%27%7D%29++%5C%5C
  3. equation?tex=%5Cforall+%28u%2Cu%5E%7B%27%7D%29%5Cin+E_1++%5Cquad+%5Cexists+%28%5Cmu%28u%29%2C%5Cmu%28u%5E%7B%27%7D%29%29%5Cin+E_2%29+%5C%5C
  4. equation?tex=%5Cforall+u%2Cu%5E%7B%27%7D+%5Cin+V_1++%5Cquad++%28%5Cmu%28u%29%2C%5Cmu%28u%5E%7B%27%7D%29%29+%5Cin+E_2+%5CRightarrow+%28u%2Cu%5E%7B%27%7D%29+%5Cin+E_1+%5C%5C
  5. equation?tex=%5Cforall+u+%5Cin+V_1++%5Cquad++%5Clambda_%7BV_1%7D%28u%29%3D%5Clambda_%7BV_2%7D%28%5Cmu%28u%29%29+%5C%5C
  6. equation?tex=%5Cforall+%28u%2Cu%5E%7B%27%7D%29+%5Cin+E_1++%5Cquad++%5Clambda_%7Be_1%7D%28u%2Cu%5E%7B%27%7D%29%3D%5Clambda_%7Be_2%7D%28%5Cmu%28u%29%2C%5Cmu%28u%5E%7B%27%7D%29%29+%5C%5C

用人话来解释一下:

  1. 对于小图中每个节点,大图中都要有一个对应的节点与之对应,并且这样一对一对的节点构成了集合
    equation?tex=M
  2. 小图中任意两个不一样的节点,他们对应的大图中的节点不能是同一个;
  3. 小图中每条边,大图中都有一条边与之对应,并且他们两端的节点一一对应;
  4. 小图中任意两个节点,如果他们对应的大图中的节点之间有一条边,那么小图中这两个节点之间也得有条边;
  5. 每对对应节点的label要相同,也就是这俩节点类型或属性相同;
  6. 每对对应边的label要相同,也就是说这俩边的类型或属性相同。

​ 综上所述,子图同构简单来说就是,大图中有一个子结构,长得跟小图一模一样,而且这个子结构的节点之间不能多出小图中不存在的边来,如果要去掉最后这个而且,就把上面第4个条件去掉~

2.VF3算法

​ VF3算法的目标是,给定一个小图和一个大图,找出大图中所有与小图同构的子图,这是一个NP-hard问题。整体上,VF3算法是一个树搜索算法,并且想办法去尽可能剪枝。搜索树上的每个节点都是一个状态(state),记为

equation?tex=s,每个
equation?tex=s中包含一系列节点的映射关系,可以想象成一系列key-value对,key都是小图中的节点,value都是大图中的节点。搜索最开始的时候(也就是树的根节点)
equation?tex=s中什么都没有,随着搜索的进行(树高度的增加),
equation?tex=s中的key-value对会一对对增加,假如这个状态中所有的节点对都满足第一节中的6条约束,我们称这个状态为一致状态(consistent state);如果一个一致状态包含的小图中所有的节点,那意味着我们找到了一个大图的子结构与小图同构,称之为目标状态(goal state);如果一个状态是不可能再派生出一致状态的,我们称之为死亡状态(dead state)。

​ 那么现在最大的问题就是两个:

  1. 这棵搜索树怎么组织?
  2. 怎么设计剪枝规则?

下面逐个展开~

A. 总体流程介绍

先来介绍一些符号:

equation?tex=%5Ctilde%7BM%7D%28s%29表示状态
equation?tex=s中的节点映射集合,则
equation?tex=%5Ctilde%7BM%7D%28s%29+%5Csubseteq+M

equation?tex=%5Ctilde%7BM_1%7D%28s%29表示
equation?tex=%5Ctilde%7BM%7D%28s%29中属于
equation?tex=G_1的节点,也就是所有的key,严格点:
equation?tex=%5Ctilde%7BM_1%7D%28s%29%3D%5C%7Bu%5Cin+V_1%3A%5Cexists+%28u%2Cv%29%5Cin+%5Ctilde%7BM%7D%28s%29%2Cv%5Cin+V_2%5C%7D

equation?tex=%5Ctilde%7BM_2%7D%28s%29表示
equation?tex=%5Ctilde%7BM%7D%28s%29中属于
equation?tex=G_2的节点,也就是所有的value,严格点:
equation?tex=%5Ctilde%7BM_2%7D%28s%29%3D%5C%7Bv%5Cin+V_2%3A%5Cexists+%28u%2Cv%29%5Cin+%5Ctilde%7BM%7D%28s%29%2Cu%5Cin+V_1%5C%7D

equation?tex=%5Ctilde%7BG%7D_1%28s%29表示仅包含节点在
equation?tex=%5Ctilde%7BM_1%7D%28s%29中的
equation?tex=G_1的子图,也就是比
equation?tex=%5Ctilde%7BM_1%7D%28s%29加上了边;

equation?tex=%5Ctilde%7BG%7D_2%28s%29表示仅包含节点在
equation?tex=%5Ctilde%7BM_2%7D%28s%29中的
equation?tex=G_2的子图,也就是比
equation?tex=%5Ctilde%7BM_2%7D%28s%29加上了边;

equation?tex=%5Ctilde%7B%5Cmu%7D%28s%2Cu%29表示
equation?tex=%5Ctilde%7BM%7D%28s%29中与
equation?tex=u对应的节点,其中
equation?tex=u%5Cin+V_1,
equation?tex=%5Ctilde%7B%5Cmu%7D%28s%2Cu%29%5Cin+V_2

equation?tex=%5Ctilde%7B%5Cmu%7D%5E%7B-1%7D%28s%2Cv%29表示
equation?tex=%5Ctilde%7BM%7D%28s%29中与
equation?tex=v对应的节点,其中
equation?tex=%5Ctilde%7B%5Cmu%7D%5E%7B-1%7D%28s%2Cv%29%5Cin+V_1,
equation?tex=v%5Cin+V_2

equation?tex=%5Cbegin%7Barray%7D%5Bb%5D+%7B%7Cc%7Cc%7C%7D++%5Chline++%26+V_1+%26+V_2+%5C%5C++%5Chline+%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB++%26+u+%26+%5Cmu%28s%2Cu%29++%5C%5C++%5Chline+%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB++%26+%5Cmu%5E%7B-1%7D+%28s%2Cv%29+%26+v++%5C%5C+%5Chline+%5Cend%7Barray%7D%5C%5C

大致看一下整个流程,上伪代码~

VF3总流程

1:

equation?tex=function+%5C+%5C+VF3%28G_1%2CG_2%29

2:

equation?tex=%5C+%5C+%5C+%5C+%5C+%5C+Solutions%3D%5Cphi

3:

equation?tex=%5C+%5C+%5C+%5C+%5C+%5C+P_f%3DComputeProbabilitys%28G_1%2CG_2%29

4:

equation?tex=%5C+%5C+%5C+%5C+%5C+%5C+N_%7BG_1%7D%3DGenerateNodeSequence%28G_1%2CP_%7Bfeas%7D%29

5:

equation?tex=%5C+%5C+%5C+%5C+%5C+%5C+ClassifyNodes%28G_1%2CG_2%29

6:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值