如何实现单一讲座的座位分配算法

时间:2011-01-04 11:56:19

标签: php sql algorithm


我们在大学的讲座上有大约1000个免费座位,需要大约2000个座位(可能500名学生要求各4个席位)。
我正在使用CakePHP开发一个webapp,它允许学生制作一个愿望清单并在每个块中输入4个讲座,优先级从1到4.(然后进入MySQL数据库)

现在,Web前端已完成,管理操作(添加讲座,添加讲师等)已完成..唯一剩下的就是编写分发算法。

我该如何做到最好? MySQL脚本似乎很有用,但是当涉及到循环和if-constructs时,mysql不是很友好,是吗? 将数据导出到某处并让其他语言处理问题是否明智?

编辑:dnagirl请求有关该算法的更多信息: 我们没有该算法的业务规则。我们从另一所大学的其他人那里调整了一个现有的(非常昂贵的)应用程序,该应用程序有我们刚刚适应的规则 他正在做什么(以及我想要克隆的,以节省每学期的大笔费用),是这样的:

  • 活动(讲座,练习等)都属于一个区块(区块是例如国际政治,可能有4或5个不同的事件)
  • 学生每个街区最多可申请4个活动,优先级为1至4.
  • 算法适用于每个块。对于每个区块,根据排名将学生分成不同的组。 (排名是“越高越好”。正常排名从0到20)
  • 从排名最高的学生组中,随机挑选一名。在他选择优先级为1的比赛中给他一个席位。如果这个赛事已满,给他选择优先级为2的席位;等,低至4.
  • 选择下一位学生,并做同样的事,直到每个具有此排名的学生都有一个席位。然后,转到下一个较低的排名,再做一切。完成此块后,使用下一个块再次执行所有操作,直到完成所有块。

我知道这个算法不是最好的解决方案,但我认为我现在只是克隆它,之后可能会改进逻辑/可能性。

1 个答案:

答案 0 :(得分:4)

你可能想要某种遗传算法:

  • 通过讲座创建学生的随机分布
  • 计算分数(满足的愿望得分高,超额预定的讲座产生罚款等)
  • 进行更改(例如,将一名学生转到另一个讲座)。如果分数增加,请保留,否则拒绝。
  • 继续迭代,直到找不到可以提高分数的变化:你找到了当地的最低要求
  • 重复整个过程几次以找到其他局部最小值。然后选择得分最好的解决方案。

你必须进行一些测试并调整得分权重才能做到正确。

MySQL并不是非常适合这种情况;你最好用PHP解决这个问题,然后坚持一下。如果性能不够好,您甚至可以考虑在C ++中实现它,但我建议您首先尝试PHP并查看它是否足够快。这不像你每2秒钟就要运行一次。