我正在尝试写一个网球预订系统而且我遇到了这个问题。 假设您的球员有关于球场号码,日期和时间的首选项。 此外,如果有日/小时位置并且有多个玩家,则每个玩家都会排名 对于此插槽的首选项,应选择具有最高优先级的插槽。 我正在考虑使用一些优化算法来解决这个问题,但我不确定什么是最好的成本函数和/或算法。 有什么建议? 还有一件事我更喜欢使用Python,但也欢迎一些与语言无关的建议。 谢谢!
编辑:
一些澄清 -
优先级较高的胜负者将被转移到最近的位置, 相当灵活的时段问题 是的,最大化获得最佳时间的人数
答案 0 :(得分:3)
我会根据他们的排名对球员进行排序,因为排名靠前的球员总是会推低排名较低的球员。然后你从排名最高的球员开始,给他他要求的东西(如果他真的是最高的,他将永远赢,所以你也可以给他任何他要求的)。然后我会从第二高的那个开始。如果他要求最高级别的东西,请尝试在附近找到一个插槽并将此插槽分配给他。现在是第三高的。如果他要求最高人员已经采取的措施,请将他移到附近的一个位置。如果这个插槽已被第二个最高的插槽占用,请将他移到更远的一个插槽中。继续与所有其他球员一起。
如果多个玩家可以拥有相同的等级,您可能需要实施一些“公平”。所有具有相同等级的玩家如果对它们进行排序,则彼此之间会有随机顺序,例如使用QuickSort。你可以得到一些公平,如果你不做球员的球员,但排名等级。你从最高级别和这个级别的第一个玩家开始。处理他的第一个请求。但是,在处理他的第二个请求之前,处理具有最高等级的下一个玩家的第一个请求,然后处理具有最高等级的第三个玩家的第一个请求。算法与上面相同,但假设你有10个玩家,玩家1-4是最高等级,玩家5-7低,玩家8-10非常低,每个玩家做3个请求,你将它们处理为< / p>
Player 1 - Request 1
Player 2 - Request 1
Player 3 - Request 1
Player 4 - Request 1
Player 1 - Request 2
Player 2 - Request 2
:
这样你就有了一些公平。您也可以每次在排名班中随机选择,这也可以提供一些公平性。
你甚至可以跨职业实现公平。例如。如果你有4个等级,你可以说
Rank 1 - 50%
Rank 2 - 25%
Rank 3 - 12,5%
Rank 4 - 6,25%
(只是示例值,您可以使用不同的键,而不是总是乘以0.5,例如乘以0.8,导致数字减慢)
现在您可以说,您开始使用等级1进行处理,但是一旦满足所有等级1请求的50%,您将继续进行等级2并确保满足其25%的请求,依此类推。这样,即使是Rank 4用户也可以赢得Rank 1用户,有点击败了初始算法,但是你提供了一些公平性。即使是Rank 4球员有时也可以得到他的要求,他也不会“跑干”。否则,排名为1的玩家将与Rank 4玩家同时安排每个请求,这将确保Rank 4玩家没有机会获得单个请求。这样他至少有机会得到一个。
在确定每个人都处理了最低百分比(并且等级越高,这就越多)之后,你会回到顶部,再次从等级1开始并处理其余的请求,然后是其余的等级2请求等等。
最后但并非最不重要:您可能希望定义最大插槽偏移量。如果采用插槽,应用程序应搜索仍然空闲的最近插槽。但是,如果这个最近的插槽距离很远怎么办?如果我在星期一下午4点请求一个插槽并且应用程序发现下一个免费的时间是星期三上午9点,那对我来说真的没有用,是吗?星期三我可能没有时间。因此,您可以将插槽搜索限制在同一天,并说插槽可能最多关闭3个小时。如果在该范围内未找到任何插槽,请取消该请求。在这种情况下,您需要告知播放器“我们很抱歉,但我们找不到任何附近的插槽;请在另一个日期/时间请求插槽,我们将看看我们是否能为您找到合适的插槽”。
答案 1 :(得分:2)
我认为这是一个NP完全问题,因此对于任何大型数据集都不可能有一个非常快速的算法。
还有一个问题,你可能有一个无法制定的时间表。鉴于情况并非如此,像这种伪代码这样的东西可能是你最好的选择:
sort players by priority, highest to lowest
start with empty schedule
for player in players:
for timeslot in player.preferences():
if timeslot is free:
schedule.fillslot(timeslot, player)
break
else:
#if we get here, it means this player couldn't be accomodated at all.
#you'll have to go through the slots that were filled and move another (higher-priority) player's time slot
答案 2 :(得分:2)
您正在描述匹配问题。可能的引用是the Stony Brook algorithm repository和Algorithm Design by Kleinberg and Tardos。如果玩家数量等于法院数量,则可以达到稳定匹配 - The Stable Marriage Problem。其他配方变得更难。
答案 3 :(得分:1)
在回答这个问题之前,我会问几个问题:
顺便说一句,你可以通过将时间重写为整数索引来使它稍微复杂一些(所以你要处理的是整数而不是时间)。
答案 4 :(得分:1)
我建议使用评分算法。基本上构造一个公式,将您描述的所有值拉入一个数字。谁有最高的最终得分赢得那个位置。例如,一个简单的公式可能是:
FinalScore = ( PlayerRanking * N1 ) + ( PlayerPreference * N2 )
其中N1,N2是控制公式的权重。
这将使您能够非常快速地获得良好(非完美)的结果。我们在一个更复杂的系统上使用这种方法,效果非常好。
您可以通过添加玩家赢得或丢失插槽的次数,或者(根据某人的建议)玩家支付的金额来添加更多种类。
此外,您可以使用多个传递来分配当天的广告位。使用一种按时间顺序排列的策略,一种是按时间顺序排列,一种是先做早晨,另一种先做下午,等等。然后将获得这些点的玩家的得分相加,然后你可以决定策略提供最好的结果
答案 5 :(得分:0)
基本上,你有优势,球员有优先权;因此,您按降序优先级对玩家进行排序,然后开始为他们分配插槽。第一个获得他们的首选插槽,然后下一个获得他自己喜欢的免费插槽,依此类推。这是一个O(N)算法。
答案 6 :(得分:0)
我认为你应该使用遗传算法,因为:
解决方案的质量取决于您打算花多少时间来解决该计划..
答案 7 :(得分:-2)
货币。根据谁付出最多来分配时段。在抽签的情况下,不要让任何人有插槽。