文章来源:ICPRAM 2015
算法1名称:A星算法计算编辑距离
输入:非空属性图
g
1
=
(
U
1
,
E
1
)
,
q
=
(
V
2
,
E
2
)
g_{1}=(U_{1},E_{1}) , q=(V_{2},E_{2})
g1=(U1,E1),q=(V2,E2).其中
U
1
=
{
u
1
,
.
.
.
,
u
∣
U
1
∣
}
,
V
1
=
{
v
1
,
.
.
.
,
v
∣
v
1
∣
}
U_{1}=\{u_{1},...,u_{|U_{1}|}\},V_{1}=\{v_{1},...,v_{|v_{1}|}\}
U1={u1,...,u∣U1∣},V1={v1,...,v∣v1∣},
输出:从图
g
1
g_{1}
g1转变为图q的代价最小的路径
P
m
i
n
P_{min}
Pmin.
例如 :
[
(
(
u
1
,
v
1
)
,
(
u
2
,
v
2
)
,
(
u
3
,
v
3
)
,
(
u
4
,
v
4
)
,
(
u
5
,
v
5
)
)
(
这
一
个
元
组
表
示
顶
点
映
射
)
,
(
(
(
u
1
,
u
2
)
,
(
v
1
,
v
2
)
)
,
(
(
u
1
,
u
3
)
,
(
v
1
,
v
3
)
)
,
(
(
u
2
,
u
4
)
,
(
v
2
,
v
4
)
)
,
(
(
u
3
,
u
5
)
,
(
v
3
,
v
5
)
)
,
(
(
u
5
,
u
4
)
,
(
v
5
,
v
4
)
)
,
(
(
N
O
N
E
)
,
(
v
3
,
v
4
)
(
这
一
个
元
组
表
示
边
映
射
)
)
]
[((u_{1},v_{1}), (u2,v2),(u3,v3),(u4,v4),(u5,v5) )(这一个元组表示顶点映射), \\ (((u1,u2),(v1,v2)),\\ ((u1,u3),(v1,v3)),\\ ((u2,u4),(v2,v4)),\\ ((u3,u5),(v3,v5)),\\ ((u5,u4),(v5,v4)),\\ ((NONE),(v3,v4)(这一个元组表示边映射))]
[((u1,v1),(u2,v2),(u3,v3),(u4,v4),(u5,v5))(这一个元组表示顶点映射),(((u1,u2),(v1,v2)),((u1,u3),(v1,v3)),((u2,u4),(v2,v4)),((u3,u5),(v3,v5)),((u5,u4),(v5,v4)),((NONE),(v3,v4)(这一个元组表示边映射))]
以上是python中networkx库中使用networkx.graph_edit_distance(
q
q
q,
g
1
g_{1}
g1)的路径。
算法开始:
第一步:初始化集合
O
P
E
N
OPEN
OPEN为空集合,
P
m
i
n
P_{min}
Pmin为空集合。
O
P
E
N
OPEN
OPEN集存放A星算法动态空间搜索的每个节点。
P
m
i
n
P_{min}
Pmin是从
O
P
E
N
OPEN
OPEN集中选取代价最小的元素,即代价最小的编辑路径。
第二步:对于查询图中的顶点
w
∈
V
2
w∈V_{2}
w∈V2,随机选择
u
1
∈
V
1
u_{1}∈V_{1}
u1∈V1,构造映射
O
P
E
N
←
O
P
E
N
∪
{
u
1
→
w
}
OPEN←OPEN∪\{u_{1}→w\}
OPEN←OPEN∪{u1→w}
第三步:在OPEN集合中考虑删除顶点的情况:
O
P
E
N
←
O
P
E
N
∪
{
u
1
→
ε
}
OPEN←OPEN∪\{u_{1}→\varepsilon\}
OPEN←OPEN∪{u1→ε}
第四步:执行5-19行无限循环。满足循环体中的跳出条件,则语句块跳出。
行5,开始计算
P
m
i
n
P_{min}
Pmin。
P
m
i
n
P_{min}
Pmin计算的过程是:从
O
P
E
N
OPEN
OPEN中遍历元素,选择元素代价和最小的元素。其中每个元素“代价和”分为当前元素的实际代价
g
(
p
)
g(p)
g(p)和估计代价
l
b
(
p
)
lb(p)
lb(p)(在其它文献中,也被称作估计代价的下限)。实际代价
g
(
p
)
g(p)
g(p)是指考虑到当前元素(即当前映射路径)顶点和边标签的不同,估计代价是除了映射顶点和边的标签的不同。上述的实际代价和估计代价会在很多文献中都有不同的定义,定义的精确性影响了结果的精确性。在本算法中,只考虑最简单的标签差异的不同。
行6,从
O
P
E
N
OPEN
OPEN集中删除
P
m
i
n
P_{min}
Pmin。
行7-8:完整路径定义:
P
m
i
n
P_{min}
Pmin元素的size,即映射的顶点对数等于min{
∣
U
1
∣
|U_{1}|
∣U1∣,
∣
V
1
∣
|V_{1}|
∣V1∣}。 判断
P
m
i
n
P_{min}
Pmin是否为完整路径,如果为完整路径则返回
P
m
i
n
P_{min}
Pmin。算法结束。
行10-17:如果
P
m
i
n
P_{min}
Pmin不是完整路径,则从
O
P
E
N
OPEN
OPEN中寻找代价最小且为完整路径的元素。行10-12,假设,即
P
m
i
n
P_{min}
Pmin当前的size为
k
k
k。若
k
<
∣
V
1
∣
k<|V_{1}|
k<∣V1∣,则还需要扩展A星搜索树空间的节点,即往
O
P
E
N
OPEN
OPEN集增加元素。增加的元素如算法行12所示:添加未映射的顶点对。(这个地方理解较为抽象,需要结合A星算法的搜索树进行理解)。行15:考虑空顶点映射。从直觉上来讲,图
q
q
q中一个空顶点映射到另外一个图
g
1
g_{1}
g1的非空顶点,是在
q
q
q中增加一个顶点。因此,算法行11-17,是在
O
P
E
N
OPEN
OPEN中添加完整路径。