首页 > 技术文章 > PHP排课算法

xgh220 2013-11-13 10:37 原文

<?
require_once("admin/config.php");

function isTidOnThu($Time_id)
{
$isOn=0;
switch($Time_id)
{
case 16:
$isOn=1;break;
case 17:
$isOn=1;break;
case 18:
$isOn=1;break;
defaultisOn=0;
}
return $isOn;
}

function TidToName($id)
{
switch($id)
{
case 1:
$Time_Name="星期一(1)";break;
case 2:
$Time_Name="星期一(2)";break;
case 3:
$Time_Name="星期一(3)";break;
case 4:
$Time_Name="星期一(4)";break;
case 5:
$Time_Name="星期一(5)";break;
case 6:
$Time_Name="星期二(1)";break;
case 7:
$Time_Name="星期二(2)";break;
case 8:
$Time_Name="星期二(3)";break;
case 9:
$Time_Name="星期二(4)";break;
case 10:
$Time_Name="星期二(5)";break;
case 11:
$Time_Name="星期三(1)";break;
case 12:
$Time_Name="星期三(2)";break;
case 13:
$Time_Name="星期三(5)";break;
case 14:
$Time_Name="星期四(1)";break;
case 15:
$Time_Name="星期四(2)";break;
case 16:
$Time_Name="星期四(3)";break;
case 17:
$Time_Name="星期四(4)";break;
case 18:
$Time_Name="星期四(5)";break;
case 19:
$Time_Name="星期五(1)";break;
case 20:
$Time_Name="星期五(2)";break;
case 21:
$Time_Name="星期五(3)";break;
case 22:
$Time_Name="星期五(4)";break;
case 23:
$Time_Name="星期五(5)";break;
default:
$Time_Name="";
}
return $Time_Name;
}

function CRidToName($id)
{
$sql="select * from classroom where id='$id'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);
return $row['name'];

}

//函数PaikeRoom(),一般在函数PaikeMultiRoom()之后
for($i=1;$i<=23;$i++)
{
$TonTime[$i][]="noteacher";
$ConTime[$i][]="noclassroom";
}

 


//将班级人数加到Lesson中去
function CNumToLesson()
{
$sql="UPDATE lesson,cnum SET lesson.iStuNum = cnum.iCNum WHERE lesson.C_Name = cnum.C_Name";
$result=mysql_query($sql);
}//测试通过

function LsnToLsn()
{
$sql="select * from lesson where 1";
$result=mysql_query($sql);
$inum=mysql_num_rows($result);
$i=0;
$iCount=0;
$Num=0;

$sql1="SELECT * FROM `lesson` WHERE 1";
$result1=mysql_query($sql1);

while($row=mysql_fetch_array($result1))
{
$iCount++;
$iTemp=$row['iTheory'];
while($iTemp&gt;=2)
{
$Num=$iCount+$inum*$i;
$i++;
$iTemp=$iTemp-2;
$sql="INSERT INTO lsnlsn(T_Name,C_Name,L_Name,iTheory,iExp,cr_id,bMultiRoom,iStuNum,
Time_id,iPos,week)
VALUES('$row[T_Name]','$row[C_Name]','$row[L_Name]',
2,0,'$row[cr_id]','$row[bMultiRoom]','$row[iStuNum]','$row[Time_id]','$Num','')";
$result=mysql_query($sql);

}

if($iTemp&gt;=1)
{
$Num=$iCount+$inum*$i;
$i++;
$sql="INSERT INTO lsnlsn(T_Name,C_Name,L_Name,iTheory,iExp,cr_id,bMultiRoom,iStuNum,
Time_id,iPos,week) VALUES('$row[T_Name]','$row[C_Name]','$row[L_Name]',
1,0,'$row[cr_id]','$row[bMultiRoom]','$row[iStuNum]','$row[Time_id]','$Num','单周')";
$result=mysql_query($sql);
}

$iTemp=$row['iExp'];
while($iTemp&gt;=2)
{
$Num=$iCount+$inum*$i;
$i++;
$iTemp=$iTemp-2;
$sql="INSERT INTO lsnlsn(T_Name,C_Name,L_Name,iTheory,iExp,cr_id,bMultiRoom,iStuNum,
Time_id,iPos,week) VALUES('$row[T_Name]','$row[C_Name]','$row[L_Name]',
0,2,'$row[cr_id]',0,'$row[iStuNum]','$row[Time_id]','$Num','')";
$result=mysql_query($sql);
}
if($iTemp&gt;=1)
{
$Num=$iCount+$inum*$i;
$i++;
$sql="INSERT INTO lsnlsn(T_Name,C_Name,L_Name,iTheory,iExp,cr_id,bMultiRoom,iStuNum,
Time_id,iPos,week) VALUES('$row[T_Name]','$row[C_Name]','$row[L_Name]',
0,1,'$row[cr_id]',0,'$row[iStuNum]','$row[Time_id]','$Num','双周')";
$result=mysql_query($sql);
}
$i=0;
}
}//测试通过

//判断是否老师在tontime,
function isTonTime($TonTime,$Teacher)
{
for($i=0;$i<sizeof($TonTime);$i++)
{
if($TonTime[$i]==$Teacher)
return 1;
}
return 0;
}

//判断是否班级在tontime,
function isConTime($ConTime,$ClassRoom)
{
for($i=0;$i<sizeof($ConTime);$i++)
{
if($ConTime[$i]==$ClassRoom)
return 1;
}
return 0;
}

//判断该时间段班级是否被占
function isCRTimeOnlsnlsn($CR_Id,$TimeId)
{
$sql="select * from lsnlsn where cr_id='$CR_Id'";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
if($row['Time_id']==$TimeId)
return 1;

}
return 0;
}

function isExpOnNight($id)
{
$iR=0;
switch($id)
{
case 5iR=1;
break; //星期一
case 10iR=1;
break; //星期二
case 13:$iR=1;
break; //星期三
case 18:$iR=1;
break; //星期四
case 23:$iR=1;
break; //星期五
default:
$iR=0;
}
return $iR;
}

function TimeCRTolsnlsn($CR_Id,$TimeId,$lsnId)
{
$sql="update lsnlsn set cr_Id='$CR_Id',Time_id='$TimeId' where id='$lsnId'";
$result=mysql_query($sql);
}


function initDatebase()
{
$sql="delete from lsnlsn where 1";
$result=mysql_query($sql);

// $sql="delete from 'tontime' where 1 ";
// $result=mysql_query($sql);
}

function setDB()
{
$sql="update lsnlsn set cr_id=0 ,Time_id=0";
$result=mysql_query($sql);
}
function PaikeExp()
{
global $TonTime;
global $ConTime;
$sql="SELECT * FROM lesson WHERE 1 GROUP BY T_Name";
$result=mysql_query($sql);
$iTeacher=mysql_num_rows($result);//教师数量

$sql="select * from classroom";
$result=mysql_query($sql);
$iClassRoom=mysql_num_rows($result);//总共教室数量

//解决实验课
$sql="select * from lsnlsn where iExp&gt;1 and cr_id=0";
$result=mysql_query($sql);
$iLsn=mysql_num_rows($result);

$lsn_sql="select * from lsnlsn where iExp&gt;1 and cr_id=0 order by iPos";
$lsn_result=mysql_query($lsn_sql);
$CR_sql="select * from classroom where type=2";
$CR_result=mysql_query($CR_sql);
$i=0;
$k=0;
$iCount=0;
while($k<30 and ($iCount<$iLsn))
{
$lsn_result=mysql_query($lsn_sql);
while($lsn_row=mysql_fetch_array($lsn_result))
{
for($i=1;$i<=23;$i++)
{
if($i==16 or $i==17 or $i==18)
break;//星期四下午晚上不排课
$CR_result=mysql_query($CR_sql);
while($CR_row=mysql_fetch_array($CR_result))
{

if( !isCRTimeOnlsnlsn($CR_row['id'],$i)
//and $CR_row['num']&gt;=$lsn_row['iStuNum']
and !isTonTime($TonTime[$i],$lsn_row['T_Name'])
and !isConTime($ConTime[$i],$lsn_row['C_Name'])
and !isExpOnNight($i))
{
TimeCRTolsnlsn($CR_row['id'],$i,$lsn_row['id']);
$TonTime[$i][]=$lsn_row['T_Name'];
$ConTime[$i][]=$lsn_row['C_Name'];
$iCount++;
}

}//while($CR_row=mysql_fetch_array($CR_result))
}//for($i=1;$i<=23;$i++)
}//while($lsn_row=mysql_fetch_array($lsn_result))
$k++;
}//while($k<10 and $iCount<$iLsn)
$sql="select * from lsnlsn where iExp&gt;=1 and cr_id=0";
$result=mysql_query($sql);
$iLsn=mysql_num_rows($result);


$lsn_sql="select * from lsnlsn where iExp&gt;=1 and cr_id=0 order by iPos";
$lsn_result=mysql_query($lsn_sql);
$CR_sql="select * from classroom where type=2";
$CR_result=mysql_query($CR_sql);
$i=0;
$k=0;
$iCount=0;
while($k<30 and ($iCount<$iLsn))
{
$lsn_result=mysql_query($lsn_sql);
while($lsn_row=mysql_fetch_array($lsn_result))
{
for($i=1;$i<=23;$i++)
{
if($i==16 or $i==17 or $i==18)
break;//星期四下午晚上不排课
$CR_result=mysql_query($CR_sql);
while($CR_row=mysql_fetch_array($CR_result))
{

if( !isCRTimeOnlsnlsn($CR_row['id'],$i)
//and $CR_row['num']&gt;=$lsn_row['iStuNum']
and !isTonTime($TonTime[$i],$lsn_row['T_Name'])
and !isConTime($ConTime[$i],$lsn_row['C_Name'])
and !isExpOnNight($i))
{
TimeCRTolsnlsn($CR_row['id'],$i,$lsn_row['id']);
$TonTime[$i][]=$lsn_row['T_Name'];
$ConTime[$i][]=$lsn_row['C_Name'];
$iCount++;
}

}//while($CR_row=mysql_fetch_array($CR_result))
}//for($i=1;$i<=23;$i++)
}//while($lsn_row=mysql_fetch_array($lsn_result))
$k++;
}//while($k<10 and $iCount<$iLsn)
}
function PaikeMultiRoom()
{
global $TonTime;
global $ConTime;
$sql="SELECT * FROM lesson WHERE 1 GROUP BY T_Name";
$result=mysql_query($sql);
$iTeacher=mysql_num_rows($result);//教师数量

$sql="select * from classroom";
$result=mysql_query($sql);
$iClassRoom=mysql_num_rows($result);//总共教室数量

//解决理论课,解决多媒体
$sql="select * from lsnlsn where bMultiRoom=1 and iTheory=2 and cr_id=0";
$result=mysql_query($sql);
$iLsn=mysql_num_rows($result);

$lsn_sql="select * from lsnlsn where bMultiRoom=1 and iTheory=2 and cr_id=0 order by iPos";
$lsn_result=mysql_query($lsn_sql);
$CR_sql="select * from classroom where type=1 order by num";
$CR_result=mysql_query($CR_sql);
$i=0;
$k=0;
$iCount=0;
while($k<30 and ($iCount<$iLsn))
{
$lsn_result=mysql_query($lsn_sql);
while($lsn_row=mysql_fetch_array($lsn_result))
{
for($i=1;$i<=23;$i++)
{
if($i==16 or $i==17 or $i==18)
break;//星期四下午晚上不排课
$CR_result=mysql_query($CR_sql);
while($CR_row=mysql_fetch_array($CR_result))
{
if( $lsn_row['iTheory']&gt;=1
and !isCRTimeOnlsnlsn($CR_row['id'],$i)
//and $CR_row['type']==1
//and $lsn_row['bMultiRoom']==1
and $CR_row['num']&gt;=$lsn_row['iStuNum']
and !isTonTime($TonTime[$i],$lsn_row['T_Name'])
and !isConTime($ConTime[$i],$lsn_row['C_Name']))
{
TimeCRTolsnlsn($CR_row['id'],$i,$lsn_row['id']);
$TonTime[$i][]=$lsn_row['T_Name'];
$ConTime[$i][]=$lsn_row['C_Name'];
$iCount++;
}
}//while($CR_row=mysql_fetch_array($CR_result))
}//for($i=1;$i<=23;$i++)
}//while($lsn_row=mysql_fetch_array($lsn_result))
$k++;
}//while($k<10 and $iCount<$iLsn)

//解决理论课,解决多媒体
$sql="select * from lsnlsn where bMultiRoom=1 and cr_id=0";
$result=mysql_query($sql);
$iLsn=mysql_num_rows($result);

$lsn_sql="select * from lsnlsn where bMultiRoom=1 and cr_id=0 order by iPos";
$lsn_result=mysql_query($lsn_sql);
$CR_sql="select * from classroom where type=1 order by num";
$CR_result=mysql_query($CR_sql);
$i=0;
$k=0;
$iCount=0;
while($k<30 and ($iCount<$iLsn))
{
$lsn_result=mysql_query($lsn_sql);
while($lsn_row=mysql_fetch_array($lsn_result))
{
for($i=1;$i<=23;$i++)
{
if($i==16 or $i==17 or $i==18)
break;//星期四下午晚上不排课
$CR_result=mysql_query($CR_sql);
while($CR_row=mysql_fetch_array($CR_result))
{
if( $lsn_row['iTheory']&gt;=1
and !isCRTimeOnlsnlsn($CR_row['id'],$i)
//and $CR_row['type']==1
//and $lsn_row['bMultiRoom']==1
and $CR_row['num']&gt;=$lsn_row['iStuNum']
and !isTonTime($TonTime[$i],$lsn_row['T_Name'])
and !isConTime($ConTime[$i],$lsn_row['C_Name']))
{
TimeCRTolsnlsn($CR_row['id'],$i,$lsn_row['id']);
$TonTime[$i][]=$lsn_row['T_Name'];
$ConTime[$i][]=$lsn_row['C_Name'];
$iCount++;
}
}//while($CR_row=mysql_fetch_array($CR_result))
}//for($i=1;$i<=23;$i++)
}//while($lsn_row=mysql_fetch_array($lsn_result))
$k++;
}//while($k<10 and $iCount<$iLsn)
}

function PaikeRoom()
{
global $TonTime;
global $ConTime;
$sql="SELECT * FROM lesson WHERE 1 GROUP BY T_Name";
$result=mysql_query($sql);
$iTeacher=mysql_num_rows($result);//教师数量

$sql="select * from classroom";
$result=mysql_query($sql);
$iClassRoom=mysql_num_rows($result);//总共教室数量

//解决理论课,非多媒体,
//1.以及需要多媒体但排不下排不上的,忽略多媒体继续排
//2.可能有多媒体没有用到,当普通教室用
$sql="select * from lsnlsn where iExp=0 and cr_id=0 and iTheory=2";
$result=mysql_query($sql);
$iLsn=mysql_num_rows($result);

$lsn_sql="select * from lsnlsn where iExp=0 and cr_id=0 and iTheory=2 order by iPos";
$lsn_result=mysql_query($lsn_sql);
$CR_sql="select * from classroom where type<2 order by num";
$CR_result=mysql_query($CR_sql);
$i=0;
$k=0;
$iCount=0;
while($k<30 and ($iCount<$iLsn))
{
$lsn_result=mysql_query($lsn_sql);
while($lsn_row=mysql_fetch_array($lsn_result))
{
for($i=1;$i<=23;$i++)
{
if($i==16 or $i==17 or $i==18)
break;//星期四下午晚上不排课
$CR_result=mysql_query($CR_sql);
while($CR_row=mysql_fetch_array($CR_result))
{
if( $lsn_row['iTheory']&gt;=1
and !isCRTimeOnlsnlsn($CR_row['id'],$i)
and $CR_row['type']==0
and $lsn_row['bMultiRoom']==0
and $CR_row['num']&gt;=$lsn_row['iStuNum']
and !isTonTime($TonTime[$i],$lsn_row['T_Name'])
and !isConTime($ConTime[$i],$lsn_row['C_Name']))
{
TimeCRTolsnlsn($CR_row['id'],$i,$lsn_row['id']);
$TonTime[$i][]=$lsn_row['T_Name'];
$ConTime[$i][]=$lsn_row['C_Name'];
$iCount++;
}
}//while($CR_row=mysql_fetch_array($CR_result))
}//for($i=1;$i<=23;$i++)
}//while($lsn_row=mysql_fetch_array($lsn_result))
$k++;
}//while($k<10 and $iCount<$iLsn)

$sql="select * from lsnlsn where iExp=0 and cr_id=0";
$result=mysql_query($sql);
$iLsn=mysql_num_rows($result);

$lsn_sql="select * from lsnlsn where iExp=0 and cr_id=0 order by iPos";
$lsn_result=mysql_query($lsn_sql);
$CR_sql="select * from classroom where type<2 order by num";
$CR_result=mysql_query($CR_sql);
$i=0;
$k=0;
$iCount=0;
while($k<30 and ($iCount<$iLsn))
{
$lsn_result=mysql_query($lsn_sql);
while($lsn_row=mysql_fetch_array($lsn_result))
{
for($i=1;$i<=23;$i++)
{
if($i==16 or $i==17 or $i==18)
break;//星期四下午晚上不排课
$CR_result=mysql_query($CR_sql);
while($CR_row=mysql_fetch_array($CR_result))
{
if( $lsn_row['iTheory']&gt;=1
and !isCRTimeOnlsnlsn($CR_row['id'],$i)
and $CR_row['type']==0
and $lsn_row['bMultiRoom']==0
and $CR_row['num']&gt;=$lsn_row['iStuNum']
and !isTonTime($TonTime[$i],$lsn_row['T_Name'])
and !isConTime($ConTime[$i],$lsn_row['C_Name']))
{
TimeCRTolsnlsn($CR_row['id'],$i,$lsn_row['id']);
$TonTime[$i][]=$lsn_row['T_Name'];
$ConTime[$i][]=$lsn_row['C_Name'];
$iCount++;
}
}//while($CR_row=mysql_fetch_array($CR_result))
}//for($i=1;$i<=23;$i++)
}//while($lsn_row=mysql_fetch_array($lsn_result))
$k++;
}//while($k<10 and $iCount<$iLsn)
}

function ReToExp()
{
$Rest_sql="select * from lsnlsn where cr_id=0 and iExp=1";
$Rest_result=mysql_query($Rest_sql);
$iRest=mysql_num_rows($Rest_result);
$iCount=0;

//已经排好了有课的时间段
$fini_sql="select * from lsnlsn where iExp=1 and cr_id&gt;0";
$fini_result=mysql_query($fini_sql);

while($iCount<$iRest and $k<10)
{
while($Rest_row=mysql_fetch_array($result))
{
while($fini_row=mysql_fetch_array($fini_result))
{
if( !isTonTime($fini_row['Time_id'],$Rest_row['T_Name'])
and !isConTime($fini_row['Time_id'],$Rest_row['C_Name']))
{
$cr_id=$fini_row['cr_id'];
$Time_id=$fini_row['Time_id'];
$id=$Rest_row['id'];
$sql="update lsnlsn set cr_id='$cr_id',Time_id='$Time_id',
week='双周' where id='$id'";
$result=mysql_query($sql);

$id=$fini_row['id'];
$sql="update lsnlsn set weak='单周' where id='$id'";
$result=mysql_query($sql);
$iCount++;
}
}
$fini_result=mysql_query($fini_sql);
}
$k++;
}

}

function ReToRoom()
{
$Rest_sql="select * from lsnlsn where cr_id=0 and iTheory=1";
$Rest_result=mysql_query($Rest_sql);
$iRest=mysql_num_rows($Rest_result);
$iCount=0;

//已经排好了有课的时间段
$fini_sql="select * from lsnlsn where iTheory=1 and cr_id&gt;0";
$fini_result=mysql_query($fini_sql);

while($iCount<$iRest and $k<10)
{
while($Rest_row=mysql_fetch_array($result))
{
while($fini_row=mysql_fetch_array($fini_result))
{
if( !isTonTime($fini_row['Time_id'],$Rest_row['T_Name'])
and !isConTime($fini_row['Time_id'],$Rest_row['C_Name']))
{
$cr_id=$fini_row['cr_id'];
$Time_id=$fini_row['Time_id'];
$id=$Rest_row['id'];
$sql="update lsnlsn set cr_id='$cr_id',Time_id='$Time_id',
weak='双周' where id='$id'";
$result=mysql_query($sql);

$id=$fini_row['id'];
$sql="update lsnlsn set weak='单周' where id='$id'";
$result=mysql_query($sql);
$iCount++;
}
}
$fini_result=mysql_query($fini_sql);
}
$k++;
}
}
?>

推荐阅读