use*_*422 5 python combinations scheduling list python-3.x
我正在一个需要非常具体的计划的项目(以及为什么不使用库)。它可以工作,但是我试图为以下问题找到更快的解决方案:
我们有员工每周要求上班时间。他们输入一周的总可用时间(例如:8-1 M,W,R)。他们每个星期必须工作10个小时,而且每个班次必须至少连续2个小时。(所有班次都是连续的,中间不间断)。
例如,员工1表示可用性为:8-3 M,W,R,F:他可以安排在M上停留3个小时,在W上停留3个小时,在F上安排2个小时,或其他任意组合(例如4,4 ,2; 2,2,4等)。问题是试图找到这些组合。现在,我将它们的可用性存储为以分号分隔的字符串(例如:8,9,10,11,12,1; 8,9,10,11,12,1; 8,9,10 ;; 8,9将是每天(5天)的小时数))在调度过程中将它们分成一个数组,这对我来说是困难的部分:
我希望能够确定这些小时的组合,其中每个组合每天至少有2个小时,所有小时都是连续的,并且选择了10个总小时。现在,我的解决方案是蛮力的。
我使用itertools组合。我考虑了它们的可用性,并每天将相应日期的字母附加到其上并放入一个数组中。这样的例子8,9,10,11; 8,9 ;; 8,9,10,11; 变成[m8,m9,m10,m11,t8,t9,r8,r9,r10,r11]
然后,我使用itertools组合查看该数组的所有组合,并具有读取该函数的功能,以了解每天是否有连续的小时数,至少2个小时的班次以及总共10个小时(或其他小时数,这可以改变)。
这是一个非常缓慢的过程,因为某人的可用性为8-5 MF,他们可能有很多组合起作用或不起作用。(原因是我需要进行全部测试,因为我们有100多名员工担任相似的角色,如果担任一个角色,则此时无法安排另一名员工)
我现在如何做的例子。
# let availability be the string of availability
availability = "8,9,10,11;8,9;;8,9,10,11;"
poss_times = availability.split(";")
# where I put into one array with each day letter in front
sched=[]
sched.extend(["m" + day for day in list(filter(None,poss_times[0].split(",")))])
sched.extend(["t" + day for day in list(filter(None,poss_times[1].split(",")))])
sched.extend(["w" + day for day in list(filter(None,poss_times[2].split(",")))])
sched.extend(["r" + day for day in list(filter(None,poss_times[3].split(",")))])
sched.extend(["f" + day for day in list(filter(None,poss_times[4].split(",")))])
sched.extend(["s" + day for day in list(filter(None,poss_times[5].split(",")))])
sched.extend(["u" + day for day in list(filter(None,poss_times[6].split(",")))])
for poss_combination in itertools.combinations(sched, 10):
# check if the combination fulfills the requirements, and if so continue to see if it is possible to schedule that employee
Run Code Online (Sandbox Code Playgroud)
我希望可以有一个更快,更优雅的解决方案来加速这一过程。感谢您的任何帮助。
归档时间: |
|
查看次数: |
146 次 |
最近记录: |