人员分配算法
将学生分配到答辩组答辩。详细要求如下:
(1)每一组有若干教师组成;
(2)学生不能在毕设指导老师所在组答辩;
(3)各组人数大致相同;
(4)随机分配。
求大家指点。我之前的想法是:
(1)从用一个容器S_List装待分配的学生,
(2)每次通过过滤条件找出可选项Optional_List,
(3)再从可选项中随机选出Group_Count个,将这些项从S_List中删除
(4)根据组数,重复(2)、(3)。指导每组都有分配
(5)分配剩余人数
这个想法用代码实现后有问题,问题就出在算法上,这个算法不能保证每一组在任何时候都能有分配。求高手指点,越详细越好。谢谢!
[解决办法]
懒得用c#描述了,直接上SQL,看能否满足你的要求:
USE [test]go/*1.学生表中每名学生都对应一位指导教师2.该学生被分配到的答辩组不能包含该学生的指导教师*/--待分配学生表declare @S_List table (s_id varchar(10), --学生idguide_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,'') MemberFROM @Answer_Group a),c2 AS (SELECT c.*, s.s_id --s_id列为学生编号,c.GroupID为随机组,Member列为该组分配的老师FROM c_Group cJOIN @S_List s ON CHARINDEX(s.guide_id, c.Member)=0)SELECT * FROM c2--从c2视图中任意抽选s_id 为(s1,s2,s3,s4,s5)的5条数据即表示分组成功,试试看能否满足要求
[解决办法]
画个er图