最近在开发一个基于PHP的高校毕业设计系统
问题描述:1、三个对象,导师(teacher,负责辅导学生毕业论文,每个导师可以有多个辅导的学生,最多为七八个);学生(student);评委小组人员(jury,由导师组成,每个小组人数大致为四五个。当最后评阅小组数目不够时,导师可以加入多个评阅小组);2、现在就是在其中遇到这样一个问题:
在评阅小组的分配时,要求每个导师自己所带的学生不能出现在他所参与的评阅小组。而且要做到,尽量每个评阅小组所评阅的学生人数大致相同。各位有什么思路的话说下··感激中~~
问题描述:1、三个对象,导师(teacher,负责辅导学生毕业论文,每个导师可以有多个辅导的学生,最多为七八个);学生(student);评委小组人员(jury,由导师组成,每个小组人数大致为四五个。当最后评阅小组数目不够时,导师可以加入多个评阅小组);2、现在就是在其中遇到这样一个问题:
在评阅小组的分配时,要求每个导师自己所带的学生不能出现在他所参与的评阅小组。而且要做到,尽量每个评阅小组所评阅的学生人数大致相同。各位有什么思路的话说下··感激中~~
2 评委小组由两部分组成 评委老师(A)+评审对象(B)
3 要求是A中的所有老师和B中的学生不具备关系C
在满足上述条件下 往集合A中填充4个左右对象 往B中填充n个(根据实际情况 比如一个学校有多少人 一个评审组在期限内一般能评审多少学生来大致算出)所以我觉得,
1 首先是有导师和辅导学生的登录页面,每个导师辅导多少学生要一一登录,可以给各位导师权限 自己登入。期限之内,自由修改,期限之后非管理员不可修改。(需要各做个master表,还要分成group 比如以各专业来分,有些导师说不定跨专业,还有一些虽然不是导师 但是充当监察员角色的行政人员也有可能存在)
2 在到达登录期限之后,根据登录数据,算出大概B集合中大概需要填充的数目count_b
3 分配评审页面:有一个导师列表或者下拉框,当选择完导师的时候,点击【评审学生列表生成】按钮,则按照上面说的3的规则,随机抽取count_b个学生
4 最后可能需要抽取数据来分析调整一下
(导师的选择也可以程序随机抽取,但是感觉大学里一般都还是手工操作,因为有些人员搭配可能需要根据一些规则来调配,这些规则可能不适合计算机处理)
在评阅小组的分配时,要求每个导师自己所带的学生不能出现在他所参与的评阅小组。而且要做到,尽量每个评阅小组所评阅的学生人数大致相同。设teacher_id为{1,2.....m}, student_id{1,2....n}, jury_id{1,2...j}
用数组表示为 array_teacher_id, array_student_id,array_jury_id
先根据实际情况初始化个数组,映射教师-学生对应情况
teacher_student = array(
teacher_id_1 = array(
student_id_a,student_id_b.....
),
teacher_id_2 = array(
student_id_a,student_id_b.....
),
....
);
然后是小组-教师对应
jury_teacher = array(
jury1 = array(
teacher_id_a,teacher_id_b......
),
jury2 = array(
teacher_id_a,teacher_id_b......
),
...
);唯一复杂点的,是 小组-学生对应的分配,可以这样:
1.初始化,使得小组组数与上面那个小组-教师对应
jury_student = array(
jury1=array(),
jury2=array(),
...
);
2.开始选学生
待分配学生数=count(array_student_id)
while (待分配学生数>0){
foreach ($jury_student as $jury=>$student){
//先取得该组所有教师的所带学生名单
$array_temp=array();
foreach ($jury_teacher[$jury] as $key=>$t_id){
$array_temp = array_merge($array_temp,$teacher_student[$t_id]);
}
//利用数组差求得可选的学生名单
$students_array = array_diff( array_student_id , $array_temp)
/* @todo: 从 $students_array 随机取一个0-count间数字i作为索引,将 $students_array[i]放入$jury_student[$jury], 记得从原数组删除该学生.
*/
待分配学生数--;
}
}说明: 我仅在此快速说明原理,代码请自己完成.