找出是谁来买羊角面包


9

一个团队决定每天早上有人应给每个人带羊角面包。每次都不应该是同一个人,因此应该有一个系统来确定下一个轮到谁。这个问题的目的是确定一种算法,以确定明天将把羊角面包带给谁。

约束,假设和目标:

  • 谁来带羊角面包,将在前一天下午确定。
  • 在任何一天,都会有人不在。该算法必须选择当天要出席的人。假设所有缺勤都是提前一天知道的,因此可以在前一个下午确定新月形面包的购买者。
  • 总体而言,大多数人都在大多数时间都在场。
  • 为了公平起见,每个人都应该购买羊角面包,其次数应与其他人一样多。(基本上,假设每个团队成员都有相同的钱用于羊角面包。)
  • 为了减轻花名册的无聊感,最好具有一些随机性或至少感知到的随机性。这不是一个硬性约束:它更多是一种审美判断。但是,同一个人不应连续两次被选中。
  • 带羊角面包的人应该事先知道。因此,如果人P在D日带上羊角面包,那么应该在人P所在的前一天确定这一事实。例如,如果总是在前一天确定了羊角面包的携带者,那么应该是前一天在场的人之一。
  • 团队成员的数量足够少,以至于存储和计算资源实际上是无限的。例如,该算法可以依靠过去曾带谁羊角面包的完整历史记录。每天在快速PC上进行几分钟的计算就可以了。

这是一个现实问题的模型,因此,如果您认为这些假设可以更好地模拟场景,则可以自由地挑战或完善这些假设。

产地:找出谁去购买羊角弗洛里安Margaine。我在这里的重新表述有稍微不同的要求。


1
到底是什么问题?我们是否可以假设人们缺多少钱?将执行此操作次数最少的人(或仅仅是随机的人)带到哪里有什么问题?
2013年

@PålGD假设人们缺席的人数大致相同,将是一种简化。如果您愿意,可以这样做,但是如果您的算法适用于兼职,那就更好了。使执行此操作次数最少的人是一种解决方案(尽管请记住他们必须提前一天知道的要求,但这确实使解决方案并非完全无关紧要)。随机的人也可以工作,但是随机性会导致偏离您可能想要约束的公平性。
吉尔(Gilles)'所以

什么?没有可喜的景象?您希望我们奴隶在办公桌旁做数学而不是溜到面包店吗?
Caleb

@Gilles-仅供参考,请使用您对此问题的版本在P.SE上进行实验。既然两个站点都比较老了,我很想知道每个社区的答案是如何形成的。

Answers:


7

我知道这类问题有两种解决方案:有偏见的彩票过滤/生成的随机序列

首先,让我们省去简单但错误的解决方案,使其保持无状态。任何不维护状态的彩票式解决方案都将具有二项式分布的获胜数,这将使“多次”准则不成立。您可以选择一个随机序列来平等地挑选所有人(只需遍历列表即可;排列提供随机性),但是一旦人们开始休假,您的序列就会出现漏洞。除非您保持跟踪,否则您将再次发现自己拥有二项式分布而不是保持同等的努力。

我们还要致力于具有实际的随机性。您可能希望这样做,例如,一个人无法根据确定性算法安排假期,以至于轮到他们买羊角面包时他们就永远不在(我想直到他们用完所有假期) 。

因此,针对两种类型的解决方案。

  1. 要构建有偏见的彩票,首先要注意的是,我们可以从几乎任何连续分布(具有有限偏差)中进行挑选,以生成彩票的数字。失败者可以是人数最少的人。那么,最简​​单的偏见是跟踪每个人购买的股票是否多于其股票。您可以以牛角包为单位来衡量偏差。您可以通过更改分布的宽度和形状来调整随机程度-这还将确定任何人与“相同次数”之间的距离。高斯人很容易。它们允许合理的惊喜,而不会有太长的尾巴(“不公平”)。因此,解决方案的基本形状是(在Scala代码中)

    case class Employee(var bias: Double) {
      def eat         { bias -= 1 }
      def buy(n: Int) { bias += n }
      def roll        = bias + stdev * Random.nextGaussian
    }
    

    您可以跟踪谁买了最后一个,并给他们提供了巨大的偏见奖金(例如10*stdev),以防止人们连续两次购买,除非情况特殊,因为假期结构允许每个人都购买了“最后一次”的时间。(即,您买了,然后去度假。)同一件事在他们被选中的那一天就不在场。(如果每隔一天缺席某人,他们最终在耗尽其偏见奖金时出现;我认为这是一个功能,而不是错误。)

    因此,您收集当天的现有雇员列表,让他们全都参加抽签,选择最低的并更新。您可以选择是否使购买奖金等于员工人数(成本可以忽略不计,但是羊角面包的出行很麻烦),出席的员工人数(如果行程很容易但是成本很负担,则不错) ),或介于两者之间的东西(以确认这两种负担)。最好只对在场的人处以“吃”的罚款,但是如果您觉得只是在度假中并不能给您带来适当的收益,则可以采用任何一种方式。

  2. 要构建过滤后的随机序列,首先需要生成一个随机序列。改组员工名单是任何一个开始的好方法。只需每天依次浏览列表即可。如果某人因缺席或之前没有被告知或购买而无法购买,请跳过他们。现在您有一个问题:您正在积累被跳过的人。没关系,但是。当您到达序列的末尾时,在改组之前将跳过的雇员列表附加到完整列表中。现在,出现的可能性与您被跳过的次数成正比,从而保持了“相同次数”属性。

    如果您使用标准混洗,那么在没有休假时量化随机性也特别容易。如果您完全随机地挑选人员,那么如果有名员工,那么关于接下来要带谁的知识将包含位信息。但是,只有而不是可能的序列,因此信息减少位(对于大;对于它是)。N N N N log 2 [ N log2(N)NN!NNÑÑ=101.14log2[(N!NN)1/N]1log(2)+log22π/NN1.4NN=10 1.14

我个人更喜欢有偏见的彩票解决方案,因为对随机性的控制会更好。使用过滤后的序列,您可以想出更复杂的方法来生成序列。例如,与其进行随机排列,不如将本地交换执行到一定距离,或者完全将人员交换出池(但是他们进入了跳过列表),但是这些事情需要更多的算法工作。使用彩票,您只需调整标准差即可。


4

令为新月形面包的顾客的集合。令为直到第天在新月形面包上花费的金额(这可以是他购买新月形面包的次数,如果他们总是花相同的钱,而无论出席人数是多少,为我们的羊角面包爱好者看起来足够聪明);的是用于初始化和避免除以。v i k1 P i k 1 0{P1,...,Pn}vik1Pik10

对于某些参数,令。v k = n i = 1v i k llvk=i=1n(vik)l

在第天,他们通过触发概率为结果为的随机变量,选择第二天的羊角面包的买家。如果所选的硬币不在这里(今天或第二天),他们会再次抛硬币直到找到合适的硬币(他确实存在,因为他们每天都在这里……)。i 1 v k ilki1(vik)lvk

他们过着幸福的生活,直到发现那个胆小鬼在那儿,只有一天超过两天,所以再也没有买到新月形面包了!P1

经过一番思考(可能会对施加一点折磨,以便他不付钱就退还他吃的羊角面包),他们修改了自己的算法。P1

他们计算出他们每天支付的新月形面包的平均价格,并将其称为。v

在第一天,他们计算出未来几天的买家计划。为此,他们像以前一样使用随机变量进行操作,并通过在第天应该支付的价格更新,即,每次计划去面包店时,都添加。因为他们很聪明并且不想支付太多,所以他们还记得他们在第天实际支付了多少,以便在他们更新计划时不会受到任何惩罚。 k v kvikkvk

他们计划,直到每个都有一个将来应该购买羊角面包的日期。Pi

如果计划在第天购买新月形面包,但宣布他不能在天(或者如果他没有被温暖),则将他的位置交给第二天没有义务的人,例如,下一轮。 k + 1 k P j P jPik+1kPjPj

将来不计划购买第一只的那天,他们会延长计划(将用计算的随机变量更新为已支付的实际金额和计划的金额),直到每个人都回来在线上。v ķ Pivik

当这种情况永远消失时,他们过着幸福的生活,平均分担了羊角面包的价格。

但是不满意。实际上,他认为所选的太小,因此连续两次支付的概率太大。随便...其他人让他选择想要的大。因为他脾气暴躁但又不笨,所以即使随着时间的流逝,即使倾向于不看大支付者和小参与者的比例,他也选择,因为大倾向于强调这一点。 l l l = k lP1lll=kl

仍然并不那么快乐,他只有一半的时间(一半的牛角面包)在那里,而且每天必须支付这里的钱。不公平!P 2P1P2

但是因为他们厌倦了脾气暴躁的,所以他们将其赶走了。但在他们头上的角落,他们还是想改变的之间他们支付,他们吃什么(标准化,以获得正确的价值观),但他们也懒得和太满羊角面包的差异。v ķ P1vik

附言:对不起,英语不好,但我不是母语人士,而且已经很晚了……请随时纠正错误(并且可能会在故事中添加一些香料……)


2

每次迭代

  • 在场并可以购买的人员列表
  • 前任买家

如果您从列表中的人中随机选择一个人并排除了先前的买家,那么您可以实现目标:

  1. 该算法是“最大”随机的,因为我们使用来自上一次迭代的最少信息量并随机选择。
  2. 平均而言,人们每次参加提取都需要支付(N /(N-1))个新月形面包,从而使算法尽可能公平。
  3. 我建议消除不重复规则,以使其最大程度地随机。

我见过的其他算法不太随机或不太公平:

  1. “套牌洗牌”算法并不是真正随机的,因为必须支付的概率不是恒定的(第一个选择为1 / N,第二个选择为1 /(N-1)...第N个选择为1- -如果尚未选择)。此外,如果您首先被选中,那么接下来的N次被选中的机会就是零。该系统很容易被破坏,只需很少进入,然后不断进来即可。

  2. 试图主动使每个人都得到相同数量的新月形面包而不是依靠随机数的属性的“补偿”算法不能是随机的或公平的(或两者皆有)。


NmN/m1

N

@RexKerr为什么您要买的羊角面包比员工多?
Sklivvz 2013年

我糊涂了。我在哪里建议一个人?
Rex Kerr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.