人员分配算法

hhhvs 2012-10-04 11:47:39
将学生分配到答辩组答辩。详细要求如下:
(1)每一组有若干教师组成;
(2)学生不能在毕设指导老师所在组答辩;
(3)各组人数大致相同;
(4)随机分配。
求大家指点。我之前的想法是:
(1)从用一个容器S_List装待分配的学生,
(2)每次通过过滤条件找出可选项Optional_List,
(3)再从可选项中随机选出Group_Count个,将这些项从S_List中删除
(4)根据组数,重复(2)、(3)。指导每组都有分配
(5)分配剩余人数
这个想法用代码实现后有问题,问题就出在算法上,这个算法不能保证每一组在任何时候都能有分配。求高手指点,越详细越好。谢谢!

...全文
462 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhvs 2012-10-06
  • 打赏
  • 举报
回复
谢谢大家的帮组,问题已经解决了!
hhhvs 2012-10-04
  • 打赏
  • 举报
回复
现在的就是在对学生进行答辩分配,将学生随机分配到答辩组,要求是学生不能再毕设指导老师所在组答辩,随机分配,大致均匀
hhhvs 2012-10-04
  • 打赏
  • 举报
回复
直接给表结构
Student_Info(S_ID,S_Name,S_Gender,S_Class)学生信息表。(学号,姓名,性别,专业班级)
Teacher_Info(T_ID,T_Name,T_Post)教师信息表。(教师编号,姓名,职称)
GraduationDesign(ID,S_ID,T_ID)毕业设计导师分配表(ID,学号,教师编号)
TeacherDefenseGroup(ID,T_ID,G_Num)教师答辩分组表(ID,教师编号,组号)
TeacherDefenseGroup(ID,S_ID,G_Num)学生答辩分组表(ID,学号,组号)
li2422121715 2012-10-04
  • 打赏
  • 举报
回复
画个er图
hhhvs 2012-10-04
  • 打赏
  • 举报
回复
哦,对了。教师已经分好组了!!!!!
hhhvs 2012-10-04
  • 打赏
  • 举报
回复
我的sql水平有限,给我算法吧,大致描述思路,谢谢了!
kensouterry1 2012-10-04
  • 打赏
  • 举报
回复
懒得用c#描述了,直接上SQL,看能否满足你的要求:


USE [test]
go

/*
1.学生表中每名学生都对应一位指导教师
2.该学生被分配到的答辩组不能包含该学生的指导教师
*/
--待分配学生表
declare @S_List table
(
s_id varchar(10), --学生id
guide_id varchar(10) --指导老师id
)
INSERT INTO @S_List --存在5个学生进行答辩
select 's1','g1'
union
select 's2','g2'
union
select 's3','g3'
union
select 's4','g4'
union
select 's5','g5'

--待分配教师表
declare @T_List table
(
teacher_id varchar(10)
);
INSERT INTO @T_List
select 'g1'
union
select 'g2'
union
select 'g3'
union
select 'g4'
union
select 'g5'
union
select 'g6'
union
select 'g7'
union
select 'g8'
union
select 'g9'
union
select 'g10'

declare @Answer_Group table
(
group_id varchar(10),
teacher_id varchar(10)
)

DECLARE @Group_Member int = 2; --每个答辩组老师人数
DECLARE @Group_Sum int = (SELECT COUNT(teacher_id) FROM @T_List) / @Group_Member --答辩总组数

WHILE(1=1)
BEGIN

DECLARE @Max_Group_Number int = (SELECT MAX(CAST(group_id AS int)) FROM @Answer_Group)

IF (@Max_Group_Number = @Group_Sum) --组编号等于总答辩组数时退出
BREAK;
IF @Max_Group_Number IS NULL
SET @Max_Group_Number= ISNULL(@Max_Group_Number, 1) --组数为空时的处理
ELSE
SET @Max_Group_Number=@Max_Group_Number+1; --将组数自增

--随机抽选2名老师分配到答辩组中
INSERT INTO @Answer_Group
SELECT TOP(@Group_Member) @Max_Group_Number, t.teacher_id
FROM
( SELECT teacher_id FROM @T_List
EXCEPT SELECT teacher_id FROM @Answer_Group) t
ORDER BY NEWID()
END

;WITH c_Group AS
(
SELECT DISTINCT group_id,
STUFF((SELECT ';'+LTRIM(teacher_id)
FROM @Answer_Group tempC
WHERE group_id= a.group_id
FOR XML PATH('')),1,1,'') Member
FROM @Answer_Group a
)
,c2 AS
(
SELECT c.*, s.s_id --s_id列为学生编号,c.GroupID为随机组,Member列为该组分配的老师
FROM c_Group c
JOIN @S_List s ON CHARINDEX(s.guide_id, c.Member)=0
)
SELECT * FROM c2

--从c2视图中任意抽选s_id 为(s1,s2,s3,s4,s5)的5条数据即表示分组成功,试试看能否满足要求



110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧