Imagine un árbol binario invertido con nodos A, B, C, D, E, F en el nivel 0. nodos G, H, I en el nivel 1, nodo J en el nivel 2, y el nodo K en el nivel 3.Implementación de un tipo especial de cola de multiprocesamiento en Python
nivel 1: G = func (a, B), H = func (C, D), i = func (e, F)
nivel 2: J = func (G, H)
Nivel 3: K = func (J, I).
Cada par de nodos en el Nivel 0 debe procesarse en orden, Cada par de nodos en el Nivel 1 puede procesarse en cualquier orden pero el resultado debe procesarse como se muestra en el siguiente nivel, y así sucesivamente hasta que terminemos con el resultado final, K.
El problema real es un problema de geometría computacional en el que una secuencia de sólidos se fusionan. A es adyacente a B, que es adyacente a C, y así sucesivamente. El fusible resultante de A y B (G) es adyacente al fusible de C y D (H). El fusible resultante de J e I (K) es el resultado final. Por lo tanto, no puede fusionar G e I ya que no son adyacentes. Si el número de nodos en un nivel no es una potencia de 2, terminará con una entidad colgante que debe procesarse un nivel más.
Dado que el proceso de fusibles es computacionalmente costoso y requiere mucha memoria, pero es muy paralelo, me gustaría utilizar el paquete de multiprocesamiento de Python y algún tipo de cola. Después de calcular G = func (A, B), me gustaría presionar el resultado G en la cola para el cálculo posterior de J = func (G, H). Cuando la cola está vacía, el último resultado es el resultado final. Tenga en cuenta que el mp.queue no necesariamente producirá resultados FIFO, ya que I = func (E, F) puede terminar antes de H = func (C, D)
He encontrado algunas (malas) soluciones pero estoy seguro de que hay una solución elegante más allá de mi alcance. Sugerencias?
¿Por qué tiene que procesarse el nivel = 0 en orden, pero el nivel = 1 se puede procesar en cualquier orden? ¿No es suficiente elegir dos hojas conocidas y fusionarlas en un solo nodo? – Stephen
No estoy correcto al decir que los nodos deben procesarse en orden. Deben procesarse en términos de adyacencia. A es adyacente a B es adyacente a C y así sucesivamente para el nivel 0. Puedes hacer func (A, B) o func (B, C) pero no func (A, C). Del mismo modo, en el nivel 1, G es adyacente a H y es adyacente a I. Puedes hacer func (G, H) o func (H, I) pero no func (G, I). – user90855