Estoy creando un generador de horarios escolares aleatorios, y me ha ocurrido un problema serio.
el programa es este que os pongo a continuacion:
Código PHP:
<?
$i=1; //Declaramos i para el contador de materias
$mat=0;
//Contador de materias que tenemos
while ( $_POST["m".$i] != "" )
{
$mat++;
$i++;
}
//Comprobamos si la hora del patio es correcta
//Declaramos todas las variables de hora
$patio_h = $_POST[hora_in_pat_h];
$patio_m = $_POST[hora_in_pat_m];
$dur_pat_h = $_POST[dur_pat_h];
$dur_pat_m = $_POST[dur_pat_m];
$clase_h = $_POST[hora_in_h];
$clase_m = $_POST[hora_in_m];
$dur_clas_h = $_POST[dur_clas_h];
$dur_clas_m = $_POST[dur_clas_m];
//Empezamos a distribuir las materias
$cad=0;
for($i=1; $i<=$mat; $i++)
{
$materia="m".$i;
$pos=rand(1, $mat);
$busca = substr_count("$cad", $pos);
if ($busca == 0)
{
$orden[$pos]=$_POST["m".$i];
$cad=$cad.$pos;
}else{
while ( $busca != 0 )
{
$pos=rand(1, $mat);
$busca = substr_count("$cad", $pos);
}
$orden[$pos]=$_POST["m".$i];
$cad=$cad.$pos;
}
}
echo $cad;
echo "<br>";
//Una vez tenemos asignadoas los puestos a las materias, los mostramos
for($i=1;$i<=$mat+1;$i++)
{
$n=$i;
if( $i >= $i_patio )
{
$n--;
}
echo $horas[$i];
echo " - ";
if ( $i == $i_patio )
{
echo "PATIO";
}else{
echo $orden[$n];
}
echo "<br>";
}
?>
Código PHP:
for($i=1; $i<=$mat; $i++)
{
$materia="m".$i;
$pos=rand(1, $mat);
$busca = substr_count("$cad", $pos);
if ($busca == 0)
{
$orden[$pos]=$_POST["m".$i];
$cad=$cad.$pos;
}else{
while ( $busca != 0 )
{
$pos=rand(1, $mat);
$busca = substr_count("$cad", $pos);
}
$orden[$pos]=$_POST["m".$i];
$cad=$cad.$pos;
}
}
Pero hoy, he empezado a poner nuevas asignaturas y he descubierto que lo maximo que me permite el programa son 10 asignaturas.
A partir de 11, el programa se bloquea y pasados 30 segundos me muestra este mensaje de error:
Fatal error: Maximum execution time of 30 seconds exceeded in C:\AppServ\www\TR\p3.php on line 116
o
Fatal error: Maximum execution time of 30 seconds exceeded in C:\AppServ\www\TR\p3.php on line 117
Esta linea es la linea roja que indico mas abajo:
while ( $busca != 0 )
{
$pos=rand(1, $mat);
$busca = substr_count("$cad", $pos);
}
Eso es todo, solo una cosa mas, hay aveces en las que si que me lo coje todo, y me lo arroja. Lo unico que se me ocurre, es que el sistema de aletoriedad sea muy engorrososo y no se encuentre una salida.
Bueno espero que me ayuden, muchas gracias!
saludos,