ci sono 24*60 = 1440
minuti al giorno. Così si potrebbe facilmente la forza bruta che, dal momento che non c'è bisogno di ottenere più di una precisione di basi minuto. Comunque descriverò un semplice DP.
È possibile creare un array booleano che memorizza se quel minuto ha una classe in esso da uno degli studenti del gruppo. Hai anche un secondo array. Questa matrice memorizza il numero di spazi aperti in questo blocco ea sinistra. Che cosa si può fare è di traslazione l'array booleano da destra a sinistra e se il blocco ha una classe in esso si fare il numero 0, altrimenti si rendono 1 più il numero nel minuto precedente.
Tuttavia, sento che la mia spiegazione manca, ecco pseudo codice:
blocked = <boolean array>;
numtoleft = <array containing the counts>;
if blocked[0]:
numtoleft[0] = 0;
else:
numtoleft[0] = 1;
for i = 1 to 1440-1:
if blocked[i]:
numtoleft[i] = 0;
else:
numtoleft[i] = numtoleft[i-1];
allora si può facilmente trovare la più grande slot aperto, trovando il numero massimo nella matrice 'numtoleft' e si può aggiungere restrizioni ai tempi che si sta guardando.
EDIT:
Ecco l'algoritmo in Python:
def largestslot(blocked, startminute, endminute):
numtoleft = [0]*1440
numtoleft[startminute] = 0 if blocked[startminute] else 1
for i in xrange(startminute+1, endminute+1):
numtoleft[i] = 0 if blocked[i] else 1
ansmax = max(numtoleft[startminute:endminute+1)
ansi = numtoleft.index(ansmax)
return (ansi-ansmax, ansi)
Non credo che le GA saranno di grande aiuto per questa domanda, in quanto non esistono criteri di idoneità per valutare una soluzione. L'etere è uno slot di tempo libero o non ce n'è. –
poiché c'è una soluzione ottimale che può essere trovata in meno di un tempo esponenziale, GA non sono davvero necessari! – Agos
No, stai pensando di impostare un orario, che è un problema NP-Complete. Questo problema è molto più semplice. :) – JPvdMerwe