尝试创建规划算法

时间:2017-01-08 09:45:34

标签: 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.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.weeks:

    >>>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号之间,第二个活动将理想地放在第7个位置,这意味着下一次将是第28个。然而,在28日,第一项活动已经计划好了。这意味着两周内没有任何计划,然后一天突然发生两项活动。第二项活动可以推到27日或29日,但这仍然意味着现在的活动计划在0日,7日,14日,28日,29日举行。阿卡,从14日到28日之间仍有14天,然后在28日到29日之间只有1天。

我可以通过哪种方式确保所有活动都按照活动之间的平均时间进行规划?

1 个答案:

答案 0 :(得分: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

如果您想要更多活动,请将skip_days缩小。如果你想要更少,那就把它做大。如果您希望每周都有固定数量的活动,则可以执行类似

的操作
for y in range(0, 52*7, 7):
    year[y] = random.choose(activities)
    year[y+3] = random.choose(activities)

这将计划一周两天。