高分寻求一个分班的算法

hahahoo 2006-10-18 09:34:11
若干个学生进行入学考后,获得语文、数学、英语三门课的分数,要求按照分数平均将这些学生分班(如4个班),分班后要求4个班的总分平均分、各单科的平均分基本相等。
研究了半天,也没有想出一个简单有效的算法。
请各位帮忙出出主意。
...全文
1156 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
aafshzj 2006-10-21
  • 打赏
  • 举报
回复
其实基本策略及优化办法都讲过了。
一个最简单的优化就是:(为了提高随机性,你可以把4个班分配一次看成一轮,每一轮开始的班级可以随机产生,滚动进行)。

实际上你可以第一次轮动开始的位置随机产生,以后每一轮开始的位置依次滚动推移。

另外,你不需要将前面百分之多少按固定顺序排,不需要的,都按算法去派就可以了。算法排序不回比固定前面多少位效果差,在非极端情况下,二者结果是一样的,在极端情况下,固定顺序分配反而会有问题。

另外一个优化就是前面提到的差值排序加权办法,稍微复杂点,但通过分别动态分配给多个目标以一个与其离散程度有关的动态权值,能在分配过程中较优地快速收聚各班级的各科平均分。如果需要你也可以采用。但是一般不需要这么复杂了。

我上面提到的基本算法加顺序轮动分配优化,本身已经比实际情况中的分班要细致多了。
hahahoo 2006-10-21
  • 打赏
  • 举报
回复
看来没有更好的办法了,本来还想谁弄个什么遗传算法之类的(那东西看不懂),明天晚上前没有什么新的想法的话,就结帖了
gangzichh 2006-10-20
  • 打赏
  • 举报
回复
要向hahahoo()学习C#啊 哈哈
gangzichh 2006-10-20
  • 打赏
  • 举报
回复
还是觉得这个不错啊 看的也明白些
jayskycai()
思路:
1:按总分从低到高把学生进行排序
2:按照1,2,3,4
8,7,6,5
9,10,11,12
16,15,14,13
..........
进行分配。
基本会平衡,且简单可行。

hahahoo 2006-10-19
  • 打赏
  • 举报
回复
因此我现在考虑将各科分数转换成标准分,然后在已标准分的总分进行排序
li01bin 2006-10-19
  • 打赏
  • 举报
回复
上面我给出的算法是精确的,因为我们打所有的可能都知道了,当然精确了。但haha担心的速度问题是肯定存在的,随着人数和班级的增加,可能连计算机算几千年也算不出来,那么说算法没有意义吗?当然不是,地跪和跌代是有本质差别的,地跪是我们要知道最后算出来的值才可以知道结果,而跌代事每一次算出得值可以作为下次值的查考或修正,其实上面的算法只要加上几个条件就可以了。每一次运算不用算完,只要算几个数就知道这次的分法是不是比上次好,不行直接退出就可以了。
还有其实当人数大到一定程度的时候,最好的方法就是没有方法,闭上眼睛随机分就可以了,我们用计算机模拟过,结果很有现实意义。
概率上看,分数分配符合正态分布,也就是说80%的分数会在一个相对比较集中的区域,你可以画一个曲线图,可以看出所有学生的分数都在平均线上下浮动,你可用比较粗的毛笔延平均线画,用毛笔抹掉的学生是可以不参加计算的。这样10000名学生,估计也就剩下2000名了。
如果是100学生按三门功课分2班,从线性袋鼠看,就是解一个矩阵方程组,求使俩个50*4的矩阵和减平均矩阵的向量长度最短的解。我还没用matlab算过,以后又时间可以看看,估计也快不到哪里,应为本质还是我最开始说的一样,不过作为矩阵计算可能会有些巧妙的方法,maybe。
当然,还可以用计算机模拟,每个班一个班主任,让他们随机轮流选择学生,当然是选者分数最高的那个了,不过没关系,there is banlance we can not see but we can feel it。最后看看结果,或许你会大吃一惊。从概率上看当人数越多,越符合实际情况,人数不多那最好,直接跌归去好了。
sunjay117 2006-10-18
  • 打赏
  • 举报
回复
看看模式设计的一个swimmer里面的算法是不是跟楼主的差不多
vosov 2006-10-18
  • 打赏
  • 举报
回复
呵呵,同意jayskycai()
jayskycai 2006-10-18
  • 打赏
  • 举报
回复
思路:
1:按总分从低到高把学生进行排序
2:按照1,2,3,4
8,7,6,5
9,10,11,12
16,15,14,13
..........
进行分配。
基本会平衡,且简单可行。
早起晚睡 2006-10-18
  • 打赏
  • 举报
回复
那就用数据库分吧
hahahoo 2006-10-18
  • 打赏
  • 举报
回复
惭愧,不是好老师。
现在老师的收益都和绩效挂钩。谁也不愿意带差生班级,所以分班要做到尽量公平,手工做真是一个大工程。
liangxf0022 2006-10-18
  • 打赏
  • 举报
回复
顶,这个数学上叫多个目标的最优化算法。上网查查,对你有帮助
Qim 2006-10-18
  • 打赏
  • 举报
回复
估计楼主真是个好老师。
hahahoo 2006-10-18
  • 打赏
  • 举报
回复
试试看再说
fd7893 2006-10-18
  • 打赏
  • 举报
回复
不要以偏盖全,偏科毕竟是少数,首先要以总平均分作为分班的依据,粗略的分出4个班级,这是第一遍。(偏差肯定是少量的)

后面几遍,再根据单科成绩调整各个班级的个别人!

要学会简化问题,把问题拆开来就简单的多了。

第一遍分班和后面几遍的算法是不同的,等你完成第一遍分班,再考虑后面的算法!!
aafshzj 2006-10-18
  • 打赏
  • 举报
回复
关键在于偏科的学生不一定都偏同一科啊,总体可能还是随机的。

另外,如果你认为偏科严重影响结果就用我说的几种优化算法。
wuhuiITren 2006-10-18
  • 打赏
  • 举报
回复
ding
hahahoo 2006-10-18
  • 打赏
  • 举报
回复
问题有些学生会偏科,这样总分低,但是单科高。
光考虑总的涨落会掩盖掉的。
大家再出出主意吧,分大大的有,不够再加,给个千把分的也没有问题。;-)
aafshzj 2006-10-18
  • 打赏
  • 举报
回复
着了-〉这里
aafshzj 2006-10-18
  • 打赏
  • 举报
回复
你的理解有一点和我说的不大一样:
2.拿该学生的分数与算出来的每个班级的各科平均分计算差值

我的意思是:将各班各科平均分再求总的各科平均分,然后计算各班各科平均分,哪一个总体和总的各科平均分差值(低于)最大,低的最多的获得下一个学生。

着了你如果要优化也是可以的,即对差值进行加权,如差值最大的一颗给10倍权,差值次大的给5倍权等,然后对所有未分配学生的分数也从新进行加权计算,找出最大的那个。这样效果应该还要好点,但是更复杂。你可以先试试我的第一种,如果基本够用就不要搞这么复杂了,如果不够用可以考虑这种差值加权方法。
加载更多回复(21)

110,533

社区成员

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

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

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