【问题标题】:How to implement a seat distribution algorithm for uni lectures如何为 uni 讲座实现座位分配算法
【发布时间】:2011-01-04 11:56:19
【问题描述】:


我们大学的讲座有大约 1000 个免费座位,需要大约 2000 个座位(可能有 500 名学生每人需要 4 个名额)。
我正在使用 CakePHP 开发一个网络应用程序,它可以让学生制作愿望清单,并在每个区块输入 4 个讲座,优先级从 1 到 4。(然后进入 MySQL 数据库)

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

我应该如何最好地做到这一点?一个 MySQL 脚本似乎很有用,但是 mysql 在循环和 if 构造方面不是很友好,是吗?
将数据导出到某个地方并让另一种语言处理问题是否明智?

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

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

我知道这个算法不是最好的解决方案,但我想我现在就克隆它,然后可能会在逻辑/可能性方面进行改进。

【问题讨论】:

  • 分配席位的业务规则是什么?选择有可能发生冲突吗?没有足够的信息来提出好的解决方案。
  • 我会说使用 SQL 解决基于集合的问题似乎是合理的,但正如 dnagirl 所说,您没有提供有关要实现的分布算法的足够信息。虽然有人可能会争辩说你应该在编写前端之前决定一种算法:)
  • 我肯定会通过将数据导出到适当的编程语言并在那里完成工作来解决这个问题。
  • dnagirl:我更新了帖子,现在解释一下算法。我希望它可以理解,英语不是我的母语 :)

标签: php sql algorithm


【解决方案1】:

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

  • 在讲座中随机分布学生
  • 计算分数(实现的愿望得分高,超额预定的讲座会产生惩罚等)
  • 进行更改(例如,将一名学生转移到不同的讲座)。如果分数增加,则保留,否则拒绝。
  • 继续迭代,直到找不到可以提高分数的变化:您找到了局部最小值
  • 重复整个过程几次以找到其他局部最小值。然后选择得分最高的解决方案。

您必须运行一些测试并调整评分权重才能正确。

MySQL 并不是很适合这个;你最好用 PHP 解决这个问题,然后坚持下去。如果性能不够好,你甚至可以考虑用 C++ 实现它,但我建议你先尝试 PHP,看看它是否足够快。您不会每 2 秒运行一次。

【讨论】:

  • 使用随机分布作为起点听起来不是一个好主意……我们当然可以做得更好。
  • 随机并不是标准算法实践的最佳方式,但在遗传算法中,这为您提供了让选项以不同方式演变的最佳方式。如果你从一些固定的规则开始,你每次都会得到相同或几乎相同的结果。看看这种类型的算法,就像地球上生命的进化,以及它的所有分支、进化和随机性。
  • 哇,我惊呆了。我以前从未听说过遗传算法,而且我喜欢进化,这对我很有吸引力。然而,正如我上面解释的,我正在克隆一个商业学生管理系统。我想复制原始算法(在我的帖子中解释),然后在版本 2 上工作。我肯定会阅读更多关于这些算法的内容。万分感谢! :)
  • @Alexx Hardt:tdammers 的回答假设在不尝试所有可能的组合的情况下找到解决方案,这需要大量时间或计算能力。相反,找到一个“好的”解决方案(例如“最佳得分”)。出于同样的原因,您要克隆的应用程序可能使用遗传算法。要了解原因,请阅读 Programming Collective Intelligence (amazon.com/…) 一书,该书有一个关于该主题的精彩章节,包含代码示例和解释。
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多