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)
这将计划一周两天