最近在开发一个基于PHP的高校毕业设计系统
问题描述:1、三个对象,导师(teacher,负责辅导学生毕业论文,每个导师可以有多个辅导的学生,最多为七八个);学生(student);评委小组人员(jury,由导师组成,每个小组人数大致为四五个。当最后评阅小组数目不够时,导师可以加入多个评阅小组);2、现在就是在其中遇到这样一个问题:
在评阅小组的分配时,要求每个导师自己所带的学生不能出现在他所参与的评阅小组。而且要做到,尽量每个评阅小组所评阅的学生人数大致相同。各位有什么思路的话说下··感激中~~

解决方案 »

  1.   

    1 首先要确定 导师和辅导的学生的集合 他们之间是1对n的关系(关系C)
    2 评委小组由两部分组成 评委老师(A)+评审对象(B)
    3 要求是A中的所有老师和B中的学生不具备关系C
    在满足上述条件下 往集合A中填充4个左右对象 往B中填充n个(根据实际情况 比如一个学校有多少人 一个评审组在期限内一般能评审多少学生来大致算出)所以我觉得,
    1 首先是有导师和辅导学生的登录页面,每个导师辅导多少学生要一一登录,可以给各位导师权限 自己登入。期限之内,自由修改,期限之后非管理员不可修改。(需要各做个master表,还要分成group 比如以各专业来分,有些导师说不定跨专业,还有一些虽然不是导师 但是充当监察员角色的行政人员也有可能存在)
    2 在到达登录期限之后,根据登录数据,算出大概B集合中大概需要填充的数目count_b
    3 分配评审页面:有一个导师列表或者下拉框,当选择完导师的时候,点击【评审学生列表生成】按钮,则按照上面说的3的规则,随机抽取count_b个学生
    4 最后可能需要抽取数据来分析调整一下
    (导师的选择也可以程序随机抽取,但是感觉大学里一般都还是手工操作,因为有些人员搭配可能需要根据一些规则来调配,这些规则可能不适合计算机处理)
      

  2.   

    用php做简直没难度利用数组特性就可轻松搞定三个对象,导师(teacher,负责辅导学生毕业论文,每个导师可以有多个辅导的学生,最多为七八个);学生(student);评委小组人员(jury,由导师组成,每个小组人数大致为四五个。当最后评阅小组数目不够时,导师可以加入多个评阅小组);2、现在就是在其中遇到这样一个问题:
    在评阅小组的分配时,要求每个导师自己所带的学生不能出现在他所参与的评阅小组。而且要做到,尽量每个评阅小组所评阅的学生人数大致相同。设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], 记得从原数组删除该学生.
       */
       待分配学生数--;
     }
    }说明: 我仅在此快速说明原理,代码请自己完成.