只考虑了难度系数影响的选择题生成

1.首先生成数据

这里随机生成了1000道选择题 每道题难度系数为 1-5 包含1-3个知识点 总共知识点为1-10

<?php$conn=new mysqli("localhost","root","","tbl");
$conn->query("set names 'utf8'");
$arr1=['A','B','C','D'];
for($i=25;$i<=1000;$i++)
{$ans=$arr1[rand(0,3)];$dif=rand(1,5);$arr2=[];for($j=0;$j<rand(1,3);$j++){$arr2[$j]=rand(1,10);}$arr2 = array_unique($arr2);  //去重asort($arr2);                 //排序$k=implode(",",$arr2);//print_r($k);//echo "<br/>";$sql="insert into tbl_questionbank_option (QoptionID,CourseNo,TcNo,Type,Content,TestAns1,TestAns2,TestAns3,TestAns4,RightAnswer,Score,Difficulty,KnowledgePoints) values($i,1,33333,0,'选择题$i','选择题$i A','选择题$i B','选择题$i C','选择题$i D','$ans',3,'$dif','$k')";//$sql="update tbl_questionbank_option set Difficulty='$dif',KnowledgePoints='$k' where  QoptionID='$i'";echo $sql."<br/>";$result=$conn->query($sql);if($result){echo $i."成功"."<br/>";}else{echo $i."失败"."<br/>";}
}?>

2.组卷代码

<?php
//error_reporting(0);
class ZuJuan{private $limit=100000;//操作限制次数private $v_probability = 0.15;//变异概率private $h_probability = 0.5;//杂交概率private $num; //试题个数private $nandu;//难度系数private $knowSum;private $tiku; //待选择的题库private $wc; //误差接受范围public $dqndxs; //当前试卷难度系数public $vari_num = 0;//变异次数public $hybrid_num = 0;//杂交次数public  $zhongqun; //当前种群public $know;//知识点覆盖率public function __construct($nandu,$kn,$wc,$num){require_once("./function/connectMysql.php");require_once("./function/quChong.php");require_once("./function/transID.php");$conn=connectMysql();$sql="select * from tbl_questionbank_option where type=0";$result=$conn->query($sql);$tk=[];$i=0;$ksum="";while($row=$result->fetch_array()){$tk[$i]['QOptionID']=$row['QOptionID'];$tk[$i]['Difficulty']=$row['Difficulty'];$tk[$i]['KnowledgePoints']=$row['KnowledgePoints'];$ksum=$ksum.$row['KnowledgePoints'].',';$i++;}$this->knowSum=count(array_unique(explode(",",$ksum)))-1;//echo $i;    $this->tiku = $tk;$this->nandu = $nandu;$this->know=$kn;$this->num = $num;$this->wc = $wc;//初始化种群$zq=[];while(true){$j=0;while(count($zq)!=$this->num){$randNum=rand(0,$i-1);$zq[toBin($randNum,10)]=$this->tiku[$randNum];$j++;}$zq=assoc_unique($zq,'QOptionID');  //二维数组去重if(count($zq)==$this->num) break;}$this->zhongqun=$zq;//print_r($this->zhongqun);$conn->close();}//检查是否符合要求public function check(){//$ksum="";$dsum=0;foreach($this->zhongqun as $k=>$v){$dsum+=$v['Difficulty'];}//$karray=explode(",",$ksum);//$newKarrary=array_unique($karray);$d=$dsum/$this->num;//$k=(count($newKarrary)-1)/$this->knowSum;//        echo "nandu=".$this->nandu."<br/>";
//        echo "d=".$d."<br/>";
//        echo "know=".$this->know."<br/>";
//        echo "k=".$k."<br/>";//echo "wc=".$this->wc."<br/>";$d=$dsum/$this->num;$this->dqndxs=$d;if(abs($this->nandu - $d) < $this->wc)// && abs($this->know - $k) < $this->wc ) //满足误差范围{//echo "满足要求<br/>";//echo "dqndxs=".$this->$dqndxs."<br/>";//$this->know=$k;return false;}else    //继续筛选{return true;}}//择优public function choice(){$xsc=[];foreach($this->zhongqun as $k=>$v){$xsc[$k]=abs($this->nandu - $v['Difficulty']); //+ abs($this->know - $v['KnowledgePoints']);} arsort($xsc,SORT_NUMERIC);//排序$newOne=floor($this->num * $this->h_probability);$i=0;foreach($xsc as $k=>$v){if($i<$newOne){unset($this->zhongqun[$k]);$i++;}}}//杂交public function hybrid(){//计算单倍体长度$tm = array_rand($this->zhongqun,1);    //随即返回键名$cross_len = floor(strlen($tm)/2);$individuality='';//当种群繁殖到预定的数量时,停止繁殖while(count($this->zhongqun) < $this->num){if($this->hybrid_num >$this->limit){return false;}$a='';$b='';//随机选择两个个体进行杂交产生新个体$rand = array_rand($this->zhongqun,2);//杂交开始$a=substr($rand[0],0,$cross_len);$b=substr($rand[1],$cross_len);$individuality = $a.$b;//如果新个体在种群中已存在,则重新杂交产生新个体//新个体纳入到种群中if(strlen($individuality)== 10){//echo $individuality."<br>";$this->zhongqun[$individuality] = $this->tiku[toTen($individuality)];//echo "杂交".$a."和".$b."<br/>";//echo "序号为:".$individuality."<br/>";$this->hybrid_num +=1;}}return true;}//变异public function variation(){$vriants = array_rand($this->zhongqun,ceil($this->v_probability * $this->num));if(is_array($vriants)){//有多个变种foreach($vriants as $v){$i = $this->change_something($v);if($i === false){return false;}$this->zhongqun[$i] = $this->tiku[toTen($i)];unset($this->zhongqun[$v]);}}else{//只有一个变种$i = $this->change_something($vriants);if($i === false){return false;}$this->zhongqun[$i] = $this->tiku[toTen($i)];unset($this->zhongqun[$vriants]);}return true;}private function change_something($str){//为了保护我们的CPU,做个变异次数限制if($this->vari_num > $this->limit){return false;}$this->vari_num += 1;//获取当前种群中已有的个体$position = rand(0,strlen($str)-1);$arr1=str_split($str);if($arr1[$position] == 1){$arr1[$position]=0;}else if($arr1[$position] == 0){$arr1[$position]=1;}$str=implode("",$arr1);//如果变异后的个体已经在种群中存在,则重新变异,或者变异后的个体在题库中不存在时,重新变异if(in_array($str,array_keys($this->zhongqun))){   //变异后的键名存在种群键名数组里$this->change_something($str);}else{//变异后的个体不在题库中if(toTen($str) > count($this->tiku)-1){$str = $this->change_something($str);}else{//变异的新个体在当前种群中不存在,并且存在于题库中return $str;}}}public function get_papers(){$i = 1;while($this->check()){echo '当前'.$i.'代<br>';echo '当前试卷难度系数为'.$this->dqndxs."<br><br>";if($i > $this->limit){return array('status'=>0,'info'=>'系统经过长达'.$this->limit.'次的尝试,还是没有组卷成功,请尝试重新组卷!');}//选择$this->choice();//杂交if(!$this->hybrid()){return array('status'=>0,'info'=>'杂交次数过多,请尝试重新组卷,或者您可以放宽误差范围后在组卷!');}//echo "杂交完成,进行变异.<br/>";//变异if(!$this->variation()){return array('status'=>0,'info'=>'变异次数过多,请尝试重新组卷,或者您可以放宽误差范围后在组卷!');}//echo "第".$i."次进化,试卷难度系数为".$this->nandu.",知识点覆盖率为".$this->know."<br/>";//print_r($this->zhongqun);$i++;}$data = array();foreach($this->zhongqun as $k=>$v){$data[$v['QOptionID']] = $v;}return array('status'=>1,'info'=>'组卷成功','num'=>$i,'data'=>$data);}}
$m = new zujuan(2.56,0.75,0.1,12);$res = $m->get_papers();
if($res['status']){echo '经过'.$res['num'].'代<br>';echo '当前试卷难度系数为'.$m->dqndxs;echo '<br>难度系数误差'.abs(2.56-$m->dqndxs).'<br>';
//    echo '当前知识点覆盖率为'.$m->know;
//    echo '<br>难度系数误差'.abs(0.75-$m->know).'<br>';echo '<hr>';echo '<br>变异次数:'.$m->vari_num;echo '<br>杂交次数:'.$m->hybrid_num;echo '<hr>试卷题目分别为:';foreach($res['data'] as $k=>$v){echo '<br>第'.$k.'题';print_r($v);}
}else{echo $res['info'];echo '<hr>';echo '<br>变异次数:'.$m->vari_num;echo '<br>杂交次数:'.$m->hybrid_num;
}//$str="1010101010";
//$arr1 = str_split($str);
//echo '变异前:'.$str."<br/>";
获取当前种群中已有的个体
//echo "str的长度为".strlen($str)."<br>";
//$position = rand(0,strlen($str)-1);
//echo "当前改变的position为:".$position."<br/>";
//if($arr1[$position] == 1){
//    $arr1[$position]=0;
//}else if($str{$position} == 0){
//    $arr1[$position]=1;
//}
//$newstr=implode("",$arr1);
//echo "变异后:".$newstr."<br/>";?>

transID.php是转换补位二进制的函数 quchong.php是一个去二维数组重复key的函数。

3.结果

2019-12-07后续新增:

<?php
//error_reporting(0);
class ZuJuan{private $length=10; //二进制长度private $limit=500000;//操作限制次数private $v_probability = 0.15;//变异概率private $h_probability = 0.5;//杂交概率public $num; //试题个数private $nandu;//难度系数private $knowSum;//总知识点private $tiku; //待选择的题库private $wc; //误差接受范围public $dqndxs; //当前试卷难度系数public $dqknowxs; //当前知识点覆盖public $vari_num = 0;//变异次数public $hybrid_num = 0;//杂交次数public  $zhongqun; //当前种群public $know;//知识点覆盖率//多选public  $duoxuan_zhongqun; //多选种群private $duoxuan_tiku; //多选题库public $duoxuan_dqndxs; //多选当前难度系数public $duoxuan_dqknowxs; //多选当前知识点覆盖public $duoxuan_num; //多选试题个数//填空public  $tiankong_zhongqun; //填空种群private $tiankong_tiku; //填空题库public $tiankong_dqndxs; //填空当前难度系数public $tiankong_dqknowxs; //填空当前知识点覆盖public $tiankong_num; //填空试题个数//判断public  $panduan_zhongqun; //判断种群private $panduan_tiku; //判断题库public $panduan_dqndxs; //判断当前难度系数public $panduan_dqknowxs; //判断当前知识点覆盖public $panduan_num; //判断试题个数//简答public  $jianda_zhongqun; //简答种群private $jianda_tiku; //简答题库public $jianda_dqndxs; //简答当前难度系数public $jianda_dqknowxs; //简答当前知识点覆盖public $jianda_num; //简答试题个数public function __construct($nandu,$kn,$wc,$num,$num2,$num3,$num4,$num5){require_once("./function/connectMysql.php");require_once("./function/quChong.php");require_once("./function/transID.php");$conn=connectMysql();//单选$sql="select * from tbl_questionbank_option where type=0";$result=$conn->query($sql);$tk=[];$i=0;$ksum="";while($row=$result->fetch_array()){$tk[$i]['QOptionID']=$row['QOptionID'];$tk[$i]['Difficulty']=$row['Difficulty'];$tk[$i]['KnowledgePoints']=$row['KnowledgePoints'];$ksum=$ksum.$row['KnowledgePoints'].',';$i++;}//echo $i;    $this->tiku = $tk;$this->nandu = $nandu;$this->know=$kn;$this->num = $num;$this->wc = $wc;//初始化种群$zq=[];while(true){$j=0;while(count($zq)!=$this->num){$randNum=rand(0,$i-1);$zq[toBin($randNum,$this->length)]=$this->tiku[$randNum];$j++;}$zq=assoc_unique($zq,'QOptionID');  //二维数组去重if(count($zq)==$this->num) break;}$this->zhongqun=$zq;//print_r($this->zhongqun);//多选$sql="select * from tbl_questionbank_option where type=1";$result=$conn->query($sql);$tk=[];$i=0;while($row=$result->fetch_array()){$tk[$i]['QOptionID']=$row['QOptionID'];$tk[$i]['Difficulty']=$row['Difficulty'];$tk[$i]['KnowledgePoints']=$row['KnowledgePoints'];$ksum=$ksum.$row['KnowledgePoints'].',';$i++;}//echo $i;    $this->duoxuan_tiku = $tk;$this->duoxuan_num = $num2;//初始化种群$zq=[];while(true){$j=0;while(count($zq)!=$this->duoxuan_num){$randNum=rand(0,$i-1);$zq[toBin($randNum,$this->length)]=$this->duoxuan_tiku[$randNum];$j++;}$zq=assoc_unique($zq,'QOptionID');  //二维数组去重if(count($zq)==$this->duoxuan_num) break;}$this->duoxuan_zhongqun=$zq;//print_r($this->zhongqun);//填空$sql="select * from tbl_questionbank where QuestionType='填空题'";$result=$conn->query($sql);$tk=[];$i=0;while($row=$result->fetch_array()){$tk[$i]['QuestionNo']=$row['QuestionNo'];$tk[$i]['Difficulty']=$row['Difficulty'];$tk[$i]['KnowledgePoints']=$row['KnowledgePoints'];$ksum=$ksum.$row['KnowledgePoints'].',';$i++;}//echo $i;    $this->tiankong_tiku = $tk;$this->tiankong_num = $num3;//初始化种群$zq=[];while(true){$j=0;while(count($zq)!=$this->tiankong_num){$randNum=rand(0,$i-1);$zq[toBin($randNum,$this->length)]=$this->tiankong_tiku[$randNum];$j++;}$zq=assoc_unique($zq,'QuestionNo');  //二维数组去重if(count($zq)==$this->tiankong_num) break;}$this->tiankong_zhongqun=$zq;//print_r($this->zhongqun);//判断$sql="select * from tbl_questionbank where QuestionType='判断题'";$result=$conn->query($sql);$tk=[];$i=0;while($row=$result->fetch_array()){$tk[$i]['QuestionNo']=$row['QuestionNo'];$tk[$i]['Difficulty']=$row['Difficulty'];$tk[$i]['KnowledgePoints']=$row['KnowledgePoints'];$ksum=$ksum.$row['KnowledgePoints'].',';$i++;}//echo $i;    $this->panduan_tiku = $tk;$this->panduan_num = $num4;//初始化种群$zq=[];while(true){$j=0;while(count($zq)!=$this->panduan_num){$randNum=rand(0,$i-1);$zq[toBin($randNum,$this->length)]=$this->panduan_tiku[$randNum];$j++;}$zq=assoc_unique($zq,'QuestionNo');  //二维数组去重if(count($zq)==$this->panduan_num) break;}$this->panduan_zhongqun=$zq;//print_r($this->zhongqun);//简答$sql="select * from tbl_questionbank where QuestionType='简答题'";$result=$conn->query($sql);$tk=[];$i=0;while($row=$result->fetch_array()){$tk[$i]['QuestionNo']=$row['QuestionNo'];$tk[$i]['Difficulty']=$row['Difficulty'];$tk[$i]['KnowledgePoints']=$row['KnowledgePoints'];$ksum=$ksum.$row['KnowledgePoints'].',';$i++;}//echo $i;    $this->jianda_tiku = $tk;$this->jianda_num = $num5;//初始化种群$zq=[];while(true){$j=0;while(count($zq)!=$this->jianda_num){$randNum=rand(0,$i-1);$zq[toBin($randNum,$this->length)]=$this->jianda_tiku[$randNum];$j++;}$zq=assoc_unique($zq,'QuestionNo');  //二维数组去重if(count($zq)==$this->jianda_num) break;}$this->jianda_zhongqun=$zq;//计算总知识点数$this->knowSum=count(array_unique(explode(",",$ksum)))-1;echo "总知识点数量:".$this->knowSum."<br>";$conn->close();}//检查是否符合要求public function check(){$ksum="";$dsum=0;foreach($this->zhongqun as $k=>$v){$dsum+=$v['Difficulty'];$ksum=$ksum.$v['KnowledgePoints'].',';}foreach($this->duoxuan_zhongqun as $k=>$v){$dsum+=$v['Difficulty'];$ksum=$ksum.$v['KnowledgePoints'].',';}foreach($this->tiankong_zhongqun as $k=>$v){$dsum+=$v['Difficulty'];$ksum=$ksum.$v['KnowledgePoints'].',';}foreach($this->panduan_zhongqun as $k=>$v){$dsum+=$v['Difficulty'];$ksum=$ksum.$v['KnowledgePoints'].',';}foreach($this->jianda_zhongqun as $k=>$v){$dsum+=$v['Difficulty'];$ksum=$ksum.$v['KnowledgePoints'].',';}$dqknowcount=count(array_unique(explode(",",$ksum)))-1;echo "当前知识点数量:".$dqknowcount."<br>";$this->dqknowxs=$dqknowcount/$this->knowSum;$d=$dsum/($this->num+$this->duoxuan_num+$this->tiankong_num+$this->panduan_num+$this->jianda_num);$this->dqndxs=$d;if(abs($this->nandu - $d) < $this->wc && abs($this->know - $this->dqknowxs) < $this->wc ) //满足误差范围{return false;}else    //继续筛选{return true;}}//择优public function choice(){$xsc=[];foreach($this->zhongqun as $k=>$v){$v_know=count(array_unique(explode(",",$v['KnowledgePoints'])))-1;$xsc[$k]=abs($this->nandu - $v['Difficulty']) + abs($this->know - $v_know/$this->knowSum);} arsort($xsc,SORT_NUMERIC);//排序$newOne=floor($this->num * $this->h_probability);$i=0;foreach($xsc as $k=>$v){if($i<$newOne){unset($this->zhongqun[$k]);$i++;}}//多选$xsc=[];foreach($this->duoxuan_zhongqun as $k=>$v){$v_know=count(array_unique(explode(",",$v['KnowledgePoints'])))-1;$xsc[$k]=abs($this->nandu - $v['Difficulty']) + abs($this->know - $v_know/$this->knowSum);} arsort($xsc,SORT_NUMERIC);//排序$newOne=floor($this->duoxuan_num * $this->h_probability);$i=0;foreach($xsc as $k=>$v){if($i<$newOne){unset($this->duoxuan_zhongqun[$k]);$i++;}}//填空$xsc=[];foreach($this->tiankong_zhongqun as $k=>$v){$v_know=count(array_unique(explode(",",$v['KnowledgePoints'])))-1;$xsc[$k]=abs($this->nandu - $v['Difficulty']) + abs($this->know - $v_know/$this->knowSum);} arsort($xsc,SORT_NUMERIC);//排序$newOne=floor($this->tiankong_num * $this->h_probability);$i=0;foreach($xsc as $k=>$v){if($i<$newOne){unset($this->tiankong_zhongqun[$k]);$i++;}}//判断$xsc=[];foreach($this->panduan_zhongqun as $k=>$v){$v_know=count(array_unique(explode(",",$v['KnowledgePoints'])))-1;$xsc[$k]=abs($this->nandu - $v['Difficulty']) + abs($this->know - $v_know/$this->knowSum);} arsort($xsc,SORT_NUMERIC);//排序$newOne=floor($this->panduan_num * $this->h_probability);$i=0;foreach($xsc as $k=>$v){if($i<$newOne){unset($this->panduan_zhongqun[$k]);$i++;}}//简答$xsc=[];foreach($this->jianda_zhongqun as $k=>$v){$v_know=count(array_unique(explode(",",$v['KnowledgePoints'])))-1;$xsc[$k]=abs($this->nandu - $v['Difficulty']) + abs($this->know - $v_know/$this->knowSum);} arsort($xsc,SORT_NUMERIC);//排序$newOne=floor($this->jianda_num * $this->h_probability);$i=0;foreach($xsc as $k=>$v){if($i<$newOne){unset($this->jianda_zhongqun[$k]);$i++;}}}//杂交public function hybrid(){//计算单倍体长度$tm = array_rand($this->zhongqun,1);    //随即返回键名$cross_len = floor(strlen($tm)/2);$individuality='';//当种群繁殖到预定的数量时,停止繁殖while(count($this->zhongqun) < $this->num){if($this->hybrid_num >$this->limit){return false;}$a='';$b='';//随机选择两个个体进行杂交产生新个体$rand = array_rand($this->zhongqun,2);//杂交开始$a=substr($rand[0],0,$cross_len);$b=substr($rand[1],$cross_len);$individuality = $a.$b;//如果新个体在种群中已存在,则重新杂交产生新个体if(!isset($this->tiku[toTen($individuality)])) continue; //新个体纳入到种群中if(strlen($individuality)== $this->length){//echo $individuality."<br>";$this->zhongqun[$individuality] = $this->tiku[toTen($individuality)];//echo "杂交".$a."和".$b."<br/>";//echo "序号为:".$individuality."<br/>";$this->hybrid_num +=1;}}//当多选种群繁殖到预定的数量时,停止繁殖while(count($this->duoxuan_zhongqun) < $this->duoxuan_num){if($this->hybrid_num >$this->limit){return false;}$a='';$b='';//随机选择两个个体进行杂交产生新个体$rand = array_rand($this->duoxuan_zhongqun,2);//杂交开始$a=substr($rand[0],0,$cross_len);$b=substr($rand[1],$cross_len);$individuality = $a.$b;//如果新个体在种群中已存在,则重新杂交产生新个体if(!isset($this->duoxuan_tiku[toTen($individuality)])) continue; //新个体纳入到种群中if(strlen($individuality)== $this->length){//echo $individuality."<br>";$this->duoxuan_zhongqun[$individuality] = $this->duoxuan_tiku[toTen($individuality)];//echo "杂交".$a."和".$b."<br/>";//echo "序号为:".$individuality."<br/>";$this->hybrid_num +=1;}}//当填空种群繁殖到预定的数量时,停止繁殖while(count($this->tiankong_zhongqun) < $this->tiankong_num){if($this->hybrid_num >$this->limit){return false;}$a='';$b='';//随机选择两个个体进行杂交产生新个体$rand = array_rand($this->tiankong_zhongqun,2);//杂交开始$a=substr($rand[0],0,$cross_len);$b=substr($rand[1],$cross_len);$individuality = $a.$b;//如果新个体在种群中已存在,则重新杂交产生新个体if(!isset($this->tiankong_tiku[toTen($individuality)])) continue; //新个体纳入到种群中if(strlen($individuality)== $this->length){//echo $individuality."<br>";$this->tiankong_zhongqun[$individuality] = $this->tiankong_tiku[toTen($individuality)];//echo "杂交".$a."和".$b."<br/>";//echo "序号为:".$individuality."<br/>";$this->hybrid_num +=1;}}//当判断种群繁殖到预定的数量时,停止繁殖while(count($this->panduan_zhongqun) < $this->panduan_num){if($this->hybrid_num >$this->limit){return false;}$a='';$b='';//随机选择两个个体进行杂交产生新个体$rand = array_rand($this->panduan_zhongqun,2);//杂交开始$a=substr($rand[0],0,$cross_len);$b=substr($rand[1],$cross_len);$individuality = $a.$b;//如果新个体在种群中已存在,则重新杂交产生新个体if(!isset($this->panduan_tiku[toTen($individuality)])) continue; //新个体纳入到种群中if(strlen($individuality)== $this->length){//echo $individuality."<br>";$this->panduan_zhongqun[$individuality] = $this->panduan_tiku[toTen($individuality)];//echo "杂交".$a."和".$b."<br/>";//echo "序号为:".$individuality."<br/>";$this->hybrid_num +=1;}}//当简答种群繁殖到预定的数量时,停止繁殖while(count($this->jianda_zhongqun) < $this->jianda_num){if($this->hybrid_num >$this->limit){return false;}$a='';$b='';//随机选择两个个体进行杂交产生新个体$rand = array_rand($this->jianda_zhongqun,2);//杂交开始$a=substr($rand[0],0,$cross_len);$b=substr($rand[1],$cross_len);$individuality = $a.$b;//如果新个体在种群中已存在,则重新杂交产生新个体if(!isset($this->jianda_tiku[toTen($individuality)])) continue; //新个体纳入到种群中if(strlen($individuality)== $this->length){//echo $individuality."<br>";$this->jianda_zhongqun[$individuality] = $this->jianda_tiku[toTen($individuality)];//echo "杂交".$a."和".$b."<br/>";//echo "序号为:".$individuality."<br/>";$this->hybrid_num +=1;}}return true;}//变异public function variation(){$vriants = array_rand($this->zhongqun,ceil($this->v_probability * $this->num));if(is_array($vriants)){//有多个变种foreach($vriants as $v){$i = $this->change_something($v,1);if($i === false){return false;}$this->zhongqun[$i] = $this->tiku[toTen($i)];unset($this->zhongqun[$v]);}}else{//只有一个变种$i = $this->change_something($vriants,1);if($i === false){return false;}$this->zhongqun[$i] = $this->tiku[toTen($i)];unset($this->zhongqun[$vriants]);}//多选种群$vriants = array_rand($this->duoxuan_zhongqun,ceil($this->v_probability * $this->duoxuan_num));if(is_array($vriants)){//有多个变种foreach($vriants as $v){$i = $this->change_something($v,2);if($i === false){return false;}$this->duoxuan_zhongqun[$i] = $this->duoxuan_tiku[toTen($i)];unset($this->duoxuan_zhongqun[$v]);}}else{//只有一个变种$i = $this->change_something($vriants,2);if($i === false){return false;}$this->duoxuan_zhongqun[$i] = $this->duoxuan_tiku[toTen($i)];unset($this->duoxuan_zhongqun[$vriants]);}//填空种群$vriants = array_rand($this->tiankong_zhongqun,ceil($this->v_probability * $this->tiankong_num));if(is_array($vriants)){//有多个变种foreach($vriants as $v){$i = $this->change_something($v,3);if($i === false){return false;}$this->tiankong_zhongqun[$i] = $this->tiankong_tiku[toTen($i)];unset($this->tiankong_zhongqun[$v]);}}else{//只有一个变种$i = $this->change_something($vriants,3);if($i === false){return false;}$this->tiankong_zhongqun[$i] = $this->tiankong_tiku[toTen($i)];unset($this->tiankong_zhongqun[$vriants]);}//判断种群$vriants = array_rand($this->panduan_zhongqun,ceil($this->v_probability * $this->panduan_num));if(is_array($vriants)){//有多个变种foreach($vriants as $v){$i = $this->change_something($v,4);if($i === false){return false;}$this->panduan_zhongqun[$i] = $this->panduan_tiku[toTen($i)];unset($this->panduan_zhongqun[$v]);}}else{//只有一个变种$i = $this->change_something($vriants,4);if($i === false){return false;}$this->panduan_zhongqun[$i] = $this->panduan_tiku[toTen($i)];unset($this->panduan_zhongqun[$vriants]);}//简答种群$vriants = array_rand($this->jianda_zhongqun,ceil($this->v_probability * $this->jianda_num));if(is_array($vriants)){//有多个变种foreach($vriants as $v){$i = $this->change_something($v,5);if($i === false){return false;}$this->jianda_zhongqun[$i] = $this->jianda_tiku[toTen($i)];unset($this->jianda_zhongqun[$v]);}}else{//只有一个变种$i = $this->change_something($vriants,5);if($i === false){return false;}$this->jianda_zhongqun[$i] = $this->jianda_tiku[toTen($i)];unset($this->jianda_zhongqun[$vriants]);}return true;}private function change_something($str,$type){if($this->vari_num > $this->limit){return false;}//$this->vari_num += 1;$l=strlen($str)-1;//获取当前种群中已有的个体$position = rand(0,strlen($str)-1);$arr1=str_split($str);//echo "当前str长度:".$l;//echo "<br>当前position:".$position."<br>";if($arr1[$position] == 1){$arr1[$position]=0;}else if($arr1[$position] == 0){$arr1[$position]=1;}$str=implode("",$arr1);if($type==1){//如果变异后的个体已经在种群中存在,则重新变异,或者变异后的个体在题库中不存在时,重新变异if(in_array($str,array_keys($this->zhongqun))){   //变异后的键名存在种群键名数组里$this->change_something($str,1);}else{//变异后的个体不在题库中if(!isset($this->tiku[toTen($str)])){$str = $this->change_something($str,1);}else{//变异的新个体在当前种群中不存在,并且存在于题库中return $str;}}}else if($type == 2){//如果变异后的个体已经在种群中存在,则重新变异,或者变异后的个体在题库中不存在时,重新变异if(in_array($str,array_keys($this->duoxuan_zhongqun))){   //变异后的键名存在种群键名数组里$this->change_something($str,2);}else{//变异后的个体不在题库中if(!isset($this->duoxuan_tiku[toTen($str)])){$str = $this->change_something($str,2);}else{//变异的新个体在当前种群中不存在,并且存在于题库中return $str;}}}else if($type==3){//如果变异后的个体已经在种群中存在,则重新变异,或者变异后的个体在题库中不存在时,重新变异if(in_array($str,array_keys($this->tiankong_zhongqun))){   //变异后的键名存在种群键名数组里$this->change_something($str,3);}else{//变异后的个体不在题库中if(!isset($this->tiankong_tiku[toTen($str)])){$str = $this->change_something($str,3);}else{//变异的新个体在当前种群中不存在,并且存在于题库中return $str;}}}else if($type == 4){//如果变异后的个体已经在种群中存在,则重新变异,或者变异后的个体在题库中不存在时,重新变异if(in_array($str,array_keys($this->panduan_zhongqun))){   //变异后的键名存在种群键名数组里$this->change_something($str,4);}else{//变异后的个体不在题库中if(!isset($this->panduan_tiku[toTen($str)])){$str = $this->change_something($str,4);}else{//变异的新个体在当前种群中不存在,并且存在于题库中return $str;}}}else if($type == 5){//如果变异后的个体已经在种群中存在,则重新变异,或者变异后的个体在题库中不存在时,重新变异if(in_array($str,array_keys($this->jianda_zhongqun))){   //变异后的键名存在种群键名数组里$this->change_something($str,5);}else{//变异后的个体不在题库中if(!isset($this->jianda_tiku[toTen($str)])){$str = $this->change_something($str,5);}else{//变异的新个体在当前种群中不存在,并且存在于题库中return $str;}}}}public function get_papers(){$i = 1;while($this->check()){echo '当前'.$i.'代<br>';echo '当前试卷难度系数为'.$this->dqndxs."<br>";echo '当前知识点覆盖率为'.$this->dqknowxs."<br><br>";if($i > $this->limit){return array('status'=>0,'info'=>'系统经过长达'.$this->limit.'次的尝试,还是没有组卷成功,请尝试重新组卷!');}//选择$this->choice();//杂交if(!$this->hybrid()){return array('status'=>0,'info'=>'杂交次数过多,请尝试重新组卷,或者您可以放宽误差范围后在组卷!');}//echo "杂交完成,进行变异.<br/>";//变异if(!$this->variation()){return array('status'=>0,'info'=>'变异次数过多,请尝试重新组卷,或者您可以放宽误差范围后在组卷!');}//echo "第".$i."次进化,试卷难度系数为".$this->nandu.",知识点覆盖率为".$this->know."<br/>";//print_r($this->zhongqun);$i++;}$data = [];$data2=[];foreach($this->zhongqun as $k=>$v){$data[$v['QOptionID']] = $v;}foreach($this->duoxuan_zhongqun as $k=>$v){$data[$v['QOptionID']] = $v;}foreach($this->tiankong_zhongqun as $k=>$v){$data2[$v['QuestionNo']] = $v;}foreach($this->panduan_zhongqun as $k=>$v){$data2[$v['QuestionNo']] = $v;}foreach($this->jianda_zhongqun as $k=>$v){$data2[$v['QuestionNo']] = $v;}return array('status'=>1,'info'=>'组卷成功','num'=>$i,'data'=>$data,'data2'=>$data2);}}
$m = new zujuan(3,0.8,0.2,10,5,5,10,5);  //难度系数、知识点覆盖率、误差、单选题个数、多选题个数$res = $m->get_papers();$i=0;
if($res['status']){echo '经过'.$res['num'].'代<br>';echo '当前试卷难度系数为'.$m->dqndxs;echo '<br>难度系数误差'.abs(3-$m->dqndxs).'<br>';echo '当前知识点覆盖率为'.$m->dqknowxs;echo '<br>知识点覆盖误差'.abs(0.75-$m->dqknowxs).'<br>';echo '<hr>';echo '<br>变异次数:'.$m->vari_num;echo '<br>杂交次数:'.$m->hybrid_num;echo '<hr>试卷题目分别为:';echo "<br>选择题部分为<br>";foreach($res['data'] as $k=>$v){echo '<br>第'.$k.'题';print_r($v);$i++;}echo "<br>非选择题部分为<br>";foreach($res['data2'] as $k=>$v){echo '<br>第'.$k.'题';print_r($v);$i++;}
}else{echo $res['info'];echo '<hr>';echo '<br>变异次数:'.$m->vari_num;echo '<br>杂交次数:'.$m->hybrid_num;
}
echo "<br>一共".$i."道题<br>";
//$str="1010101010";
//$arr1 = str_split($str);
//echo '变异前:'.$str."<br/>";
获取当前种群中已有的个体
//echo "str的长度为".strlen($str)."<br>";
//$position = rand(0,strlen($str)-1);
//echo "当前改变的position为:".$position."<br/>";
//if($arr1[$position] == 1){
//    $arr1[$position]=0;
//}else if($str{$position} == 0){
//    $arr1[$position]=1;
//}
//$newstr=implode("",$arr1);
//echo "变异后:".$newstr."<br/>";?>

PHP实现基于遗传算法的组卷模块(Mysql+PHP)相关推荐

  1. 基于遗传算法自动组卷的实现

    1  遗传算法介绍 1.1 遗传算法概要 遗传算法是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,它是用来解决多约束条件下的最优问题. 遗传算法是 ...

  2. 协同进化遗传算法 代码_遗传算法在组卷中的应用

    最近看到之前做的项目,是关于使用遗传算法实现智能组卷的.所以这次为大家分享遗传算法的基本原理,以及在实际场景中的应用. "揭开算法神秘的面纱" 在学习计算机相关知识时,我们必定会遇 ...

  3. 遗传算法(二)之组卷算法

    组卷算法主要用于编制科学.公正的试卷的一种算法,具体大家可以百度看一下.我这篇文章主要是讲解如何通过遗传算法来实现组卷,遗传算法大家不清楚的地方仍然可以查看百度,不是这篇文章的重点. 一.遗传算法的表 ...

  4. 基于遗传算法的试题组卷

    基于遗传算法的试题组卷 IT企业每年都会在春季和秋季举行校园招聘,对于个性化定制的试卷需求量很大,如何组出又好又快的定制化试题对于IT企业非常重要.组卷技术主要针对知识点覆盖率,题型,难度系数,试题数 ...

  5. 组卷系统php遗传算法,基于遗传算法的智能组卷系统实现

    考试作为教育测量学和教育统计学和的基本原理,不仅是对学生学习能力和知识水平的检验方式,也是对教师教育教学水平评价和体现的重要手段之一.如何更加客观公正地反映学生的学习状况,全面地掌握和评价教师的教学工 ...

  6. 遗传算法组卷使用心得

    1.什么是遗传算法? 遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法. 2.我们都用它来 ...

  7. java实现自动组卷要用什么算法_基于Java的自动组卷系统的实现

    基于 的 自动组卷系统的实现李桂玲 四平职业 大学计葬机工程 系 引言 考试作为教学测评的最主要的手段 , 其规范性 . 科学性以及考试工作的组织 . 管理等 , 直接关系到教学测评的准确性和客观性 ...

  8. Java使用遗传算法实现智能组卷

    遗传算法实现智能组卷 0.需求:用户选择知识点.年级.难度系数.题型.题目总数量,一键智能生成试卷,如下 1.遗传算法: 1.0 参考博文: 理论概念详解:https://www.jianshu.co ...

  9. 遗传算法在自动组卷中的应用

    遗传算法 遗传算法(Genetic Algorithm)是一种模拟自然界的进化规律-优胜劣汰演化来的随机搜索算法,其在解决多种约束条件下的最优解这类问题上具有优秀的表现. 1. 基本概念 在遗传算法中 ...

最新文章

  1. 从清华退学,他赴美读博又两次退学!离开谷歌后,如今他怎样了?
  2. 在VMware15中创建虚拟机安装ubuntu系统(超详细教程)
  3. 如何理解git的快照?
  4. 深度学习- Dropout 稀疏化原理解析
  5. 推荐一个非常火爆的电商开源项目!
  6. UNITY ET 框架
  7. UVA10369 Arctic Network
  8. Mac本如何运营php框架,1、Mac系统下搭建thinkPHP框架环境
  9. win10你的组织已关闭自动更新问题怎么解决?
  10. 《剑指offer》面试题21——包含min函数的栈(C++)
  11. 一个封锁操作被对 wsacancelblockingcall 的调用中断_备战秋招——操作系统(3)
  12. 达内android 代码,【达内唯一总部】Android实现获取系统应用列表-达内Android分享...
  13. 中国电信宣布全面布局元宇宙,将打造元宇宙平台和内容生态
  14. 解决imp导入dmp文件报:IMP-00038: 无法转换为环境字符集句柄IMP-00000: 未成功终止导入
  15. 流量之战:阿里150亿入股分众,到底为哪般?
  16. python barplot宽度,如何在seaborn barplot上设置宽度
  17. 【Hive】解析复杂json格式字段
  18. Vue开发中的一点技♂巧
  19. vue vuex和pinia(菠萝)的区别
  20. 从手机用FTP客户端下载服务器中的文件

热门文章

  1. 安全企业如360如何做无线安全(I)
  2. ManageEngine的EventLog Analyzer许可信息
  3. win10,win11微软输入法如何导入搜狗词库的方法-词库转换
  4. 【JAVA】acwing语法基础课刷题(138 / 138)完结
  5. 【网络编程知识】什么是Socket?概念及原理分析
  6. 设计模式系列之建造者模式构建实体类
  7. 一周新奇酷应用 这款字幕APP太好用了
  8. 2.4.3 码分复用
  9. mysql ora01031_逻辑备库上创建JOB报ORA-01031错误
  10. 经验篇:朋友成功入职商汤自然语言处理算法工程师,整理了一份自然语言处理入门学习资料(NLP自然语言处理/学习路径)