编程论坛
注册
登录
编程论坛
→
数据结构与算法
求助各位大侠,关于学生毕业设计答辩分组的算法
烧包谷
发布于 2012-09-30 07:12, 599 次点击
毕业设计学生答辩分组。每一组答辩由若干老师组成的答辩教师组,将学生大致均等分配到每组去答辩。要求是:学生不能到毕设导师所在组答辩。我没有思路,求各位给我一点思路。谢谢了!
9 回复
#2
寒风中的细雨
2012-10-01 01:40
列出各个毕设导师所带的学生(a、b...)
列出各组答辩组导师所有的人数(A, B...)
确定均分学生到各答辩组去的人数[n, n+1]
统计每个学生可以被分配的答辩组 或者 统计每个答辩组可以接受的学生
进行分配(组合)
注意细节的处理
#3
烧包谷
2012-10-01 07:27
谢谢!
#4
zhu224039
2012-10-01 22:55
分治算法能帮助你
所谓分治就是问题 1分 为 2
这么一直分下去 直到分到 单个同学
然后再用合并算法,就能得到 面试组 和 同学的关系了
#5
烧包谷
2012-10-03 17:04
这个怎么用分治算法我不是很清楚!斑竹,你能不能详细一些!还有一点我对了,这些分组是要求随机的。谢谢!
#6
烧包谷
2012-10-04 19:23
回复 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个数据。举个列子吧,第一组分配的学生的毕业设计导师恰好是第二组的答辩教师,第二组分配的学生恰的毕业设计导师恰好是第一组的答辩教师,这时候第三组就不能分配到学生(假设只有三组)。
到了这里,希望你给我提供一个详细的算法。谢谢~~~!
#7
寒风中的细雨
2012-10-05 09:39
//1、同学跟着指导老师组的队伍进入相应的答辩组
//2、答辩组与组之间进行学生互换
//3、没有一个同学在原来的组中
交换学生的过程中 不能破坏原本交换好的学生状态
[
本帖最后由 寒风中的细雨 于 2012-10-5 09:41 编辑
]
#8
寒风中的细雨
2012-10-06 13:52
程序代码:
//
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
;
}
#9
烧包谷
2012-10-06 19:00
回复 8楼 寒风中的细雨
看了您的注释,我明白了。非常感谢!
#10
yx123456
2020-06-21 16:13
回复 7楼 寒风中的细雨
可以求完整代码吗?
十分感谢
1