2011-09-27 16 views
5

Opis problemu:jak zastosować programowanie równoległe w problemach z grafem?

jest n tasks iw tych zadań, one might be dependent on the others, co oznacza, jeśli A jest zależny od B, a następnie B musi być zakończone przed zostanie zakończone.

1.Czy sposób, aby zakończyć te zadania tak szybko, jak to możliwe?

2.if take parallelism into account, jak zaprojektować program, aby zakończyć te zadania?

Pytanie:

Wydaje się, że odpowiedź na pierwsze pytanie jest topologiczna sortowania te zadania, a następnie zakończyć je w tej kolejności.

Ale jak wykonać zadanie, jeśli bierze się pod uwagę równoległość?

Moja odpowiedź była pierwszą topologiczną-rodzaj tych zadań, a następnie wybrać te zadania, które są niezależne i zakończyć je, potem odebrać i zakończyć te niezależne te w pozostałej ...

mam rację?

+0

Co powiecie na rekursywne uruchamianie każdej zależności równolegle przed wykonaniem zadania zależnego? Będziesz potrzebował pewnej księgowości, aby upewnić się, że każde zadanie jest wykonywane tylko raz, ale poza tym wydaje się proste i wydajne. –

Odpowiedz

4

Topologiczne algorytmy sortowania mogą dawać różne rozkazy wyników, więc nie można po prostu wziąć kilku pierwszych elementów i założyć, że są niezależne.

Zamiast topologicznego sortowania sugerowałbym sortowanie zadań według liczby przychodzących krawędzi zależności. Na przykład, jeśli twój wykres ma A -> B, A -> C, B -> C, D -> C, sortujesz go jako A [0], D [0], B [1] , C [3] gdzie [i] to liczba przychodzących krawędzi.

Przy sortowaniu topologicznym można również uzyskać A, B, D, C. W takim przypadku nie byłoby łatwo dowiedzieć się, że możesz wykonywać A i D równolegle.

Pamiętaj, że po całkowitym przetworzeniu zadania musisz zaktualizować pozostałe zadania, w szczególności te, które były zależne od ukończonego zadania. Jeśli jednak liczba zależności wchodzących w zadanie jest ograniczona do stosunkowo niewielkiej liczby (powiedzmy kilkaset), można łatwo polegać na czymś takim jak radix/bucket-sort i utrzymywać strukturę sortowania w stałym czasie.

Dzięki takiemu podejściu można łatwo rozpocząć nowe zadania po zakończeniu pojedynczego zadania równoległego. Po prostu zaktualizuj liczbę zależności i uruchom wszystkie zadania, które mają teraz 0 zależności przychodzących.

Należy zauważyć, że to podejście zakłada, że ​​masz wystarczającą moc obliczeniową do przetworzenia wszystkich zadań, które nie mają zależności w tym samym czasie. Jeśli masz ograniczone zasoby i dbasz o optymalne rozwiązanie pod względem czasu przetwarzania, będziesz musiał zainwestować więcej wysiłku, ponieważ problem staje się NP-trudny (jak już wspomniano).

Tak więc, aby odpowiedzieć na twoje oryginalne pytanie: Tak, masz rację, jednak brakowało ci wyjaśnienia, jak efektywnie określić te niezależne zadania (zobacz mój przykład powyżej).

+0

dzięki Franku, mam zamiar zagrzebać. – Alcott

1

Chciałbym spróbować posortować je w ukierunkowanej strukturze lasu z czasem wykonania zadania jako brzegiem waży. Zamów arborescences od najcięższych do najlżejszych i zacznij od najcięższych. Za pomocą tego podejścia można jednocześnie sprawdzić zależności cykliczne.

Użycie równoległości powoduje problem z pojemnikiem, który jest NP-trudny. Spróbuj wyszukać przybliżone rozwiązania tego problemu.

+0

problem z koszem? co to jest? – Alcott

+0

Miałem na myśli oczywiście pakowanie bin. Tak się dzieje, jeśli publikujesz przed pierwszą kawą. – arne

1

Spójrz na Critical Path Method, zaczerpnięte z project management. Zasadniczo robi to, czego potrzebujesz: dane zadania z zależnościami i czasami trwania, produkuje ile czasu zajmie i kiedy aktywować każde zadanie.

(*) Należy pamiętać, że ta technika zakłada nieskończoną liczbę zasobów dla optymalnego rozwiązania. W przypadku ograniczonych zasobów istnieją heurystyki dla zachłannych algorytmów, takich jak: GPRW [aktualny + czas na wykonanie zadań] lub MSLK [minimum total slack czasu].

(*) Należy również pamiętać, że wymaga to poznania [lub przynajmniej oszacowania] czasu wykonania każdego zadania.

Powiązane problemy