Hay 24*60 = 1440
minutos por día. Entonces podría fácilmente forzarlo brutalmente, ya que no necesita obtener más que una precisión de un minuto. Sin embargo, voy a describir un simple DP.
Puede crear una matriz booleana que almacena si ese minuto tiene una clase en él por uno de los alumnos del grupo. También tienes una segunda matriz. Esta matriz almacena el número de espacios abiertos en este bloque y a la izquierda. Entonces, lo que puede hacer es atravesar la matriz booleana de derecha a izquierda y si el bloque tiene una clase, debe hacer el número 0; de lo contrario, lo hace 1 más el número del minuto anterior.
Sin embargo, siento que mi explicación que carece, por lo que aquí es pseudo código:
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];
entonces usted puede encontrar fácilmente la mayor ranura abierta al encontrar el número máximo de la matriz 'numtoleft' y se puede añadir restricciones a los tiempos que estás mirando.
EDIT:
Aquí es el algoritmo en 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)
No creo que las GA sean de mucha ayuda para esta pregunta, ya que no hay criterios de idoneidad para evaluar una solución. Hay un tiempo libre o no hay ninguno. –
, ya que hay una solución óptima que se puede encontrar en un tiempo menos que exponencial, ¡realmente no se necesitan GA! – Agos
No, estás pensando en configurar un cronograma, que es un problema NP-Completo. Este problema es mucho más simple. :) – JPvdMerwe