子图同构算法-VF2(java实现)

子图同构算法-VF2(java实现)

  最近在项目中用到了子图同构算法VF2,自己查找的时候发现csdn上没有太详细的博客,所以在这里记录一下。内容主要来自一篇论文(A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs)

一、什么是VF2算法

  VF2算法是一种子图同构算法,而子图同构我们可以这样定义:
  假设有两个图 H=(VH,EH) H=(VH,EH) 和图 G=(V,E) G=(V,E) 子图同构即从HG存在这样一个函数 f:VH→V 并且 (u,v)∈EH(u,v)∈EH同样成立 f 叫做子图同构的一个映射。

  在VF2算法中,可以将查询图表示为 queryGraph,把数据图表示为 targetGraph,引入一个中间状态 state,用于记录我们当前子图同构进行到的状态。 在每一个中间状态中,VF2算法计算要添加到当前状态state的候选节点对 P(S)(分别由查询图和数据图中的一个节点组成),是否满足 可行性规则,如果该节点对可以满足 可行性规则那么就将其添加到当前状态state中并更新当前状态,整个过程递归的进行。
  其中 可行性规则一共包含五条,这五条规则确保了子图同构过程的正确性。为了方便代码实现,本文将这五条规则归结为三条,每条通过一个java方法实现。分别是:

  1. 前驱和后继规则:对于查询节点的每一个前驱节点和后继节点,目标节点一定存在与之对应的。

  2. 1-look-ahead规则:在查询图中与查询节点邻接,以查询节点为起点/终点并且属于以已经匹配顶点为起点/终点的部分的数量一定小于等于在数据图中对应部分的数量。

  3. 2-look-ahead 规则:在查询图中查询节点与既不是已匹配顶点也不和以匹配顶点相邻的点也应该与数据图中的对应部分满足第二条规则。

  根据这几条规则递归的进行匹配最终可以判断在数据图中是否包含查询图。

二、VF2算法的代码实现(java)

  本文递归的判断目标图是否包含查询图:

private boolean matchRecursive(State state, Graph targetGraph, Graph queryGraph){
		
		if (state.depth == queryGraph.nodes.size()){	// Found a match
			state.matched = true;
			return true;
		} else {	// Extend the state
			ArrayList> candidatePairs = genCandidatePairs(state, targetGraph, queryGraph);
			for (Pair entry : candidatePairs){
				if (checkFeasibility(state, entry.getKey(), entry.getValue())){
					state.extendMatch(entry.getKey(), entry.getValue()); // extend mapping
					if (matchRecursive(state, targetGraph, queryGraph)){	// Found a match
						return true;
					}
					state.backtrack(entry.getKey(), entry.getValue()); // remove the match added before
				}
			}
		}
		return false;
	}

  其中 genCandidatePairs方法用于生成当前状态的所有候选对,checkFeasibility方法用于检查添加词匹配项的可行性。

  以下是我们编写的方法用于判断 可行性规则是否满足:
验证 规则一的方法:

	private Boolean checkPredAndSucc(State state, int targetNodeIndex , int queryNodeIndex) {
		
		Node targetNode = state.targetGraph.nodes.get(targetNodeIndex);
		Node queryNode = state.queryGraph.nodes.get(queryNodeIndex);
		int[][] targetAdjacency = state.targetGraph.getAdjacencyMatrix();
		int[][] queryAdjacency = state.queryGraph.getAdjacencyMatrix();
		for (Edge e : queryNode.

你可能感兴趣的:(java,数据结构)