2010-09-14 8 views
6

Sto cercando di sviluppare un'applicazione C# che generi un elenco di tutte le permutazioni possibili, entro un limite e un costo. Ad esempio, ho una lista di 80 posti di lavoro. Ogni lavoro ha un valore (1-5) (tipicamente 3) e ogni ingegnere ha un limite di quanto possono fare, in genere un valore di 20.C# ha ordinato l'algoritmo

Al momento ho iniziato producendo un elenco di tutti combinazioni possibili (n!/(k! * (nk)! dove n è il numero totale di lavori e k è 2) Il collegamento tra ogni lavoro deve essere ponderato con la distanza tra ogni lavoro

Da qui io vorrebbe scegliere un lavoro iniziale iniziale e produrre un elenco di tutte le possibili combinazioni di lavori (dal lavoro iniziale) fino al limite di 20 e quindi ordinato sulla somma del peso. Il percorso con il peso più basso vince e viene assegnato a l'ingegnere Il mio problema è che non so come affrontare questo - quale struttura dati sarebbe la migliore?

In genere ci sono circa 6-8 ingegneri (a seconda del carico di lavoro), avevo programmato di instradare ogni ingegnere uno alla volta - una volta che un percorso era stato assegnato a un altro ingegnere, quei lavori sarebbero stati rimossi dalla lista e un nuovo avvia il lavoro selezionato con una nuova serie di combinazioni generate. Sembra un approccio accettabile?

Qualsiasi assistenza sarebbe gradita.

+1

questo suona fondamentalmente come un problema di matematica, invece di un problema C#. (sebbene entrambi siano molto vicini): –

+1

Problema dello zaino ripetuto? – dtb

+6

C'è una libreria C# per fare permutazioni, combinazioni, prodotti cartesiani e altre pratiche funzioni combinatorie qui: http://www.codeproject.com/KB/recipes/Combinatorics.aspx –

risposta

1

Non v'è alcun algoritmo efficiente per risolvere questo problema. Userò un algoritmo genetico (non trova necessariamente la soluzione ottimale ma trova una soluzione accettabile).