家务杂事调度算法

时间:2012-07-11 16:46:40

标签: algorithm language-agnostic scheduling

背景故事

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

问题

人类错误,但计算机程序是绝对可靠的,对吧?这个想法是,计算机程序可以用来公平地分配要做的家务,这样就没有人能够感觉到他或她正在做更多的工作。我正在尝试提出一种能够分发符合这些标准的杂务的算法:

  • 应该长期均匀地分配家务,概率大约是1/3。
  • 它应该返回一个有序的人员列表,所以如果第一个人不可用,那么第二个人就可以完成它。
  • 应该避免在同一天为每个人安排多个家务。
  • 应该避免连续多次为同一个人安排相同的杂项。
  • 它应该是容忍偏差的。如果预定的人没有完成家务活,那么只要真正做过家务的人被反馈,它仍应保持公平。
  • 它应该适用于不同频率的不同家务(你需要每天做菜,但每周只清洁卫生间一次,......)

我的问题是:实施此算法的最佳/最酷/最公平的方法是什么? (可笑的过度设想解决方案:D)


我尝试了什么?

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

3 个答案:

答案 0 :(得分:1)

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

假设我有一个要为特定日期分配的杂项列表(但这应该适用于任何时间段)。每个家务活都有一个重量(人们认为它是多么艰难,或需要多长时间)。每个家务都有一个名字或者是某个班级的一个实例(这样我们就可以知道两个卫生间的清洁工作是相同的,我们不太可能将它分配给同一个人两次)。我还列出了过去人们做过的所有家务活动(包括实际做过的人,而不仅仅是分配给他们的人)。

如果您认为想以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(),你都会想要应用某种平衡功能,这样一个人就不会一直打扫卫生间。您可以使用修改后的指数退避来减少在完成一堆之后获得家务的可能性。

解决问题的一种更简单的方法可能是随机生成大量不同的人事杂志,并取消任何不符合约束条件的资格(即连续多次一人或一人做同样的杂务一天中的多个家务。)

答案 1 :(得分:1)

你可以试试某种有趣的钱"经济,信贷的价格和工资,或奢侈品消费品,而不是真正的货币,希望有效的市场出现,并提供最佳的解决方案。

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

答案 2 :(得分:1)

您的问题由两部分组成:

1)定义分数函数。如何定义公平,高效,......?他们之间的权衡是什么?有different techniques做出权衡:

  • 得分加权,例如:1次(分布不均匀)== 5次(一天多次做家务)
  • 得分水平,例如:(分布不均匀)总是超支(一天多重家务)
  • 帕累托评分:见维基百科

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

有关实施代码的类似示例的完整详细概述,关注this tutorial 。在Computer上用PersonProcess精神替换单词Chore