25

Sto scrivendo un programma di pianificazione con un problema di programmazione difficile. Ci sono diversi eventi, ciascuno con più orari di riunione. Devo trovare una disposizione degli orari delle riunioni in modo tale che ogni pianificazione contenga un determinato evento una sola volta, utilizzando uno dei diversi orari di riunione di ciascun evento.Algoritmo di pianificazione Adattamento ottimale

Ovviamente potrei usare la forza bruta, ma raramente è la soluzione migliore. Immagino che questo sia un problema di informatica relativamente di base, che imparerò una volta che sarò in grado di iniziare a prendere lezioni di informatica. Nel frattempo, preferirei qualsiasi link in cui potrei leggere su questo, o anche solo un nome che potrei Google.

+2

I problemi di pianificazione sono in generale NP-completi, il che significa che non si può fare di meglio * (pensiamo) * rispetto alla forza bruta. Non sono sicuro di questo problema più specifico, però. –

+7

È vero che questi problemi sono solitamente NP-completi e quindi non hanno algoritmi efficienti per soluzioni ottimali, ma ci sono algoritmi efficienti che ottengono risposte ragionevolmente buone nella maggior parte dei casi. Per quanto riguarda le parole chiave, dovrei forse cercare il "problema dell'imballaggio", anche se non è corretto. Potresti anche provare a cercare "algoritmo di scheduling di classe" e vedere cosa trovi. –

+1

"Ogni programma"? Quindi vuoi trovare tutti i modi possibili per partecipare a tutti gli eventi? – Beta

risposta

11

penso che si dovrebbe usare algoritmo genetico perché:

  • È più adatto per le grandi istanze del problema.
  • Produce ridotta complessità temporale sul prezzo di risposta imprecisa (non l'ultimo migliore)
  • È possibile specificare vincoli & preferenze facilmente regolando punizioni di fitness per i più non soddisfatte.
  • È possibile specificare il limite di tempo per l'esecuzione del programma.
  • La qualità della soluzione dipende da quanto tempo avete intenzione di trascorrere risolvere il programma ..

    Genetic Algorithms Definition

    Genetic Algorithms Tutorial

    Class scheduling project with GA

+0

Tutte le risposte sembrano molto buone. Ho scelto questo perché era il più facile da capire per la mia mente non iniziata. Grazie a tutti! – stillinbeta

3

La descrizione del problema non è del tutto chiara, ma se tutto quello che stai cercando di fare è trovare un programma che non ha eventi sovrapposti, allora questo è un problema semplice bipartite matching.

Sono disponibili due gruppi di nodi: eventi e orari. Traccia un vantaggio da ciascun evento a ogni possibile momento della riunione. È quindi possibile costruire in modo efficiente la corrispondenza (il più grande insieme possibile di bordi tra i nodi) utilizzando augmented paths. Questo funziona perché puoi sempre convertire un grafico bipartito in un diagramma di flusso equivalente.

Un esempio di codice che esegue questa operazione è BIM. Anche le librerie di grafici standard come GOBLIN e NetworkX dispongono di implementazioni di corrispondenza bipartite.

2

Sembra che questo potrebbe essere un buon candidato per una soluzione dynamic programming, in particolare qualcosa di simile al problema interval scheduling.

Ci sono alcuni elementi grafici here per il problema di pianificazione intervallo in particolare, che può rendere il concetto più chiaro. Here è un buon tutorial sulla programmazione dinamica in generale.

5

Ci sono diversi modi per farlo questo

Un approccio consiste nel programmare i vincoli. È un caso speciale della programmazione dinamica suggerita da Feanor. È di aiuto usare una libreria specializzata in grado di eseguire i limiti e le ramificazioni per te. (Google per "gecode" o "comet-online" per trovare le librerie)

Se sei incline matematicamente, puoi anche utilizzare la programmazione di interi per risolvere il problema.L'idea di base qui è quella di tradurre il tuo problema in un insieme di disuguaglianze lineari. (Google per "programmazione dei numeri interi" per trovare molti esempi di vita reale e google per "Abacus COIN-OR" per una libreria utile)

La mia ipotesi è che la programmazione dei vincoli sia l'approccio più semplice, ma la programmazione dei numeri interi è utile se si vuoi includere variabili reali nel tuo problema ad un certo punto.

+0

BTW: Non userei la programmazione genetica per un compito come questo: 1) Gli algoritmi genetici sono un po 'lenti 2) Sono un po' difficili da eseguire il debug perché non sempre convergono all'ottimo globale. – nielsle

Problemi correlati