Gli algoritmi di ordinamento topologico possono fornire vari ordini di risultato diversi, quindi non è sufficiente prendere i primi elementi e assumere che siano indipendenti.
Invece dell'ordinamento topologico suggerisco di ordinare le attività in base al numero di margini di dipendenza in entrata. Quindi, per esempio se il tuo grafico ha A -> B, A -> C, B -> C, D -> C lo ordinerai come A [0], D [0], B [1] , C [3] dove [i] è il numero di bordi in entrata.
Con l'ordinamento topologico, è possibile anche eseguire il gotting A, B, D, C. In tal caso, non sarebbe facile scoprire che è possibile eseguire A e D in parallelo.
Si noti che dopo che un'attività è stata completamente elaborata, è necessario aggiornare le attività rimanenti, in particolare quelle che erano dipendenti dall'attività completata. Tuttavia, se il numero di dipendenze in un task è limitato a un numero relativamente piccolo (ad esempio qualche centinaia), è possibile fare affidamento su qualcosa come radix/bucket-sort e mantenere la struttura di ordinamento aggiornata in tempo costante.
Con questo approccio, è anche possibile avviare facilmente nuove attività, una volta terminata una singola attività parallela. Basta aggiornare i conteggi delle dipendenze e avviare tutte le attività che ora hanno 0 dipendenze in entrata.
Si noti che questo approccio presuppone che si disponga di una potenza di elaborazione sufficiente per elaborare tutte le attività che non hanno dipendenze nello stesso momento. Se disponi di risorse limitate e ti preoccupi di una soluzione ottimale in termini di tempo di elaborazione, dovresti investire più sforzi, poiché il problema diventa NP-difficile (come già accennato).
Quindi, per rispondere alla tua domanda iniziale: Sì, hai praticamente ragione, tuttavia, ti mancava spiegare come determinare quelle attività indipendenti in modo efficiente (vedi il mio esempio sopra).
Che ne dici di eseguire in modo ricorsivo ogni dipendenza in parallelo prima di eseguire l'attività dipendente? Avrai bisogno di una contabilità per assicurarti che ogni attività venga eseguita una volta sola, ma altrimenti sembra semplice ed efficiente. –