Wyobraź sobie odwrócone drzewo binarne z węzłami A, B, C, D, E, F na poziomie 0. węzły G, H, I na poziomie 1, węzeł J na poziomie 2, a węzłem K w poziomie 3.Implementacja specjalnego typu kolejki do przetwarzania wieloprocesowego w Pythonie
Poziom 1: G = func (a, B), H = func (C, D), i = func (E, F)
Poziom 2: J = func (G, H)
Poziom 3: K = func (J, I).
Każda para węzłów na poziomie 0 musi być przetwarzana w kolejności, każda para węzłów na poziomie 1 może być przetwarzana w dowolnej kolejności, ale wynik musi być na następnym poziomie musi być przetwarzany, jak pokazano, i tak dalej, aż do końca z końcowym wynikiem, K.
Rzeczywistym problemem jest problem geometrii obliczeniowej, w którym sekwencja brył jest połączona ze sobą. A sąsiaduje z B, który sąsiaduje z C, i tak dalej. Powstały bezpiecznik A i B (G) sąsiaduje z bezpiecznikiem C i D (H). Wynikowy bezpiecznik J i I (K) jest wynikiem końcowym. W ten sposób nie można połączyć G i I, ponieważ nie sąsiadują ze sobą. Jeśli liczba węzłów na poziomie nie jest potęgą 2, kończy się na zwisającej jednostce, która musi zostać przetworzona o jeden poziom dalej.
Ponieważ proces bezpiecznika jest kosztowny pod względem obliczeniowym i wymaga dużej ilości pamięci, ale jest bardzo równoległy, chciałbym użyć pakietu wieloprocesorowego Python i pewnej formy kolejki. Po obliczeniu G = func (A, B), chciałbym wypchnąć wynik G do kolejki dla kolejnych obliczeń J = func (G, H). Gdy kolejka jest pusta, ostatnim wynikiem jest wynik końcowy. Należy pamiętać, że parametr mp.queue niekoniecznie musi dawać wyniki FIFO, ponieważ I = func (E, F) może kończyć się przed H = func (C, D)
Wymyśliłem kilka (złych) rozwiązań ale jestem pewien, że istnieje eleganckie rozwiązanie, które leży poza moim zasięgiem. Propozycje?
Dlaczego poziom = 0 musi być przetwarzany w kolejności, ale poziom = 1 może być przetwarzany w dowolnej kolejności? Czy nie wystarczy wybrać dwa znane liście i połączyć je w jeden węzeł? – Stephen
Jestem niepoprawny, mówiąc, że węzły muszą być przetwarzane w kolejności. Muszą być przetwarzane pod kątem dopasowania. A sąsiaduje z B sąsiaduje z C i tak dalej dla poziomu 0. Możesz zrobić func (A, B) lub func (B, C), ale nie func (A, C). Podobnie na poziomie 1, G sąsiaduje z H sąsiaduje z I. Możesz zrobić func (G, H) lub func (H, I), ale nie func (G, I). – user90855