如何使用python在一个月内平均选择休假?

如何使用python在一个月内平均选择休假?,第1张

概述我将在一个日历月内随机分配8天休假. 我想随机选择8天,分发的日子应该尽可能均匀.我的意思是,例如,不应该在每个月的前8天收集所有8天假. 例如:[1,5,8,14,18,24,27,30]是一个很好的分布. [1,2,3,4,26,27,28,29]不是一个好的分布. 实际上,一名船员连续7天无法工作.每7天一次,必须有1天休息. 所有的日子都得到平等对待,即周日不是自己休息的日子.船员也可以在 我将在一个日历月内随机分配8天休假.

我想随机选择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在一个月内平均选择休假?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存