programar para juegos estructura ejemplos datos con codigo busqueda binarios binario arboles arbol python algorithm math graph tree

python - para - juegos con arboles binarios



Algoritmo para generar una descomposición de árbol (1)

Quiero construir una descomposición de árbol: http://en.wikipedia.org/wiki/Tree_decomposition y tengo el gráfico de cordal y un ordenamiento de eliminación perfecto. Estoy siguiendo los consejos dados en un hilo anterior , a saber:

Para construir una descomposición de árbol no agradable (en general) de un gráfico de cordal: encuentre un ordenamiento de eliminación perfecto, enumere las camarillas máximas (los candidatos son un vértice y los vecinos que aparecen después en el orden), use cada camarilla como un nodo de descomposición y conéctelo a la siguiente camarilla en el orden en que se cruza.

Sin embargo, esto no funciona y no puedo entender por qué. Considere el siguiente ejemplo:

Perfecto orden de eliminación:

[''4'', ''3'', ''5'', ''7'', ''6'', ''2'', ''0'', ''1'']

Gráfico de cordal:

Descomposición del árbol:

Estoy usando Python y mi algoritmo actual es el siguiente:

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()

donde eo es una lista del ordenamiento perfecto y ''chordal_graph'' es un objeto de gráfico para networkx .


Así que ese fue mi consejo (malo, como resulta). La descomposición de tu árbol tiene algunas camarillas que no son máximas, es decir, {2, 0, 1}, {0, 1} y {1}. La lista de camarillas candidatas es

{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})

Entonces la descomposición debería verse como

{3, 2} | {4, 5, 6}----{5, 6, 2, 0} | {7, 2, 1} | {6, 2, 0, 1},

lo cual también es incorrecto, ya que los 0 vértices no están conectados. Lo siento por eso.

Lo que debería haber hecho es dejar de lado la condición de máxima para el momento y conectar cada camarilla K con el siguiente candidato sembrado con un vértice perteneciente a K. Esto asegura que cada vértice en K que existe en al menos otra camarilla posterior también aparece en el objetivo de la conexión. Entonces la descomposición se ve así

{4, 5, 6}----{5, 6, 2, 0} | {6, 2, 0, 1} | {3, 2}----{2, 0, 1}----{7, 2, 1} | {0, 1} | {1}

y puede empalmar las camarillas no máximas comprobando, para cada camarilla en orden inverso, si se trata de un superconjunto de su elemento primario y, de ser así, reparentándolo a los hijos de sus padres.

{4, 5, 6}----{5, 6, 2, 0} | {3, 2}----{6, 2, 0, 1}----{7, 2, 1}