Я дал ваш код для отладки, включая замену пакета Events на простые парные кортежи.
def scheduleRecGD2(E, eventPos, startTime, events):
print("ENTER Rec", "eventPos", eventPos, "\tstartTime", startTime, "\n\tevents", events)
while eventPos < len(E) and E[eventPos][0] < startTime:
eventPos += 1
if eventPos == len(E):
return []
minEndPos = eventPos
print("\tFIRST: minEndPos", minEndPos, E[minEndPos])
for i in range(eventPos+1, len(E)):
if E[i][1] < E[minEndPos][1]:
minEndPos = i
events.append(E[minEndPos])
print("\tTRACE: minEndPos", minEndPos, E[minEndPos])
return scheduleRecGD2(E, minEndPos+1, E[minEndPos][1], events)
# Main program
E = randomEventArray(8)
print(E)
print(scheduleGD2(E))
Выход:
[(15, 20), (4, 7), (17, 20), (18, 23), (2, 7), (8, 23), (15, 23), (18, 20)]
ENTER Rec eventPos 0 startTime 0
events []
FIRST: minEndPos 0 (15, 20)
TRACE: minEndPos 1 (4, 7)
ENTER Rec eventPos 2 startTime 7
events [(4, 7)]
FIRST: minEndPos 2 (17, 20)
TRACE: minEndPos 4 (2, 7)
ENTER Rec eventPos 5 startTime 7
events [(4, 7), (2, 7)]
FIRST: minEndPos 5 (8, 23)
TRACE: minEndPos 7 (18, 20)
ENTER Rec eventPos 8 startTime 20
events [(4, 7), (2, 7), (18, 20)]
[(4, 7), (2, 7), (18, 20)]
АНАЛИЗ
Ваш алгоритм отключается сам по себе более одного раза. Более того, когда вы вводите подпрограмму во второй раз, вы находите первую запись с приемлемым временем начала и берете время ее окончания как «цифру для удара». С этого момента вы полностью игнорируете время начала, указанное в вызове, и время начала оставшихся событий, ища только что-то, что превосходит время окончания относительного произвольного интервала.
Вы продолжаете просматривать список таким образом, несколько беспорядочно меняя заданное время начала, пока не достигнете конца списка.
РЕМОНТ
Следуйте многочисленным решениям, доступным онлайн: сначала отсортируйте список по порядку времени окончания, затем время начала. Теперь очень просто пройтись по вашему списку и найти первое доступное время start , которое (а) находится в списке позже, чем последний добавленный кортеж; (б) не менее текущего времени окончания.
Учитывая наличие решений, я оставлю это в качестве упражнения для студента. Начните с простого изменения в процедуре рандомизации:
return sorted(e)