Immaginate un albero binario invertito con i nodi A, B, C, D, E, F a livello 0. nodi G, H, I a livello 1, nodo J a livello 2, e il nodo K al livello 3.Implementazione di un tipo speciale di coda di multiprocessing in Python
livello 1: G = func (a, B), H = func (C, D), I = func (e, F)
livello 2: J = func (G, H)
Livello 3: K = func (J, I).
Ogni coppia di nodi sul Livello 0 deve essere elaborata nell'ordine, Ogni coppia di nodi sul Livello 1 può essere elaborata in qualsiasi ordine ma il risultato deve essere elaborato al livello successivo come mostrato, e così via fino alla fine con il risultato finale, K.
Il problema reale è un problema di geometria computazionale in cui una sequenza di solidi si fondono insieme. A è adiacente a B che è adiacente a C, e così via. Il fusibile risultante di A e B (G) è adiacente al fusibile di C e D (H). La miccia risultante di J e I (K) è il risultato finale. Quindi non puoi fondere G e I poiché non sono adiacenti. Se il numero di nodi su un livello non è una potenza di 2, si finisce con un'entità pendente che deve essere elaborata un livello ulteriore.
Poiché il processo di fusione è computazionalmente costoso e richiede molta memoria ma è molto parallelo, vorrei utilizzare il pacchetto multiprocessing Python e qualche forma di coda. Dopo aver calcolato G = func (A, B), vorrei inserire il risultato G nella coda per il calcolo successivo di J = func (G, H). Quando la coda è vuota, l'ultimo risultato è il risultato finale. Tieni presente che il file mp.queue non produrrà necessariamente risultati FIFO, poiché I = func (E, F) potrebbe terminare prima di H = func (C, D)
Ho trovato alcune (cattive) soluzioni ma sono sicuro che c'è una soluzione elegante appena oltre la mia portata. Suggerimenti?
Perché il livello = 0 deve essere elaborato in ordine, ma il livello = 1 può essere elaborato in qualsiasi ordine? Non è sufficiente scegliere due foglie conosciute e fonderle in un singolo nodo? – Stephen
Non sono corretto nel dire che i nodi devono essere elaborati in ordine. Devono essere trattati in termini di adiacenza. A è adiacente a B è adiacente a C e così via per il livello 0. Puoi fare func (A, B) o func (B, C) ma non func (A, C). Allo stesso modo al livello 1, G è adiacente a H è adiacente a I. Puoi fare func (G, H) o func (H, I) ma non func (G, I). – user90855