我想随机选择8天,分发的日子应该尽可能均匀.我的意思是,例如,不应该在每个月的前8天收集所有8天假.
例如:[1,5,8,14,18,24,27,30]是一个很好的分布.
[1,2,3,4,26,28,29]不是一个好的分布.
实际上,一名船员连续7天无法工作.每7天一次,必须有1天休息.
所有的日子都得到平等对待,即周日不是自己休息的日子.船员也可以在周末工作.
我想逐个选择休假.其中不是8个在一起.
你能推荐一个使用python实现这个的算法吗?
并非所有日子都可以休息几天.
最好的祝福
解决方法 这是关键:实际上,必须有1天休息.
将问题改为每7天随机说2天(或将月份分成四段时间).然后,您将获得均匀分布.使用random.sample()作为Martijn PIEters建议.
您可以从第一周开始使用此技术生成两个值,然后按顺序生成它们,如果您需要逐个生成它们.
编辑:
正如tcaswell所观察到的,仍有一些情况下你最终连续十天值班.要解决这个问题,您可以每三天分配一天,创建十个列表,并从不影响7连续日标准的天数子集中随机删除两天.
或者,您可以使用原始算法生成列表,直到符合条件,因为您很可能无论如何都会获得有效的解决方案.你必须编写某种验证函数,但这样做很容易,因为你只计算最长的连续日期.
码:
第二种选择的实现.
import randomfrom itertools import chainfrom itertools import countdef 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 Truedef 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]总结
以上是内存溢出为你收集整理的如何使用python在一个月内平均选择休假?全部内容,希望文章能够帮你解决如何使用python在一个月内平均选择休假?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)