票务起草算法

时间:2010-10-06 03:52:16

标签: algorithm

我正在尝试编写一个程序来自动化票证草稿。

我们有一定数量的季票通行证,并希望在一群人中分开门票。有X个游戏,Y个季票和Z个人。 Z人中的每一个都对X游戏进行了排名。

我的代码基本上是通过草稿订单,然后从可用的排名中挑选出门票,否则,选择下一个最高排名。在大多数情况下它是有效的。问题是,大多数门票都有一个点,剩下的门票是你已经拥有的门票,所以你就是不要选择它们。因此人们有不同数量的门票。有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:1)

如果你有X场比赛和Y季传球,大概有X * Y门票可以送给Z人,对吗?

这听起来像是一个优化问题,但要做到这一点,你必须确定你的主要目标?我猜你希望每个人都能收到X * Y / Z门票(均匀分开),但也许没有。我猜你也希望最大限度地提高门票的总体满意度(根据排名以某种方式定义)。如果一个人在同一场比赛中获得超过1张门票,你可能会想要对一个人的满意度给予很大的惩罚。我相信这最后一个方面可能就是为什么直接选秀方法不是最好的,但我可能会弄错。

一旦你清楚你想要优化什么(如果这确实是一个优化问题),那么你可以考虑解决问题的最佳方法。这可能是您自己定制的解决方案,或者您可以尝试现有技术(遗传算法等)。在此之前,尽管正确构建问题非常重要。

答案 1 :(得分:0)

如果没有涉及偏好,这将是一个直接的最小切割最大流量问题。 http://en.wikipedia.org/wiki/Maximum_flow_problem,如下:

创建源顶点A.从A创建Z顶点,每个人一个顶点。容量可以是无限的(或非常非常大)。创建一个接收器B,并创建X个顶点,每个游戏一个,链接到B;容量应为Y(你每场比赛有Y票)。从每个人,链接到他们排名的每个游戏,容量为1。

如果查看上面的wiki链接,大约有10种算法可以解决这个基本问题。找一个你理解的并且可以自己实现的,因为你需要稍微修改它。我并不熟悉所有这些,但我所知道的有一步“挑选边缘”或“选择一条路径”。您应该修改“如何选择边缘”逻辑以考虑游戏的优先顺序。我不确定排序应该是什么(你可能需要进行实验),但是如果你说排名最低的游戏是1,那么下一个是2,最多是X,那么得分就像是'边缘排名' - 此人已注册的游戏数量“可能有效。

答案 2 :(得分:0)

我认为这是Stable Marriage ProblemStable Roommates Problem的变体,其中有已知的解算算法。