【问题标题】:Household chores scheduling algorithm家务调度算法
【发布时间】:2012-07-11 08:31:50
【问题描述】:

背景故事

所以事情就是这样。我住在三口之家,我们中的老大已经厌倦了一个人做所有的家务。我们尝试为任务制定不同的时间表,但总是会出现问题,因为我们中的一个人不在家,家务活没有做完,或者有人觉得他们比其他人做的工作多,导致怨恨和不情愿完成一项家务。

问题

人类会犯错,但计算机程序是万无一失的,对吧?这个想法是,可以使用计算机程序公平地分配要完成的家务,这样没有人会觉得他或她正在做更多的工作。我正在尝试提出一种算法来分配符合这些标准的家务:

  • 从长远来看,它应该以大约 1/3 的概率平均分配家务。
  • 它应该返回一个有序的人员列表,所以如果第一个不可用,第二个可以完成它。
  • 应避免在同一天为每个人安排多项家务。
  • 应避免将同一家务事连续多次安排给同一个人。
  • 它应该是容错的。如果安排的人没有做家务,只要反馈实际做家务的人,它应该仍然是公平的。
  • 它应该适用于不同频率的不同家务(您需要每天洗碗,但每周只打扫一次浴室,...)

我的问题是:实现此算法的最佳/最酷/最公平的方法是什么? (非常可笑的过于复杂的解决方案受到赞赏:D)


我尝试了什么?

我认为实现这种算法的一种简单方法是为不同的标准定义一个成本表,然后只使用加权随机数来选择这个人,但我认为这从长远来看是不公平的(真的必须限制在每人 1/3,否则将不被接受:))。

【问题讨论】:

  • 这是你学习 Prolog 的机会 :)

标签: algorithm language-agnostic scheduling


【解决方案1】:

您的问题由两部分组成:

1) 定义评分函数。您如何定义公平、高效……?他们之间的取舍是什么?有different techniques做取舍:

  • 得分权重,例如:1 次(分布不均)== 5 次(一天的多项家务活)
  • 分数水平,例如:(分布不均)总是高于(一天中的多项家务活)
  • 帕累托评分:参见维基百科

2) 使用优化算法找到得分最高的时间表(在所有可能的时间表中)。如果您的问题是 NP 完全的,那么就没有这样完美的算法。但也有非常好的。我更喜欢从 First Fit Decreasing 开始,然后是 Tabu Search

如需完整、详细地了解包含实现代码的类似示例,请关注this tutorial。将单词Computer替换为Person,将Process替换为Chore

【讨论】:

    【解决方案2】:

    一般来说,您的约束似乎足够宽松,并且您的算法不需要扩展太多,因此您应该能够制定一个算法来强制计划满足您的所有条件,并且有很多不同的方法来实现它。以下是一些可能有助于您入门的随机沉思。

    假设我有一个要分配给给定日期的家务列表(但这应该适用于任何时间段)。每项家务都有一个重量(人们认为它有多艰巨或需要多长时间或某事)。每个家务都有一个名称或者是某个类的一个实例(这样我们就可以知道两次浴室清洁是同一个家务,我们不太可能将它分配给同一个人两次)。我还有一份人们过去做过的所有家务的清单(包括实际做这些家务的人,而不仅仅是分配给谁)。

    如果您想以 1/3 的概率分配 家务,一个简单的方法是这样说:

    while has_more_chores()
      randomize the order of the persons list
      foreach person:
        if (has_more_chores()):
          person.assign_chore()
    

    这基本上保证了每个人都完成了与其他人一样多的家务。但是,这不会考虑重量。如果重量很重要,那么这样做可能更有意义

    foreach chore:
      chore.choose_person()
    

    无论您是在做 person.assign_chore() 还是 chore.choose_person(),您都需要应用某种平衡功能,这样一个人就不会一直打扫浴室。您可以使用修改后的指数退避来减少在完成一堆杂务后获得杂务的可能性。

    也许解决问题的一种更简单的方法是随机生成无数不同的人事时间表,并取消任何不符合您的限制条件的人的资格(即,一个人连续多次做同样的家务活或一个人做一天做多项家务)。

    【讨论】:

      【解决方案3】:

      您可以尝试某种“有趣的货币”经济,将价格和工资以信用或奢侈品消费,而不是真实货币,以期出现一个有效的市场并提供最佳解决方案。

      如果您真的想要一些复杂的东西,请考虑Clarke Pivot rule in a Vickrey-Clarke-Groves auction。在这里做或不做家务,或一批家务,是一个可能的结果。您应该会发现,组织拍卖的银行赚取了微薄的利润,当积累了足够的利润时,它可以作为节日重新分配给所有人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 2015-06-03
        • 2011-04-16
        相关资源
        最近更新 更多