Algoritmo per la creazione di un orario scolastico


95

Mi chiedevo se esistono soluzioni note per l'algoritmo di creazione di un orario scolastico. Fondamentalmente, si tratta di ottimizzare la "dispersione delle ore" (sia nel caso degli insegnanti che in quello delle classi) per determinate associazioni classe-materia-insegnante. Possiamo presumere di avere gruppi di classi, argomenti di lezione e insegnanti associati tra loro all'ingresso e che l'orario dovrebbe essere compreso tra le 8:00 e le 16:00.

Immagino che probabilmente non esista un algoritmo accurato per questo, ma forse qualcuno conosce una buona approssimazione o suggerimenti per svilupparlo.


2
Grazie per tutte le risposte. Sembra che l'algoritmo richieda ulteriori indagini. Lo considererei un buon soggetto per tesi di laurea o piccola applicazione commerciale. Se ne scrivo uno ve lo farò sapere qui;)
cand

10
Come ha detto Ian Ringrose di StackOverflow a un'altra domanda, "ci sono ancora molti PHD nel software di pianificazione".
Reed Debaets

Risposte:


86

Questo problema è NP-Complete !
In poche parole, è necessario esplorare tutte le possibili combinazioni per trovare l'elenco delle soluzioni accettabili. A causa delle variazioni nelle circostanze in cui il problema si manifesta nelle varie scuole (ad esempio: ci sono vincoli per quanto riguarda le aule ?, Alcune classi sono suddivise in sottogruppi alcune volte ?, È un programma settimanale? ecc.) non esiste una classe di problemi ben nota che corrisponda a tutti i problemi di pianificazione. Forse, il problema dello zaino ha molti elementi di somiglianza con questi problemi in generale.

Una conferma che questo è sia un problema difficile che uno per il quale le persone cercano perennemente una soluzione, è controllare questo (lungo) elenco di strumenti di pianificazione software (per lo più commerciali)

A causa del gran numero di variabili coinvolte, la principale fonte delle quali sono, tipicamente, i desideri del membro della facoltà; -) ..., è tipicamente poco pratico considerare di enumerare tutte le possibili combinazioni . Dobbiamo invece scegliere un approccio che visiti un sottoinsieme degli spazi problema / soluzione.
- Genetic Algorithms , citato in un'altra risposta è (o, IMHO, sembra ) ben attrezzato per eseguire questo tipo di ricerca semi-guidata (il problema è trovare una buona funzione di valutazione per i candidati da conservare per la prossima generazione)
- Grafico Gli approcci di riscrittura sono anche utili con questo tipo di problemi di ottimizzazione combinatoria.

Piuttosto che concentrarmi su particolari implementazioni di un programma generatore automatico di schedulazioni, vorrei suggerire alcune strategie che possono essere applicate, a livello di definizione del problema .
La logica generale è che nella maggior parte dei problemi di programmazione del mondo reale, saranno richiesti alcuni compromessi, non tutti i vincoli, espressi e impliciti: saranno pienamente soddisfatti. Pertanto ci aiutiamo:

  • Definizione e classificazione di tutti i vincoli noti
  • Ridurre lo spazio problematico, manualmente, fornendo una serie di vincoli aggiuntivi .
    Questo può sembrare controintuitivo ma, ad esempio, fornendo un programma iniziale parzialmente riempito (diciamo circa il 30% delle fasce orarie), in un modo che soddisfi pienamente tutti i vincoli, e considerando questo programma parziale immutabile, riduciamo significativamente il tempo / spazio necessario per produrre soluzioni candidate.
    Un altro modo in cui i vincoli aggiuntivi aiutano è ad esempio l'aggiunta "artificialmente" di un vincolo che impedisce l'insegnamento di alcune materie in alcuni giorni della settimana (se questo è un programma settimanale ...); questo tipo di vincoli si traduce nella riduzione degli spazi problema / soluzione, senza, tipicamente, escludere un numero significativo di buoni candidati.
  • Garantire che alcuni dei vincoli del problema possano essere calcolati rapidamente. Ciò è spesso associato alla scelta del modello di dati utilizzato per rappresentare il problema; l'idea è quella di essere in grado di scegliere rapidamente (o eliminare) alcune delle opzioni.
  • Ridefinire il problema e consentire la rottura di alcuni vincoli, alcune volte (tipicamente verso i nodi finali del grafo). L'idea qui è di rimuovere alcuni dei vincoli per riempire gli ultimi pochi slot nella pianificazione, o di fare in modo che il programma di generazione automatica della pianificazione si interrompa prima di completare l'intera pianificazione, fornendoci invece un elenco di una dozzina circa plausibile candidati. Un essere umano è spesso in una posizione migliore per completare il puzzle, come indicato, possibilmente rompendo alcuni dei vincoli, utilizzando informazioni che non sono tipicamente condivise con la logica automatizzata (es. Regola "Nessuna matematica nel pomeriggio" può essere infranta in alcune occasioni per il corso "matematica e fisica avanzata" oppure "È meglio infrangere uno dei requisiti del signor Jones piuttosto che uno dei requisiti della signora Smith ... ;-))

Nella correzione di bozze di questa risposta, mi rendo conto che è piuttosto timido nel fornire una risposta definitiva, ma è nondimeno piena di suggerimenti pratici. Spero che questo aiuti, con quello che, dopo tutto, è un "problema difficile".


1
Risposta fantastica, accurata ed elaborata, grazie per i suggerimenti e la menzione su NP-Completezza (era anche una mia ipotesi).
cand

3
Hai qualche citazione che spieghi la completezza NP di questo problema?
Don

49

È un disastro. un pasticcio reale. Per aggiungere alle risposte, già molto complete, voglio segnalare la mia esperienza familiare. Mia madre era un'insegnante e una volta era coinvolta nel processo.

Si scopre che avere un computer per farlo non è solo difficile da codificare di per sé, è anche difficile perché ci sono condizioni che sono difficili da specificare a un programma per computer preconfezionato. Esempi:

  • un insegnante insegna sia nella tua scuola che in un altro istituto. Chiaramente, se finisce lì la lezione alle 10.30, non può iniziare in sede alle 10.30, perché ha bisogno di tempo per fare i pendolari tra gli istituti.
  • due insegnanti sono sposati. In generale, è considerata una buona pratica non avere due insegnanti sposati nella stessa classe. Questi due insegnanti devono quindi avere due classi differenti
  • due insegnanti sono sposati e il loro bambino frequenta la stessa scuola. Di nuovo, devi impedire ai due insegnanti di insegnare nella classe specifica in cui si trova il loro bambino.
  • la scuola ha strutture separate, come un giorno la classe è in un istituto e un altro giorno la classe è in un altro.
  • la scuola ha laboratori condivisi, ma questi laboratori sono disponibili solo in determinati giorni feriali (per motivi di sicurezza, ad esempio, dove è richiesto personale aggiuntivo).
  • alcuni insegnanti hanno preferenze per la giornata libera: alcuni preferiscono il lunedì, alcuni il venerdì, altri il mercoledì. Alcuni preferiscono venire la mattina presto, altri più tardi.
  • non dovresti avere situazioni in cui hai una lezione di dire, storia alla prima ora, poi tre ore di matematica, poi un'altra ora di storia. Non ha senso per gli studenti, né per l'insegnante.
  • dovresti distribuire gli argomenti in modo uniforme. Non ha senso avere i primi giorni della settimana solo matematica e poi il resto della settimana solo letteratura.
  • dovresti dare ad alcuni insegnanti due ore consecutive per fare i test di valutazione.

Come puoi vedere, il problema non è NP-completo, è NP-folle.

Quindi quello che fanno è avere un grande tavolo con piccoli inserti di plastica e spostano gli inserti finché non si ottiene un risultato soddisfacente. Non iniziano mai da zero: normalmente partono dall'orario dell'anno precedente e apportano modifiche.


12
"NP-insane" - ottimo nome;) Sono d'accordo che si tratta di un problema davvero complesso, grazie per i commenti sul trattamento "nel mondo reale" di questo problema. Anche mio padre e la mia ragazza sono insegnanti e so che la maggior parte delle scuole ha tavoli con inserti di plastica - mi ha portato a pensare a un possibile algoritmo per questo problema - perché, se un uomo può risolverlo, forse sarà possibile scrivere come algoritmo.
cand

10
quello che vuoi scrivere è un sistema esperto: un sistema composto da un mucchio di regole euristiche. Sistemi esperti a parte, questo è un campo in cui gli algoritmi genetici sono tra le migliori scommesse. La difficoltà non sta nel risolvere il problema, non solo. La difficoltà sta anche nell'affermare il problema e i suoi vincoli.
Stefano Borini

1
Hai ragione, il problema richiede di fornire un insieme complesso di condizioni e vincoli da soddisfare, probabilmente con una valutazione di soluzione "accettabile". Sono d'accordo sugli algoritmi genetici, dovrebbero adattarsi bene a questo problema, inoltre penso che sarà meglio iniziare a sviluppare con un semplice insieme di condizioni, e migliorarlo man mano che si ottiene una risposta corretta.
cand

1
Potresti anche tradurre abbastanza direttamente questi vincoli e obiettivi in ​​MAXSAT. Gli algoritmi MAXSAT sono generalmente più affidabili degli algoritmi genetici, ma potresti avere un'esplosione di clausole a causa di obiettivi come le lezioni di matematica dovrebbero essere distribuite durante la settimana.
Jules

26

L' International Timetabling Competition 2007 aveva una traccia per la pianificazione delle lezioni e una traccia per la pianificazione degli esami. Molti ricercatori hanno partecipato a quella competizione. Sono state provate molte euristiche e metaeuristiche, ma alla fine la metaeuristica della ricerca locale (come la ricerca Tabu e la ricottura simulata) ha chiaramente battuto altri algoritmi (come gli algoritmi genetici).

Dai un'occhiata ai 2 framework open source utilizzati da alcuni dei finalisti:


17

Uno dei miei incarichi a metà semestre era una generazione di tavoli scolastici con algoritmo genetico.

L'intero tavolo è un "organismo". Sono stati apportati alcuni cambiamenti e avvertimenti all'approccio degli algoritmi genetici generici:

  • Furono stabilite delle regole per i "tavoli illegali": due classi nella stessa classe, un insegnante che insegnava a due gruppi contemporaneamente, ecc. Queste mutazioni furono immediatamente ritenute letali e un nuovo "organismo" fu subito germogliato al posto del "defunto". Quello iniziale è stato generato da una serie di tentativi casuali per ottenerne uno legale (se insensato). La mutazione letale non è stata conteggiata nel conteggio delle mutazioni nell'iterazione.

  • Le mutazioni "di scambio" erano molto più comuni delle mutazioni "Modifica". I cambiamenti erano solo tra le parti del gene che avevano un senso, non sostituire un insegnante con una classe.

  • Piccoli bonus sono stati assegnati per raggruppare alcune 2 ore insieme, per assegnare la stessa aula generica in sequenza per lo stesso gruppo, per mantenere le ore di lavoro dell'insegnante e il carico di classe continui. Sono stati assegnati bonus moderati per aver dato aule corrette per una determinata materia, mantenendo le ore di lezione entro i limiti (mattina o pomeriggio) e così via. Grandi bonus erano per l'assegnazione del numero corretto di una determinata materia, dato il carico di lavoro per un insegnante, ecc.

  • Gli insegnanti potrebbero creare i loro programmi di carico di lavoro di "voglio lavorare allora", "va bene lavorare allora", "non gli piace lavorare allora", "non posso lavorare allora", con i pesi appropriati assegnati. Intere 24 ore erano ore di lavoro legale, tranne la notte era molto indesiderata.

  • La funzione del peso ... oh sì. La funzione del peso era un prodotto enorme e mostruoso (come nella moltiplicazione) di pesi assegnati a caratteristiche e proprietà selezionate. Era estremamente ripida, una proprietà facilmente in grado di cambiarla di un ordine di grandezza verso l'alto o verso il basso - e c'erano centinaia o migliaia di proprietà in un organismo. Ciò ha portato a numeri assolutamente ENORMI in quanto i pesi e, di conseguenza, hanno bisogno di utilizzare una libreria bignum (gmp) per eseguire i calcoli. Per un piccolo test case di circa 10 gruppi, 10 insegnanti e 10 aule, il set iniziale è iniziato con una nota di 10 ^ -200 qualcosa e si è concluso con 10 ^ + 300 qualcosa. Era totalmente inefficiente quando era più piatto. Inoltre, i valori sono cresciuti molto più lontano con "scuole" più grandi.

  • In termini di tempo di calcolo, c'era poca differenza tra una piccola popolazione (100) per un lungo periodo e una grande popolazione (10k +) per meno generazioni. Il calcolo nello stesso tempo ha prodotto circa la stessa qualità.

  • Il calcolo (su alcune CPU da 1GHz) impiegherebbe circa 1 ora per stabilizzarsi vicino a 10 ^ + 300, generando programmi che sembravano abbastanza belli, per detto test case 10x10x10.

  • Il problema è facilmente paralellizzabile fornendo funzionalità di rete che scambiano i migliori campioni tra i computer che eseguono il calcolo.

Il programma risultante non ha mai visto la luce del giorno fuori dandomi un buon voto per il semestre. Ha mostrato una certa promessa, ma non ho mai avuto abbastanza motivazione per aggiungere alcuna GUI e renderla utilizzabile al grande pubblico.


5
Quindi aprirlo e pubblicizzarlo e provare a coinvolgere alcuni accademici? Riutilizzarlo per ulteriori progetti? Tecnicamente un programma come quello per 300 dipendenti da solo varrebbe i soldi per le scuole per produrre orari ottimali, e loro non si preoccupano di spendere qualche giorno per calcolare geneticamente orari ottimali. Pensa all'elaborazione in batch. Ciao contratti hardware e software;)
jcolebrand

1
Sembra fantastico! Mi chiedo se la funzione peso possa essere eseguita con float nell'intervallo 0..1.
Craig McQueen

1
@ Craig: Qualcosa di così piatto produrrebbe una popolazione che ristagna o addirittura degenera in qualità nel tempo, poiché le mutazioni casuali hanno contribuito a cambiamenti più negativi di quanto l'allevamento / selezione potrebbe compensare. Solo una funzione di qualità estremamente ripida darebbe una crescita costante. Sicuramente la funzione poteva essere normalizzata, ma comunque un gene "migliore" doveva avere una probabilità di sopravvivenza di un ordine superiore.
SF.

9

Questo problema è più difficile di quanto sembri.

Come altri hanno accennato, questo è un problema NP-completo, ma analizziamo cosa significa.

Fondamentalmente, significa che devi guardare a tutte le possibili combinazioni.

Ma "guarda" non ti dice molto cosa devi fare.

Generare tutte le combinazioni possibili è facile. Potrebbe produrre un'enorme quantità di dati, ma non dovresti avere molti problemi a comprendere i concetti di questa parte del problema.

Il secondo problema è quello di giudicare se una data combinazione possibile è buona, cattiva o migliore della precedente soluzione "buona".

Per questo è necessario qualcosa di più del semplice "è una possibile soluzione".

Ad esempio, lo stesso insegnante lavora 5 giorni a settimana per X settimane di fila? Anche se questa è una soluzione funzionante, potrebbe non essere una soluzione migliore dell'alternanza tra due persone in modo che ogni insegnante faccia una settimana ciascuno. Oh, non ci hai pensato? Ricorda, queste sono le persone con cui hai a che fare, non solo un problema di allocazione delle risorse.

Anche se un insegnante potesse lavorare a tempo pieno per 16 settimane di fila, potrebbe essere una soluzione non ottimale rispetto a una soluzione in cui si tenta di alternare gli insegnanti, e questo tipo di bilanciamento è molto difficile da integrare nel software.

Per riassumere, per molte molte persone varrà molto, produrre una buona soluzione a questo problema. Quindi, non è un problema facile da analizzare e risolvere. Preparati a stabilire alcuni obiettivi che non sono al 100% e chiamarli "abbastanza buoni".


1
Bene, direi che è piuttosto difficile conoscere tutti i vincoli all'inizio, ha bisogno di esperienza e approfondimento della questione. Preferisco dividere il problema in due parti separate e svilupparle contemporaneamente. La prima sarà la struttura generale dell'algoritmo - dicendo come dovrebbe popolare la "prossima generazione dell'orario", piuttosto una bozza di meccanismo, senza troppa "logica soggettiva" dietro (probabilmente algoritmo genetico). Il secondo sarà un provider di regole con una serie di vincoli che controllano la "correttezza" dell'orario - può essere semplice all'inizio e migliorato in seguito.
cand

8

Il mio algoritmo di pianificazione degli orari, implementato in FET (Free Timetabling Software, http://lalescu.ro/liviu/fet/ , un'applicazione di successo):

L'algoritmo è euristico. L'ho chiamato "scambio ricorsivo".

Input: un insieme di attività A_1 ... A_n e i vincoli.

Output: un insieme di orari TA_1 ... TA_n (la fascia oraria di ogni attività. Le stanze sono escluse qui, per semplicità). L'algoritmo deve mettere ogni attività in una fascia oraria, rispettando i vincoli. Ogni TA_i è compreso tra 0 (T_1) e max_time_slots-1 (T_m).

Vincoli:

C1) Base: elenco di coppie di attività che non possono essere simultanee (ad esempio A_1 e A_2, perché hanno lo stesso insegnante o gli stessi studenti);

C2) Molti altri vincoli (esclusi qui, per semplicità).

L'algoritmo di programmazione (che ho chiamato "scambio ricorsivo"):

  1. Ordina le attività, prima le più difficili. Passaggio non critico, ma velocizza l'algoritmo forse 10 volte o più.
  2. Prova a posizionare ciascuna attività (A_i) in una fascia oraria consentita, seguendo l'ordine sopra, una alla volta. Cerca uno slot disponibile (T_j) per A_i, in cui inserire questa attività rispettando i vincoli. Se sono disponibili più slot, scegline uno casuale. Se nessuno è disponibile, esegui lo scambio ricorsivo:

    a . Per ogni fascia oraria T_j, considera cosa succede se metti A_i in T_j. Ci sarà un elenco di altre attività che non concordano con questa mossa (ad esempio, l'attività A_k è nello stesso slot T_j e ha lo stesso insegnante o gli stessi studenti di A_i). Conserva un elenco di attività in conflitto per ogni fascia oraria T_j.

    b . Scegli uno slot (T_j) con il minor numero di attività in conflitto. Supponiamo che l'elenco delle attività in questo slot contenga 3 attività: A_p, A_q, A_r.

    c . Posiziona A_i in T_j e rendi A_p, A_q, A_r non allocato.

    d . Prova ricorsivamente a posizionare A_p, A_q, A_r (se il livello di ricorsione non è troppo grande, diciamo 14, e se il numero totale di chiamate ricorsive contate dal passaggio 2) all'inizio di A_i non è troppo grande, diciamo 2 * n), come nel passaggio 2).

    e . Se posizionato correttamente A_p, A_q, A_r, torna con successo, altrimenti prova altre fasce orarie (vai al passaggio 2 b) e scegli la successiva fascia oraria migliore).

    f . Se tutti (o un numero ragionevole di) intervalli di tempo sono stati tentati senza successo, tornare senza successo.

    g . Se siamo al livello 0 e non siamo riusciti a posizionare A_i, posizionalo come nei passaggi 2 b) e 2 c), ma senza ricorsione. Ora abbiamo 3 - 1 = 2 altre attività da inserire. Vai al passaggio 2) (qui vengono utilizzati alcuni metodi per evitare di andare in bicicletta).


1
FET mi è stato molto utile. Grazie @Liviu Lalescu!
Noel Llevares

6

AGGIORNAMENTO: dai commenti ... dovrebbe avere anche l'euristica!

Io andrei con Prolog ... poi userei Ruby o Perl o qualcosa del genere per ripulire la tua soluzione in una forma più carina.

teaches(Jill,math).
teaches(Joe,history).

involves(MA101,math).
involves(SS104,history).

myHeuristic(D,A,B) :- [test_case]->D='<';D='>'.
createSchedule :- findall(Class,involves(Class,Subject),Classes),
                  predsort(myHeuristic,Classes,ClassesNew),
                  createSchedule(ClassesNew,[]).
createSchedule(Classes,Scheduled) :- [the actual recursive algorithm].

Sono (ancora) in procinto di fare qualcosa di simile a questo problema ma utilizzando lo stesso percorso che ho appena menzionato. Prolog (come linguaggio funzionale) semplifica davvero la risoluzione dei problemi di NP-Hard.


1
Il prologo è certamente un ottimo linguaggio per esprimere i problemi richiesti, tuttavia come fai notare: il problema è NP-completo, se non NP-Hard. Ciò significa che Prolog potrebbe non essere abbastanza veloce per un'implementazione pratica.
Poindexter

3
se ha qualcosa a che fare con NP e non saremo soddisfatti per approssimazione, qualsiasi algoritmo deterministico farà schifo esponenzialmente :)
Gabriel Ščerbák

1
L'obiettivo, quindi, è quello di implementare un'euristica efficace ... per esempio un semplice algoritmo di pianificazione di 9 attività richiede 3.078 secondi per essere completato, ma con una più piccola euristica implementata per Windows, lo stesso problema richiede solo: 0,123 secondi
Reed Debaets

2
HAHA, prolog (da solo) NON RISOLVERÀ MAI MAI QUESTO. Scusa per le lettere maiuscole, ma ho avuto la stessa idea 10 o 15 anni fa e ho fallito totalmente. Non che fosse lento, no. Semplicemente non potrebbe risolvere nessun caso del mondo reale;)!
Karussell




3

Lavoro su un motore di pianificazione ampiamente utilizzato che fa esattamente questo. Sì, è NP-Complete; i migliori approcci cercano di approssimare una soluzione ottimale. E, naturalmente, ci sono molti modi diversi per dire qual è la soluzione "migliore": è più importante che i tuoi insegnanti siano soddisfatti dei loro programmi o che gli studenti partecipino a tutte le loro classi, per esempio?

La domanda più importante in assoluto che devi risolvere all'inizio è cosa rende un modo di programmare questo sistema migliore di un altro ? Cioè, se ho un programma con la signora Jones che insegna matematica alle 8 e il signor Smith che insegna matematica alle 9, è meglio o peggio di uno con entrambi che insegnano matematica alle 10? È meglio o peggio di uno con la signora Jones che insegna alle 8 e il signor Jones che insegna alle 2? Perché?

Il consiglio principale che darei qui è di dividere il problema il più possibile - forse corso per corso, forse insegnante per insegnante, forse stanza per stanza - e lavorare prima sulla risoluzione del sotto-problema. Lì dovresti ritrovarti con più soluzioni tra cui scegliere e devi sceglierne una come la più probabile ottimale. Quindi, lavorare per fare in modo che i sotto-problemi "precedenti" tengano conto delle esigenze dei sotto-problemi successivi nel valutare le loro potenziali soluzioni. Quindi, forse lavora su come uscire da situazioni dipinte nell'angolo (supponendo che non puoi anticipare quelle situazioni in problemi secondari precedenti) quando arrivi a uno stato di "nessuna soluzione valida".

Un pass per l'ottimizzazione della ricerca locale viene spesso utilizzato per "rifinire" la risposta finale e ottenere risultati migliori.

Si noti che in genere abbiamo a che fare con sistemi altamente limitati di risorse nella programmazione scolastica. Le scuole non passano tutto l'anno con molte stanze vuote o insegnanti seduti nella sala per il 75% della giornata. Gli approcci che funzionano meglio in ambienti ricchi di soluzioni non sono necessariamente applicabili nella pianificazione scolastica.


2

Ho progettato algoritmi commerciali sia per l'orario delle lezioni che per quello degli esami. Per la prima ho usato la programmazione intera; per il secondo un'euristica basata sulla massimizzazione di una funzione obiettivo scegliendo slot swap, molto simile al processo manuale originale che si era evoluto. Le cose principali per far accettare tali soluzioni sono la capacità di rappresentare tutti i vincoli del mondo reale; e che i programmatori umani non siano in grado di vedere modi per migliorare la soluzione. Alla fine la parte algoritmica è stata abbastanza semplice e facile da implementare rispetto alla preparazione dei database, dell'interfaccia utente, della capacità di riportare statistiche come l'utilizzo delle stanze, l'educazione degli utenti e così via.


1

In generale, la programmazione con vincoli è un buon approccio a questo tipo di problema di pianificazione. Una ricerca su "programmazione con vincoli" e pianificazione o "pianificazione basata su vincoli" sia all'interno dello stack overflow che su Google genererà alcuni buoni riferimenti. Non è impossibile: è solo un po 'difficile da pensare quando si utilizzano metodi di ottimizzazione tradizionali come l'ottimizzazione lineare o intera. Un risultato sarebbe: esiste un programma che soddisfi tutti i requisiti? Questo, di per sé, è ovviamente utile.

In bocca al lupo !


1

Puoi prenderlo con algoritmi genetici, sì. Ma non dovresti :). Può essere troppo lento e la regolazione dei parametri può richiedere troppo tempo, ecc.

Esistono altri approcci di successo. Tutti implementati in progetti open source:

  • Approccio basato su vincoli
    • Implementato in UniTime (non proprio per le scuole)
    • Puoi anche andare oltre e utilizzare la programmazione Integer. Fatto con successo all'università di Udine e anche all'università di Bayreuth (ero coinvolto lì) utilizzando il software commerciale (ILOG CPLEX)
    • Approccio basato su regole con euristisc - Vedi pianificatore Drools
  • Euristiche diverse: FET e mia

Vedi qui per un elenco di software di pianificazione


0

Penso che dovresti usare l'algoritmo genetico perché:

Dai anche un'occhiata a: una domanda simile e un'altra


0

Non so nessuno sarà d'accordo con questo codice ma ho sviluppato questo codice con l'aiuto del mio algoritmo e sta lavorando per me in ruby, spero che possa aiutare coloro che lo stanno cercando nel codice seguente il periodflag, dayflag subjectflag e il teacherflag sono l'hash con l'id corrispondente e il valore del flag che è booleano. Qualsiasi problema contattami ....... (-_-)

periodflag.each do | k2, v2 |

            if(TimetableDefinition.find(k2).period.to_i != 0)
                subjectflag.each do |k3,v3|
                    if (v3 == 0)
                        if(getflag_period(periodflag,k2))
                            @teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
                            @teacherlists=Employee.find(@teachers)
                            teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle] 
                            teacherflag.each do |k4,v4|
                                if(v4 == 0)
                                    if(getflag_subject(subjectflag,k3))
                                        subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
                                        if subjectperiod.blank?
                                            issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
                                            if issubjectpresent.blank?
                                                isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
                                                if isteacherpresent.blank?
                                                    @finaltt=TimetableAssign.new
                                                    @finaltt.timetable_struct_id=@timetable_struct.id
                                                    @finaltt.employee_id=k4
                                                    @finaltt.section_id=section.id
                                                    @finaltt.standard_id=standard.id
                                                    @finaltt.division_id=division.id
                                                    @finaltt.subject_id=k3
                                                    @finaltt.timetable_definition_id=k2
                                                    @finaltt.timetable_day_id=k1
                                                    set_school_id(@finaltt,current_user)
                                                    if(@finaltt.save)

                                                        setflag_sub(subjectflag,k3,1)
                                                        setflag_period(periodflag,k2,1)
                                                        setflag_teacher(teacherflag,k4,1)
                                                    end
                                                end
                                            else
                                                @subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
                                                @finaltt=TimetableAssign.new
                                                @finaltt.timetable_struct_id=@subjectdetail.timetable_struct_id
                                                @finaltt.employee_id=@subjectdetail.employee_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @finaltt.subject_id=@subjectdetail.subject_id
                                                @finaltt.timetable_definition_id=k2
                                                @finaltt.timetable_day_id=k1
                                                set_school_id(@finaltt,current_user)
                                                if(@finaltt.save)

                                                    setflag_sub(subjectflag,k3,1)
                                                    setflag_period(periodflag,k2,1)
                                                    setflag_teacher(teacherflag,k4,1)
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.