In primo luogo, questo dovrebbe essere chiesto in qualche posto come stackoverflow . L'ingegneria del software è più della selezione dell'algoritmo.
Sembrerà strano, ma l'algoritmo più facilmente applicabile (la classe di algoritmi davvero) alla tua situazione è Programmazione lineare, o la sua controparte Programmazione intera. l'idea è di codificare i tuoi vincoli come un insieme di equazioni lineari (forse limitate a soluzioni intere) e applicare solutori generici per trovare una soluzione o dimostrare che non esistono.
- Un vantaggio di questo approccio è l'esistenza di soluzioni FOSS espressamente progettate per risolvere rapidamente tali problemi.
- Un altro vantaggio è la capacità di modificare i vincoli ed esprimere molte idee possibili senza apportare modifiche importanti all'algoritmo.
Un modo per fare questo sarebbe definire una variabile binaria x_s, una per ogni studente s e ogni attività che esprima se saranno o meno in quell'attività e p_s, esprimendo se preferiscono o no. Quindi definiamo una lista abbastanza lunga di disuguaglianze (queste possono e dovrebbero essere generate in modo programmatico).
- Per applicare i limiti della dimensione della classe, per ogni attività una somma (x_s1, a) + (x_s2, a) + ... + (x_sn, a) può essere limitata dalla costante preferita.
- Per far rispettare le preferenze, per ogni studente devi anche che (x_s, a1) + (x_s, a2) + ... + (x_s, an) è almeno 1, dove i ai sono limitati ad essere le attività lo studente preferisce.
- Per imporre una sorta di equità, puoi avere un'equazione per ogni coppia di studenti che garantisce che nessuno studente è in più di una attività rispetto all'altra (se tale bilanciamento è desiderato).
- Per tentare di ottenere classi di dimensioni complete, puoi impostare la funzione obiettivo lineare che desideri ottimizzare semplicemente come la somma di tutti gli x_sa.
- Avrai bisogno di altri vincoli per il realismo, per esempio che tutti gli x_sa sono non negativi e che sono limitati di sopra di 1.
Se desideri ulteriore aiuto con questo approccio, Dr. Nathan Axvig è sempre alla ricerca di nuovi progetti di ricerca operativa. Ho parlato con lui a un paio di conferenze, ed è esperto e amichevole. Per citare la sua biografia, "il Dr. Axvig è strongmente interessato a stabilire partnership con aziende, organizzazioni senza scopo di lucro e governi con gli obiettivi comuni di fornire ai propri clienti soluzioni utili e di offrire ai propri studenti un'esperienza preziosa lavorando su reale problemi del mondo reale. A tal fine, il Dr. Axvig ha supervisionato un numero di progetti di consulenza universitari ed è sempre alla ricerca di altro. "