首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

人员分配算法解决方法

2012-10-19 
人员分配算法将学生分配到答辩组答辩。详细要求如下:(1)每一组有若干教师组成;(2)学生不能在毕设指导老师所

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

 

[解决办法]
懒得用c#描述了,直接上SQL,看能否满足你的要求:

SQL code
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图

热点排行