我想构建一个树分解:http://en.wikipedia.org/wiki/Tree_decomposition我有一个和弦图和一个完美的消除顺序。我遵循previous thread给出的建议, 即:
构造一个非常好的(通常)和弦图的树分解:找到一个完美的消除顺序,枚举最大值 cliques(候选者是一个顶点和出现的邻居 在订购之后),使用每个集团作为分解节点和 将它连接到它相交的排序中的下一个集团。
然而,这不起作用,我无法弄清楚为什么。请考虑以下示例:
完美淘汰排序:
['4', '3', '5', '7', '6', '2', '0', '1']
弦图:
树分解:
我正在使用python,我目前的算法如下:
T=nx.Graph()
nodelist=[]
for i in eo:
vertex=str(i)
bag=set()
bag.add(vertex)
for j in chordal_graph.neighbors(str(i)):
bag.add(str(j))
T.add_node(frozenset(bag))
nodelist.append(frozenset(bag))
chordal_graph.remove_node(str(i))
for node1 in range(len(nodelist)):
found=False
for node2 in range(node1+1,len(nodelist)):
if found==False and len(nodelist[node1].intersection(nodelist[node2]))>0:
T.add_edge(nodelist[node1],nodelist[node2])
found=True
nx.draw(T)
p.show()
其中eo
是完美订购的列表,' chordal_graph'是networkx
的图表对象。
答案 0 :(得分:2)
这就是我的(糟糕的,事实证明)建议。您的树分解有一些不是最大的集团,即{2,0,1},{0,1}和{1}。候选集团列表是
{4, 5, 6} (maximal)
{3, 2} (maximal)
{5, 6, 2, 0} (maximal)
{7, 2, 1} (maximal)
{6, 2, 0, 1} (maximal)
{2, 0, 1} (not maximal: subset of {6, 2, 0, 1})
{0, 1} (not maximal: subset of {6, 2, 0, 1})
{1} (not maximal: subset of {6, 2, 0, 1})
然后分解应该看起来像
{3, 2}
|
{4, 5, 6}----{5, 6, 2, 0}
|
{7, 2, 1}
|
{6, 2, 0, 1},
也是错误的,因为0个顶点没有连接。对不起。
我应该做的是暂时搁置最大条件并将每个集团K连接到下一个用属于K的顶点的候选者。这确保K中的每个顶点至少存在于另一个中。后续集团也出现在连接目标中。然后分解看起来像这样
{4, 5, 6}----{5, 6, 2, 0}
|
{6, 2, 0, 1}
|
{3, 2}----{2, 0, 1}----{7, 2, 1}
|
{0, 1}
|
{1}
并且您可以通过以相反的顺序检查每个集团是否是其父集的超集来拼接出非最大集团,如果是,则将其父集的子集重新表示为它。
{4, 5, 6}----{5, 6, 2, 0}
|
{3, 2}----{6, 2, 0, 1}----{7, 2, 1}