问题描述
各位大神,请教一个算法的设计问题,还请各位大神帮忙!问题描述:在excel表中有学生的考试成绩,如班级、姓名、性别、是否住宿、语文、数学、英语、总分。(共1000人)。现在需要把这个电算表的学生分成15个班,要求各班平均分接近,总人数均衡、性别、男女住宿及住宿总数均衡。如果能各科平均分均衡就更好了。之前的算法比较简单,按照总分降序,然后按S形排列如1,2,3,4,5,5,4,3,2,1,这样的形式分班。先分男生住宿再分女生住宿,在分男生在分女生。这样能够做到基本均衡。但是会使各班各科的平均分差距较大,请教大家:1、如何设计一个算法,实现学生的分班呢?2、如果按照总分的S形分班,会造成各班男女生比例失衡,如何实现学生的调班呢。比如1班男生多,需要到3班(他们男生少),然后对应调换回来一个与1班这个男同学分数接近的男生,这样的算法如何实现。3、如果按照各科都进行一次S形分班,就会得到每个学生可能去的班级,如A同学语文分应该去2班、数学分应该去3班、英语分应该去2班,那么这个学生就去2班,请问这样的算法是否具有可行性?多谢!
解决方案
解决方案二:
我是这么想的,首先先分为男住宿池,女神住宿池,男归宅池和女神归宅池,每个池都按分数高低排好序,假设要分为4个班。首先从男住宿池里拿出分数最高者放入班A,次高者放入班B,班C和D也依次放入第三第四名,接着从女神住宿池里拿到成绩最高的女神放入分数最低的班D,次高者放入班级C,后面以此类推。放入一对狗男女以后,对班级ABCD按当前平均分重新排一次序,排序后再按之前规则再放入一对狗男女,重复上述操作直到男女住宿池中的一个用完,然后开始从归宅池里抓。
解决方案三:
引用1楼xdashewan的回复:
我是这么想的,首先先分为男住宿池,女神住宿池,男归宅池和女神归宅池,每个池都按分数高低排好序,假设要分为4个班。首先从男住宿池里拿出分数最高者放入班A,次高者放入班B,班C和D也依次放入第三第四名,接着从女神住宿池里拿到成绩最高的女神放入分数最低的班D,次高者放入班级C,后面以此类推。放入一对狗男女以后,对班级ABCD按当前平均分重新排一次序,排序后再按之前规则再放入一对狗男女,重复上述操作直到男女住宿池中的一个用完,然后开始从归宅池里抓。
解决方案四:
这种分配的结果可能导致如果分四个班,某个班级前十名人数会比其他班级多2-3个而且前两名可能会被分到一个班级
解决方案五:
引用3楼itcaicai的回复:
这种分配的结果可能导致如果分四个班,某个班级前十名人数会比其他班级多2-3个而且前两名可能会被分到一个班级
得到前两名的班级必然也会得到两个极差生,你要保证的是平均分,又不是按排名来分,你实在不想前2在一起,你先把前2分了,再去套这套逻辑不就好了
解决方案六:
引用4楼xdashewan的回复:
Quote: 引用3楼itcaicai的回复:
这种分配的结果可能导致如果分四个班,某个班级前十名人数会比其他班级多2-3个而且前两名可能会被分到一个班级得到前两名的班级必然也会得到两个极差生,你要保证的是平均分,又不是按排名来分,你实在不想前2在一起,你先把前2分了,再去套这套逻辑不就好了
这样可以均衡总平均,如果想要各科也基本平衡应该如何处理?
解决方案七:
引用5楼itcaicai的回复:
这样可以均衡总平均,如果想要各科也基本平衡应该如何处理?
各科稍许有些麻烦,首先你按上述分完班,然后求出每个班级的各科平均分,自己定一个基准线,比如允许的波动值在上下5分,那么先找到大于这5分科目的班级,找到该科中最低或者比较低(是否取最低又关系到排位,你自己衡量)的人。再找到该科目小于或者最接近小于5分的班级,按照分数低于平均线,性别相同,住宿条件相同,其他科目成绩也最接近于平均线的那人,和之前找出人做班级交换。重新计算各科成绩,重复上述操作,直到所有班级所有科目都入允许的波动值内。
解决方案八:
引用6楼xdashewan的回复:
Quote: 引用5楼itcaicai的回复:
这样可以均衡总平均,如果想要各科也基本平衡应该如何处理?各科稍许有些麻烦,首先你按上述分完班,然后求出每个班级的各科平均分,自己定一个基准线,比如允许的波动值在上下5分,那么先找到大于这5分科目的班级,找到该科中最低或者比较低(是否取最低又关系到排位,你自己衡量)的人。再找到该科目小于或者最接近小于5分的班级,按照分数低于平均线,性别相同,住宿条件相同,其他科目成绩也最接近于平均线的那人,和之前找出人做班级交换。重新计算各科成绩,重复上述操作,直到所有班级所有科目都入允许的波动值内。
对,我也有同样的想法,先分班,然后再根据一定条件调换就行了。实在不行先保存一个快照,然后随机调换两人,再计算总平均值、各科平均等,两班差值如果比原来的小,就保留,否则就还原原始的快照,重新再随机调换两人;然后添加个计数器,按这个方式循环几千次就停止。
解决方案九:
http://club.excelhome.net/thread-1034379-2-1.html