加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:29:30 所属栏目:Python 来源:网络整理
导读:我将在一个日历月内随机分配8天休假. 我想随机选择8天,分发的日子应该尽可能均匀.我的意思是,例如,不应该在每个月的前8天收集所有8天假. 例如:[1,5,8,14,18,24,27,30]是一个很好的分布. [1,2,3,4,26,28,29]不是一个好的分布. 实际上,一名船员连续7天无法工
我将在一个日历月内随机分配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 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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读