我们大学大约有1000个免费讲座座位,大约需要2000个座位(可能500个学生要求每个座位4个)。
我正在用cakephp开发一个webapp,它让学生们做一个愿望列表,每个模块输入4个讲座,优先级从1到4。(然后进入MySQL数据库)
现在,web前端完成了,管理操作(添加讲座、添加讲师等)完成了唯一剩下的就是编写分发算法。
我该怎么做?mysql脚本看起来很有用,但是mysql在循环和构造方面不是很友好,是吗?
将数据导出到某个地方并让另一种语言处理问题是否明智?
编辑:Dnagirl请求有关算法的详细信息:
我们没有算法的业务规则。我们从另一所大学的其他人那里修改了一个现有的(非常昂贵的)应用程序,它有我们刚刚修改过的规则。
他所做的(以及我试图复制的,以节省每学期的大笔费用),是这样的:
事件(讲座、练习等)都属于一个区块(区块是指国际政治,可能有4或5个不同的事件)
学生可以申请每个区块最多4个事件,优先级为1到4。
该算法按块工作。对于每个街区,根据学生的排名将他们分成不同的小组(排名是“越高越好”正常排名从0到20)
从排名最高的一组学生中,随机挑选一个。给他一个座位,以防他选择了优先权1。如果该活动已满,请给他选择的座位,优先级为2;等,降至4。
选择下一个学生,并做同样的事情,直到每个有这个排名的学生都有一个座位然后,去下一个较低的排名,再做所有的事情。当这个块完成时,用下一个块再次执行所有操作,直到所有的块都完成为止。
我知道这个算法不是最好的解决方案,但我想我现在就克隆它,也许之后再改进逻辑/可能性。
最佳答案
你可能想要某种遗传算法:
在课堂上随机分配学生
计算一个分数(满足的愿望得高分,超额预定的讲座产生惩罚等)
做出改变(例如,将一个学生转到另一个讲座)如果分数增加,就保留,否则就拒绝。
继续迭代,直到找不到增加分数的更改:您找到了一个本地最小值
重复整个过程几次,以找到其他局部最小值。然后用最好的得分方法。
你将不得不运行一些测试和调整评分权重,以使它正确。
MySQL不太适合这种情况;最好用PHP解决这个问题,然后坚持一次如果性能不够好,您甚至可以考虑在C++中实现它,但我建议您先尝试PHP,看看它是否足够快。你不会每2秒钟就跑一次的。