Python 尝试创建一个规划算法

Python 尝试创建一个规划算法,python,algorithm,Python,Algorithm,我有一个代表一年的列表,其中包含一年中每一天的子列表 year = [] for i in range(0,52*7): day = [i,0] #[day number, 0 = empty, 1 = something is planned] year.append(day) 我还有一个由类创建的活动的可变列表 class Activities: def __init__(self,name,weeks,weekends): self.n

我有一个代表一年的列表,其中包含一年中每一天的子列表

year = [] 
for i in range(0,52*7):
     day = [i,0]    #[day number, 0 = empty, 1 = something is planned]
     year.append(day)
我还有一个由类创建的活动的可变列表

class Activities:
    def __init__(self,name,weeks,weekends):
        self.name = name
        self.weeks = weeks
        self.weekends = weekends
    def __repr__(self):
        return repr((self.name,self.weeks,self.weekends))

def activityMaker(activityList):
    a= []
    for i in range(0, len(activityList)):
        a.append(Activities(activityList[i][0], activityList[i][1], activityList[i][2]))
    a =  sorted(a, key=lambda Activities: Activities.weeks)
    activityList = a
    return activityList 
例如,

    >>> activityList = [['Tennis', 3, 0], ['Baseball', 4, 0], ['Swimming', 2, 0]]
    >>>activities= activityMaker(activityList)
返回“活动”,按活动排序。周:

    >>>activities[0].name      
    activities[0].week        
    activities[0].weekend      
    >>> 'Swimming'     # activity name
    2                  #"i want to do this activity once every x weeks
    0                  # 0 = no preferance, 1 = not in weekends
现在是我的困境。我希望创建一个算法,用尽可能多的节奏来填充这一年的活动

我目前的方法不能正常工作。我现在正在做的事情如下

for y in range(0,len(year), int(7*activities[0].weeks)):
    year[y][1] = activities[i].name
现在为每个y计划第一个活动。如果我有两个活动,每个活动我都希望每周计划一次,我可以在第0、第7、第14等时间计划第一个活动,在第3、第10、第17等时间计划第二个活动

如果活动[0]和活动[1]分别为2和3,则说明了此方法的问题。如果我采用前面的方法,活动[0]将计划在第0、14、28日等,这本身就可以了。在第0次和第14次之间,第2次活动最好放在第7位,这意味着下一次将是第28次。然而,28日的第一项活动已经计划好了。这意味着两周内没有任何计划,然后突然一天两次活动。第二项活动可以推迟到27日或29日,但这仍然意味着现在活动计划在0日、7日、14日、28日和29日进行。也就是说,14号和28号之间还有14天,28号和29号之间只有1天


我怎样才能确保所有活动都在活动之间安排了尽可能多的平均时间

你的问题是,除非所有活动的周数相同(因此它们都有相同的节奏),否则有些周会有很多活动,有些周则没有活动

我的建议是:当你在一年中的几个星期里走来走去时,只需为每个星期随机选择一项(或两项)活动。这样,每周都会有适量的活动计划。下面是一些示例代码:

import random
activities = ["Baseball", "Tennis", "Swimming", ... ]
skip_days = 3
year = {}
for y in range(0, 52*7, skip_days):
    year[y] = random.choose(activities)

print year[0]
>>> "Swimming" (perhaps)

print year[15]
>>> "Baseball"

print year[17]
>>> None
如果你想要更多的活动,就把跳过的日子缩短。如果你想要更少,就把它变大。如果你想每周都有固定的活动量,你可以做如下的事情

for y in range(0, 52*7, 7):
    year[y] = random.choose(activities)
    year[y+3] = random.choose(activities)
这将计划一周两天