2017-01-08 3 views
0

У меня есть список, представляющий год, который заполняется под списком для каждого дня года.Пытается создать алгоритм планирования

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-м, 2-й актив будет идеально расположен на 7-й позиции, а в следующий раз будет 28-й. Однако 28-го мероприятия уже запланированы. Это означает, что нет ничего запланированного на две недели, а затем вдруг 2 мероприятия в день. Второе действие может быть перенесено на 27-е или 29-е, но это все равно означает, что теперь мероприятия запланированы на 0-й, 7-й, 14-й, 28-й, 29-й. Ака, еще 14 дней между 14-м и 28-м, а затем только 1 между 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 

Если вы хотите больше активности, сделайте skip_days меньше. Если вы хотите меньше, сделайте его больше. Если вы хотите фиксированную сумму активности y в каждую неделю, вы могли бы сделать что-то вроде

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

Это будет планировать два дня в неделю.

Смежные вопросы