Python 受约束的随机任务分配给人员一周,不连续

Python 受约束的随机任务分配给人员一周,不连续,python,constraint-programming,constraint-satisfaction,Python,Constraint Programming,Constraint Satisfaction,我想在一周内每天从8项任务列表中随机分配任务给4个人,条件如下: 每个人每天只完成2项任务(订单无关紧要),并且 无法连续两天以上将任务分配给同一个人(一个人第二天无法获得相同的任务),并且 无法在同一天和同一时间将同一任务分配给人员 一个人不能在一周内完成同一项任务超过2次 这是我一天的代码。但是如何为一周中的7天编写代码,强制执行上述条件 import random tasks = ['task1','task2','task3','task4','task5','task6','ta

我想在一周内每天从8项任务列表中随机分配任务给4个人,条件如下:

  • 每个人每天只完成2项任务(订单无关紧要),并且
  • 无法连续两天以上将任务分配给同一个人(一个人第二天无法获得相同的任务),并且
  • 无法在同一天和同一时间将同一任务分配给人员
  • 一个人不能在一周内完成同一项任务超过2次
这是我一天的代码。但是如何为一周中的7天编写代码,强制执行上述条件

import random

tasks = ['task1','task2','task3','task4','task5','task6','task7','task8',]
people = ['person1', 'person2', 'person3', 'person4']

random.shuffle(tasks)

tasks = zip(*[iter(tasks)]*2)

for n,person in enumerate(people):
   print person, tasks[n]

有很多方法可以做到这一点,但其中之一就是随机分配它们,检查它们是否符合您的规则,如果不符合,则重新分配它们

我可能会通过定义几个函数来实现这一点,您可以使用这些函数来检查任何给定的分配是否与您的规则匹配

例如:

随机导入
def编号连续(分配):
“”“检查是否没有连续的列表项”“”
对于范围(1,len(分配))中的i:
如果分配[i]==分配[i-1]:
返回错误
返回真值
def不超过两次(分配):
“”“请检查列表项是否出现两次以上”“”
对于分配中的i:
如果分配计数(i)>2:
返回错误
返回真值
tasks=['task1'、'task2'、'task3'、'task4'、'task5'、'task6'、'task7'、'task8']
people=['person1','person2','person3','person4']
答案={}
i=0
而我<4:
分配=随机。选择(任务,k=7)
如果不连续(分配)且不超过两次(分配):
回答[people[i]]=分配
i+=1
打印(答案)

编辑:我已经向您演示了如何操作,您已经编辑了您的问题以更改条件,现在让您从这里开始。

您的问题应该转到cs.stackexchange。com@Pa_事实并非如此,编程问题已经离题了。你能详细说明一下这个问题吗?在
中,您所说的“同一任务”是什么意思?同一任务必须非连续分配
?是的,请详细说明。你的意思是“不能在同一天将任务分配给2个以上的人”还是“无法在连续两天或两天以上的时间内将任务分配给同一个人?”?目前,这个问题太模糊了,无法回答。无论哪种方式,在连续几天可以分配什么样的人员/任务上都存在一些限制。所以忽略这些约束是错误的。每个人/任务的分配代码需要查找前一天的分配,这意味着您需要将其存储到7xP数组中,其中P是人数,或7xT,其中T是任务数。所以只打印它们而不将它们存储在某个地方是错误的。很抱歉条件发生了变化,但是阅读评论,我很模糊。。。我已经精确地定义了限制条件。没有任何问题:-)现在我已经向您展示了处理此类问题的一种方法,我将让您根据您的具体问题来调整它。我不知道如何在答案词典中验证人员列表中的项目每天都不同。如何检查每个列表中的第一项是否不同<代码>{'person1':['task2','task1',…],'person2':['task4','task2',…],'person3':['task2','task8',…],'person4':['task7','task1',…])
你能指导我吗?