如何使用python在一个月内平均选择休假?
我将在一个日历月内随机分配8天休假.
我想随机选择8天,分发的日子应该尽可能均匀.我的意思是,例如,不应该在每个月的前8天收集所有8天假. 例如:[1,5,8,14,18,24,27,30]是一个很好的分布. 实际上,一名船员连续7天无法工作.每7天一次,必须有1天休息. 所有的日子都得到平等对待,即周日不是自己休息的日子.船员也可以在周末工作. 我想逐个选择休假.其中不是8个在一起. 你能推荐一个使用python实现这个的算法吗? 并非所有日子都可以休息几天. 最好的祝福 解决方法
这是关键:
实际上,必须有1天休息. 将问题改为每7天随机说2天(或将月份分成四段时间).然后,您将获得均匀分布.使用random.sample()作为Martijn Pieters建议. 您可以从第一周开始使用此技术生成两个值,然后按顺序生成它们,如果您需要逐个生成它们. 编辑: 正如tcaswell所观察到的,仍有一些情况下你最终连续十天值班.要解决这个问题,您可以每三天分配一天,创建十个列表,并从不影响7连续日标准的天数子集中随机删除两天. 或者,您可以使用原始算法生成列表,直到符合条件,因为您很可能无论如何都会获得有效的解决方案.你必须编写某种验证函数,但这样做很容易,因为你只计算最长的连续日期. 码: 第二种选择的实现. import random from itertools import chain from itertools import count def candidate(m): ''' Returns 2 days per week,in m days,where m is the length of the month. ''' weeks = weeksmaker(m) return sorted(list(chain(*[random.sample(week,2) for week in weeks]))) def weeksmaker(m): ''' Divides a month up into four weeks,randomly assigning extra days to weeks. ''' weeks = [range(i,i+7) for i in xrange(1,29,7)] for i in range(m - 28): weeks[random.randint(1,len(weeks))-1].append(i) c = count(1) return [[c.next() for day in week] for week in weeks] def valid(days,c): ''' Validity check. Cant work more than c consecutive days. ''' for i in xrange(1,len(days)): if days[i] - days[i-1] > c: return False else: return True def daysoff(m,n,c): ''' In month length m,need n days off,cant work more than c consecutive days. ''' while True: days = candidate(n) if valid(days,c): return days >>> for i in range(28,32): ... daysoff(i,7) ... [6,7,10,20,28] [4,13,19,21,23,24] [2,9,15,25,27] [1,12,28] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |