标题:求助各位大侠,关于学生毕业设计答辩分组的算法
只看楼主
烧包谷
Rank: 2
等 级:论坛游民
威 望:2
帖 子:60
专家分:69
注 册:2010-10-11
结帖率:75%
已结贴  问题点数:20 回复次数:9 
求助各位大侠,关于学生毕业设计答辩分组的算法
  毕业设计学生答辩分组。每一组答辩由若干老师组成的答辩教师组,将学生大致均等分配到每组去答辩。要求是:学生不能到毕设导师所在组答辩。我没有思路,求各位给我一点思路。谢谢了!
搜索更多相关主题的帖子: 毕业 设计 
2012-09-30 07:12
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:20 
列出各个毕设导师所带的学生(a、b...)
列出各组答辩组导师所有的人数(A, B...)
确定均分学生到各答辩组去的人数[n, n+1]

统计每个学生可以被分配的答辩组  或者  统计每个答辩组可以接受的学生
进行分配(组合)


注意细节的处理
2012-10-01 01:40
烧包谷
Rank: 2
等 级:论坛游民
威 望:2
帖 子:60
专家分:69
注 册:2010-10-11
得分:0 
谢谢!
2012-10-01 07:27
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
得分:0 
分治算法能帮助你
所谓分治就是问题 1分 为 2
这么一直分下去 直到分到 单个同学

然后再用合并算法,就能得到 面试组  和 同学的关系了

我要成为嘿嘿的黑客,替天行道
2012-10-01 22:55
烧包谷
Rank: 2
等 级:论坛游民
威 望:2
帖 子:60
专家分:69
注 册:2010-10-11
得分:0 
这个怎么用分治算法我不是很清楚!斑竹,你能不能详细一些!还有一点我对了,这些分组是要求随机的。谢谢!
2012-10-03 17:04
烧包谷
Rank: 2
等 级:论坛游民
威 望:2
帖 子:60
专家分:69
注 册:2010-10-11
得分:0 
回复 2楼 寒风中的细雨
我根据您提供思路写了一些代码,有问题,再次向您请教。
 我的实现思路:   
   (1)将所有的学生放到待分配容器Student_List;
   (4)根据组数目,重复操作(3)(4)。直到每一组都操作一遍结束
   (3)根据组号,从Student_List中选该组的可选项,可选项组成的列表为Optional_List
   (4)从Optional_List中随机选出Group_Count(Group_Count:表示每组最少人数)项,将选出的添加到对应组中,将已选出的项从Student_List中删除。
   
    (5)Student_List中的剩余项分配
   现在是(1)到(4)这里就有问题了。这种分配不能保证每一组都能分配到Group_Count个数据。举个列子吧,第一组分配的学生的毕业设计导师恰好是第二组的答辩教师,第二组分配的学生恰的毕业设计导师恰好是第一组的答辩教师,这时候第三组就不能分配到学生(假设只有三组)。
   到了这里,希望你给我提供一个详细的算法。谢谢~~~!
   
2012-10-04 19:23
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
//1、同学跟着指导老师组的队伍进入相应的答辩组
//2、答辩组与组之间进行学生互换
//3、没有一个同学在原来的组中


交换学生的过程中 不能破坏原本交换好的学生状态

[ 本帖最后由 寒风中的细雨 于 2012-10-5 09:41 编辑 ]
2012-10-05 09:39
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
程序代码:
//bccn.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class CCommon
{
public:
    CCommon(string &nName, string &nNo, size_t nTeamNo)
    {
        m_Name = nName;
        m_No = nNo;
        m_TeamNo = nTeamNo;
    }
    //设置名字
    void SetName(string &nName){ m_Name = nName; }
    //获取名字
    string GetName()const{ return m_Name; }
    //设置学号/工号
    void SetNo(string &nNo){ m_No = nNo; }
    //获取学号/工号
    string GetNo()const {return m_No; }
    //设置答辩组号
    void SetTeamNo(size_t nTeamNo){ m_TeamNo = nTeamNo;}
    //获取答辩组号
    size_t GetTeamNo()const{ return m_TeamNo; }
protected:
    string m_Name;//姓名
    string m_No;//学号/工号
    size_t m_TeamNo;//原始组
};
class CStudent: public CCommon
{//学生类
public:
    CStudent(string nName, string nNo, size_t nTeamNo = 0):
      CCommon(nName, nNo, nTeamNo)
    {
        m_NewTeamNo = nTeamNo;
    }
    //设置新的答辩组
    void SetNewTeam(size_t nNew){ m_NewTeamNo = nNew;}
    //获取新的答辩组
    size_t GetNewTeam()const{ return m_NewTeamNo; }
    //原始答辩组合现在分配的答辩组是否在同组  在true 否则false
    bool IsSameTeam()const{return (m_TeamNo == m_NewTeamNo);}
private:
    size_t m_NewTeamNo;//新组
};
class CTeacher: public CCommon
{//导师类
public:
    CTeacher(string nName, string nNo, size_t nTeamNo = 0):
      CCommon(nName, nNo, nTeamNo){}
    //添加学生
      void AddStudent(CStudent &stu){ m_StuArray.push_back(stu); }
    //设置学生的答辩组id
      void SetStudentTeamNo(size_t nNo)
      {
          vector<CStudent>::iterator itBeg = m_StuArray.begin(),
              itEnd = m_StuArray.end();
          while (itEnd != itBeg)
          {
              itBeg->SetTeamNo(nNo);
          }
      }
    //获取所指导的学生信息
      vector<CStudent>& GetStuInfo(){ return m_StuArray;}
private:
    vector<CStudent> m_StuArray;//辅导的学生
};
class CTeam
{//答辩组类
public:
    vector<CTeacher> m_Teacher;//答辩组中的导师们
    vector<CStudent> m_ExchgStu;//需要交换的同学们
    vector<CStudent> m_Student;//答辩组中的同学们
    size_t m_TeamNo;//答辩组的ID
};
vector<CStudent> g_StudentList;//学生信息
vector<CTeacher> g_TeacherList;//导师信息
vector<CTeam> g_TeamList;//答辩组信息
//读取学生的信息
void ReadStudentInfo()
{
}
//读取导师的信息
void ReadTeacherInfo()
{
}
//学生分导师
void StudAttachTeach()
{
    //这里采用自动分配
    //策略:所有的学生平均分配到各个导师
    size_t i = g_StudentList.size();//学生的人数
    size_t j = g_TeacherList.size();//导师的人数
    if (i < j){ cout << "学生的人数少于导师的人数!" << endl; exit(-1); }
    size_t avg = i/j;//平均分配的人数
    vector<CStudent>::iterator itStuBeg = g_StudentList.begin(),
        itStuEnd = g_StudentList.end();
    vector<CTeacher>::iterator itTeaBeg = g_TeacherList.begin(),
        itTeaEnd = g_TeacherList.end();
    while (itStuBeg != itStuEnd && itTeaEnd != itTeaBeg)
    {
        for (;avg; --avg)
        {
            itTeaBeg->AddStudent(*itStuBeg);
            ++itStuBeg;
            --i;
        }
        --j;
        ++itTeaBeg;
        if (0 == i  || 0 == j)
        {
            break;
        }
        avg = i/j;
    }
}
//导师分组
void TeachAttachTeam()
{
    //这里采用自动分配
    //策略:所有的导师平均分配到各个组中
    size_t i;
    size_t j = g_TeacherList.size();
    cout << j << "名导师分成多少答辩组:";
    cin >> i;
    if (1 == i)
    {
        cout << "一个组!" << endl;
        exit(-1);
    }
    if (i > j)
    {
        cout << "答辩的分组个数大于导师的人数!" << endl;
        exit(-1);
    }
    g_TeamList.resize(i);
    size_t avg = i/j;//平均分配的人数
    vector<CTeacher>::iterator itTeaBeg = g_TeacherList.begin(),
        itTeaEnd = g_TeacherList.end();
    vector<CTeam>::iterator itTeamBeg = g_TeamList.begin(),
        itTeamEnd = g_TeamList.end();
    while (itTeaEnd != itTeaBeg && itTeamEnd != itTeamBeg)
    {
        itTeamBeg->m_TeamNo = i;//组号
        for (; avg; --avg)
        {
            itTeaBeg->SetTeamNo(i);//设置导师的答辩组
            itTeaBeg->SetStudentTeamNo(i);//设置导师所指导学生的答辩组
            itTeamBeg->m_Teacher.push_back(*itTeaBeg);
            ++itTeaBeg;
            --j;
        }
        --i;
        ++itTeamBeg;
        if (0 == i  || 0 == j)
        {
            break;
        }
        avg = j/i;
    }
}
//调整答辩组的初始状态
void SetTeamInitStatus()
{
    vector<CTeam>::iterator itTeamBeg = g_TeamList.begin(),
        itTeamEnd = g_TeamList.end();
    while (itTeamEnd != itTeamBeg)
    {
        //收集需要交换的同学信息
        vector<CTeacher>::iterator itTeaBeg = itTeamBeg->m_Teacher.begin(),
            itTeaEnd = itTeamBeg->m_Teacher.end();
        while (itTeaBeg != itTeaEnd)
        {
            vector<CStudent> stu = itTeaBeg->GetStuInfo();
            vector<CStudent>::const_iterator itStuBeg = stu.begin(),
                itStuEnd = stu.end();
            while (itStuEnd != itStuBeg)
            {
                itTeamBeg->m_ExchgStu.push_back(*itStuBeg);//收集信息
                ++itStuBeg;
            }
            ++itTeaBeg;
        }
        ++itTeamBeg;
    }
}
//交换答辩组之间的同学
void Exchange()
{
    //这里可以先处理下  把各组的答辩学生均匀分配下
        //防止个别组因为导师少而学生少的情况(被平均的学生可以放到已交换的同学列中)
    //交换方法:
    //1、一次交换整个组
    //2、把需要交换的同学平均分派到其他的组中() 
}
int main(void)
{
    return 0;
}
2012-10-06 13:52
烧包谷
Rank: 2
等 级:论坛游民
威 望:2
帖 子:60
专家分:69
注 册:2010-10-11
得分:0 
回复 8楼 寒风中的细雨
看了您的注释,我明白了。非常感谢!
2012-10-06 19:00
yx123456
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-6-11
得分:0 
回复 7楼 寒风中的细雨
可以求完整代码吗?
十分感谢
2020-06-21 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-382353-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.634561 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved