Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Algoritmo Genetico Horarios Escolares

Estas en el tema de Algoritmo Genetico Horarios Escolares en el foro de PHP en Foros del Web. Al final lo encontré después de muchos meses de intentos llegue a esto Inicio cargando en arreglos los datos que almacene previamente en la base ...

  #31 (permalink)  
Antiguo 26/04/2015, 23:52
Avatar de raco_hernandez  
Fecha de Ingreso: agosto-2012
Mensajes: 39
Antigüedad: 11 años, 8 meses
Puntos: 4
Respuesta: Algoritmo Genetico Horarios Escolares

Al final lo encontré después de muchos meses de intentos llegue a esto

Inicio cargando en arreglos los datos que almacene previamente en la base de datos como los grupos, horarios, profesores, materias...

Esto con el fin de hacerlo mas rápido en lugar de estar consultado cada vez en la BD

Algo como esto

Código:
$result1=Query("SELECT *, IF(Date_format(hfl,'%H:%i')<='13:30','Matutino','Vespertino') AS turno FROM horarios HAVING turno LIKE '".$TURNO."'");
while($row = mysql_fetch_array($result1)){
	$Horarios[]=array(
		"idhorarios"=>$row["idhorarios"],
		"horarios"=>$row["nombre"],
		"turno"=>$row["turno"]
	);
}
Después genero una población, inicial es decir meto en otro arreglo las posibilidades que tengo en cada grupo.

Eje.
Grupo 1

Lu |Ma |Mi |Ju |Vi
1 ESP CIE GEO MAT GEO
2 ESP TEC GEO CIE E.F
3 E.F MAT MAT ING TEC

Grupo 2

Lu |Ma |Mi |Ju |Vi
1 ESP TEC GEO CIE E.F
2 E.F MAT MAT ING TEC
3 ESP CIE GEO MAT GEO

En PHP algo como esto

Código:
        $CO[]=array(
					"idgrupos"=>$grupo["idgrupos"],
					"grupos"=>$grupo["grupo"],
					"d"=>$d,
					"idhorarios"=>$horario["idhorarios"],
					"materias"=>$Materias_G[0]["materias"],
					"idmaterias"=>$Materias_G[0]["idmaterias"],
					"fija"=>$Materias_G[0]["fija"],
					"idprofesores"=>$Materias_G[0]["idprofesores"],
					"profesores"=>$Materias_G[0]["profesores"],
					"fijo"=>$Materias_G[0]["fijo"],
					"PosH"=>$PosH,
					"htmlg"=>$Materias_G[0]["idmaterias"]."|".$Materias_G[0]["idprofesores"],
					"htmlp"=>$Materias_G[0]["idgrupos"]."|".$Materias_G[0]["idmaterias"],
					"calificacion"=>0
				);
Ya que tengo generado esto de forma aleatoria empiezo con un ciclo que valida que llegue a CERO

Algo como esto

Código:
while(!$bandera){
	//SI SE LOGRO RESOLVER
	if($Calificacion_Poblacion>0){
		...
	}	
}
Dentro de ese ciclo pasa toda la magia es donde califico, selecciono, cruzo y muto ahora les explico

Califico, recorro cada opción del horario para ver si cumple con los requisitos esto cambia cada generador es diferente en mi caso es asi

-No conflicto entre profesores / grupos / horas / dias
-Dentro del horario sugerido por el profesor
-No mas de 3 veces la misma materia por dia
-No mas de dos materias por días que estén separadas en su horario

Eje.
Mat=>Lun=> 7:00 AM
Esp=>Lun=> 8:00AM
Mat=>Lun=> 9:00AM

Esto seria incorrecto

Algo como esto

Código:
foreach($CO as $key=>$val){
	if($CO[$key]["fija"]!="1"){
		//SI NO ES UNA HORA SUJERIDA POR EL PROFESOR
		if($HProfesores[$gen["idprofesores"]][$gen["d"]][$gen["idhorarios"]]!=1){
			$calificacion++;
			$titulo.="NO ES UNA HORA SUJERIDA
";
		}
		...
	}
}
Selecciono, aquí busco dos opciones; la primera es cualquier materia que tenga algún error y la segunda tratando de encontrar alguna solución por ejemplo

Código:
//BUSCO MATERIAS QUE NO SEAN FIJAS, DIFERENTE MATERIA Y MISMO GRUPO QUE LA SELECCION1
$Sel_2=array();
foreach($CO as $key=>$val){
	$gen=$CO[$key];
	if($gen["idgrupos"]==$CO[$SELECCION1]["idgrupos"] 
		&& $gen["fija"]!="1"
		&& $gen["idmaterias"]!=$CO[$SELECCION1]["idmaterias"]
		&& !strpos($gen["imposible"], $gen["idhorarios"]."|".$gen["d"]."||")>=0
	){
		$Sel_2[]=$key;
	}
}
Las intercambio de posición, es decir les cambio la hora y el día para que se cambie la selección 1 a la posición de la selección 2 y viceversa.

Y después vuelvo a calificar para ver si se mejoro el resultado respecto a la calificación anterior y si lo logro inicio todo de nuevo a partir de esa solución seleccionada.

Esto se repite hasta que se logre resolver de lo contrario se cicla acercándose lo mas posible a la solución.

Espero aportar la semillita por el momento el código completo sera para usos comerciales pero con esto ya se dan una idea clara de como va el asunto

:)
  #32 (permalink)  
Antiguo 27/04/2015, 02:34
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Algoritmo Genetico Horarios Escolares

Eso es una especie de interpretación "libre" y pesada de un algoritmo genético.Es más simple si se hace con un simple bitmap.Un bit está a 1 si en el grupo x,el dia Y, hora h, está el profesor Z.Esto requiere Z*h*Y*x bits por solución, siendo esa multiplicación la posición del bit dentro del bitmap.
La generación de soluciones iniciales no tiene por qué ser 100% aleatoria (solo 1 profesor puede dar clases a la vez a un mismo grupo en un mismo dia, en una misma hora).
  #33 (permalink)  
Antiguo 27/04/2015, 17:38
Avatar de raco_hernandez  
Fecha de Ingreso: agosto-2012
Mensajes: 39
Antigüedad: 11 años, 8 meses
Puntos: 4
Respuesta: Algoritmo Genetico Horarios Escolares

Cita:
Iniciado por dashtrash Ver Mensaje
Eso es una especie de interpretación "libre" y pesada de un algoritmo genético.Es más simple si se hace con un simple bitmap.Un bit está a 1 si en el grupo x,el dia Y, hora h, está el profesor Z.Esto requiere Z*h*Y*x bits por solución, siendo esa multiplicación la posición del bit dentro del bitmap.
La generación de soluciones iniciales no tiene por qué ser 100% aleatoria (solo 1 profesor puede dar clases a la vez a un mismo grupo en un mismo dia, en una misma hora).
MMM excelente aporte, si tuve que mutar un algoritmo genetico porque al calificar se me complicaban los criterios

-No mas de una materia / dia / hora / grupo
-No mas de 3 horas por materia por dia
-No mas de 2 horas por dia separadas en horario
-No horas no sujeridas por profesor

Como se te ocurre calificar esto con el bitmap???

Saludos :)
  #34 (permalink)  
Antiguo 28/04/2015, 02:16
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Algoritmo Genetico Horarios Escolares

Cita:
Iniciado por raco_hernandez Ver Mensaje
MMM excelente aporte, si tuve que mutar un algoritmo genetico porque al calificar se me complicaban los criterios

-No mas de una materia / dia / hora / grupo
-No mas de 3 horas por materia por dia
-No mas de 2 horas por dia separadas en horario
-No horas no sujeridas por profesor

Como se te ocurre calificar esto con el bitmap???

Saludos :)
Depende.Las condiciones se utilizan para :
1) Generar las soluciones aleatorias.Son aleatorias, pero se le puede forzar a cumplir una serie de reglas.Por cada profesor, por materia/dia/grupo , puede activar 1 solo bit.
2) Ejecutar la "fitness function", la función que evalua cómo de buena es cada solución en la población de soluciones.

En 2) hay que volver a evaluar todas las condiciones, incluidas las que se usaron en 1).Se podría intentar comenzar con soluciones (horarios) 100% aleatorias, y evaluar las condiciones sólo en la fitness function (sólo en (2)).Si tarda demasiado en converger,o no converge, se le "ayuda" forzando las condiciones iniciales usando 1)
  #35 (permalink)  
Antiguo 28/04/2015, 14:52
Avatar de raco_hernandez  
Fecha de Ingreso: agosto-2012
Mensajes: 39
Antigüedad: 11 años, 8 meses
Puntos: 4
Respuesta: Algoritmo Genetico Horarios Escolares

Cita:
Iniciado por dashtrash Ver Mensaje
Depende.Las condiciones se utilizan para :
1) Generar las soluciones aleatorias.Son aleatorias, pero se le puede forzar a cumplir una serie de reglas.Por cada profesor, por materia/dia/grupo , puede activar 1 solo bit.
2) Ejecutar la "fitness function", la función que evalua cómo de buena es cada solución en la población de soluciones.

En 2) hay que volver a evaluar todas las condiciones, incluidas las que se usaron en 1).Se podría intentar comenzar con soluciones (horarios) 100% aleatorias, y evaluar las condiciones sólo en la fitness function (sólo en (2)).Si tarda demasiado en converger,o no converge, se le "ayuda" forzando las condiciones iniciales usando 1)
Probe cambiando como comentas un bit por bit pero se hacia eterno tengo 12 grupos (40 horas por grupo) y 1 por 1 tardaba mas de 12 horas, en tu experiencia mas o menos cuanto debe durar???

Etiquetas: escolar, genetico, horario, tiemtabling, timetable, algoritmos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:05.