zoukankan      html  css  js  c++  java
  • 智能分配算法

    接口比较复杂,还不知道该如何分离,先做记录,都有详细的注释

    //智能分配 —— 核心功能
            public function intelligentAlloc() {
    	$user = $this->auto_login();
    	$grade = Db::table('tc_grade')->order('grade desc')->select();
    	// $user['department'] = "信息安全与网络工程系";
    	// $user['workNumber'] = "00001";
    	$wishList = ['wishFirst','wishSecond','wishThird','wishForth','wishFifth'];
    	$voluntaryNum = Db::table('tc_voluntaryinfosetting')->where('workNumber',$user['workNumber'])->find();
    
    	//获取未分配到导师的学生信息
    	$student = Db::table('user_student_'.$grade[0]['grade'])->where('chosen',0)->where('department',$user['department'])->field('sid,serialNum,gpa,chosen')->select();
    	$countStudent = count($student);
    	$inputStudent = [];
    
    	for ($i=0; $i <$countStudent ; $i++) {
    		//获取每个学生的志愿信息
    		if (Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid', $student[$i]['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find()) { 
    			$student[$i]['voluntary'] = Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid', $student[$i]['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find();
    
    		//将每个学生的志愿信息转换成规定格式的txt文件
    			$inputStudent[$i] = $student[$i]['serialNum'] . ' ' . $student[$i]['gpa'] . PHP_EOL;
    	        for ($j=0; $j <$voluntaryNum['voluntaryNum'] ; $j++) {
    	            $inputStudent[$i] = $inputStudent[$i] . $student[$i]['voluntary'][$wishList[$j]] . PHP_EOL;
    	        }
    	        if (($i+1) != $countStudent) {
    		        $inputStudent[$i] = $inputStudent[$i] . PHP_EOL;
    		    }
    	    }
    	}
    
    	$countInputStudent = count($inputStudent);
    	if ($countInputStudent != 0) {
    		//将获取的学生信息转换为.txt文件
            file_put_contents('student.txt', $inputStudent);
    
            //获取导师信息
            if ($user['department'] == "计算机实验班") {
            	$teacher = Db::table('user_teacher')->where('isExperial',1)->whereOr('isExperial',3)->select();
            	$countTeacher = count($teacher);
    
            	for ($i=0; $i <$countTeacher ; $i++) { 
            		//获取每个老师的当前可带的计算机实验班的学生数
            		$teacherIssue[$i] = Db::table('tc_issue_'.$grade[0]['grade'])->where('workNumber', $teacher[$i]['workNumber'])->find();
            		$teacher[$i]['avaliableNumber'] = $teacherIssue[$i]['totalCompExper'] - $teacherIssue[$i]['compExperNow'];
    
            		//将每个导师的信息转换成规定格式的txt文件
            		$inputTeacher[$i] = $teacher[$i]['workNumber'] . ' ' . $teacher[$i]['avaliableNumber'] . PHP_EOL;
            	}
            } elseif ($user['department'] == "数学实验班") {
            	$teacher = Db::table('user_teacher')->where('isExperial',2)->whereOr('isExperial',3)->select();
            	$countTeacher = count($teacher);
    
            	for ($i=0; $i <$countTeacher ; $i++) { 
            		//获取每个老师的当前可带的数学实验班的学生数
            		$teacherIssue[$i] = Db::table('tc_issue_'.$grade[0]['grade'])->where('workNumber', $teacher[$i]['workNumber'])->find();
            		$teacher[$i]['avaliableNumber'] = $teacherIssue[$i]['totalMathExper'] - $teacherIssue[$i]['mathExperNow'];
    
            		//将每个导师的信息转换成规定格式的txt文件
            		$inputTeacher[$i] = $teacher[$i]['workNumber'] . ' ' . $teacher[$i]['avaliableNumber'] . PHP_EOL;
            	}
            } else {
            	$teacher = Db::table('user_teacher')->where('department',$user['department'])->select();
            	$countTeacher = count($teacher);
    
            	for ($i=0; $i <$countTeacher ; $i++) { 
            		//获取每个老师的当前可带的自然班的学生数
            		$teacherIssue[$i] = Db::table('tc_issue_'.$grade[0]['grade'])->where('workNumber', $teacher[$i]['workNumber'])->find();
            		$teacher[$i]['avaliableNumber'] = $teacherIssue[$i]['totalNatur'] - $teacherIssue[$i]['naturNow'];
    
            		//将每个导师的信息转换成规定格式的txt文件
            		$inputTeacher[$i] = $teacher[$i]['workNumber'] . ' ' . $teacher[$i]['avaliableNumber'] . PHP_EOL;
            	}
            }
            //将获取的老师信息转换为.txt文件
            file_put_contents('teacher.txt', $inputTeacher);
    
            //调用算法进行分配
            $fileNameWithParam = 'distribute.exe ' . $countStudent . ' ' . $countTeacher . ' ' . $voluntaryNum['voluntaryNum'];
            system($fileNameWithParam);
    
            $studentElected = file_get_contents('student_elected.txt');      
            //获取通过算法得到分配的学生的结果,转换为string
    
            //分割studentElected字符串,转换为数组,并存到临时的结果表中
            if ($studentElected != "") {
    	        $studentElected = str_replace("
    ", '', $studentElected);
    	        $studentElectedArr = explode(',', $studentElected);
    	        for ($i = 0; $i < count($studentElectedArr); $i++) {
    	            $studentElectedArr[$i] = explode(' ', $studentElectedArr[$i]);
    
    	            $studentElectedResult[$i]['serialNum'] = $studentElectedArr[$i][0];
    	            $studentElectedResult[$i]['stuInfo'] = Db::table('user_student_'.$grade[0]['grade'])->where('serialNum', $studentElectedResult[$i]['serialNum'])->field('sid,serialNum,name,gpa')->find();
    	            $studentElectedResult[$i]['workNumber'] = $studentElectedArr[$i][1];
    	            $studentElectedResult[$i]['teaInfo'] = Db::table('user_teacher')->where('workNumber', $studentElectedResult[$i]['workNumber'])->field('workNumber,name')->find();
    
    	            if (Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid',$studentElectedResult[$i]['stuInfo']['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find()) {
    		            $vol_num[$i] = array_keys(Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid',$studentElectedResult[$i]['stuInfo']['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find(),$studentElectedResult[$i]['teaInfo']['workNumber']);
    		            if ($vol_num[$i][0] == "wishFirst") {
    		            	$volOrder = "第一志愿";
    		            } elseif ($vol_num[$i][0] == "wishSecond") {
    		            	$volOrder = "第二志愿";
    		            } elseif ($vol_num[$i][0] == "wishThird") {
    		            	$volOrder = "第三志愿";
    		            } elseif ($vol_num[$i][0] == "wishForth") {
    		            	$volOrder = "第四志愿";
    		            } elseif ($vol_num[$i][0] == "wishFifth") {
    		            	$volOrder = "第五志愿";
    		            }
    
    		            $insert[$i]['sid'] = $studentElectedResult[$i]['stuInfo']['sid'];
    		            $insert[$i]['serialNum'] = $studentElectedResult[$i]['stuInfo']['serialNum'];
    		            $insert[$i]['student_name'] = $studentElectedResult[$i]['stuInfo']['name'];
    		            $insert[$i]['vol_num'] = $volOrder;
    		            $insert[$i]['gpa'] = $studentElectedResult[$i]['stuInfo']['gpa'];
    		            $insert[$i]['teacher_name'] = $studentElectedResult[$i]['teaInfo']['name'];
    		            $insert[$i]['workNumber'] = $studentElectedResult[$i]['teaInfo']['workNumber'];
    		            $insert[$i]['checked'] = 0;
    
    		            if (Db::table('tc_temp_result')->where('sid',$insert[$i]['sid'])->find()) {
    		            	Db::table('tc_temp_result')->update($insert[$i]);
    		            } else {
    		            	Db::table('tc_temp_result')->insert($insert[$i]);
    		            }
    		        }
    	        }
    	    }
    	    $data['status'] = "success";
    	    return json($data);
    	} else {
    		$data['amount'] = 0;
    		$data['msg'] = "所有学生均未填报志愿,无法进行智能分配";
    		$data['student'] = "";
    		return json($data);
    	}
        // return json($insert);
        $this->assign('user', $user);
    
    }
  • 相关阅读:
    HPB 是什么
    HPB共识算法选举机制描述
    【CS231n】斯坦福大学李飞飞视觉识别课程笔记(六):线性分类笔记(上)
    大讲堂专访丨连接Oracle DBA与开发的桥梁:Oracle的redo与undo
    SCN风波又起,2019年6月之前Oracle必须升级吗?
    去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4
    OpenStack 的单元测试
    创建docker镜像的两种方式
    Vue.js 条件渲染 v-if、v-show、v-else
    Linux下Wiki服务器的搭建
  • 原文地址:https://www.cnblogs.com/liamqm/p/6206104.html
Copyright © 2011-2022 走看看