Skip to content

Алгоритм генерации расписания

romos edited this page Mar 8, 2013 · 3 revisions

Описание условий

  • Считаем, что каждое соревнование не длится больше дня.
  • Все дни имеют одинаковую длительность, например, 8 часов.
  • Длительность соревнования определяется также в часах.

Описание идеи

Представим сам объект расписания так: Algorithm_scheme

Т.е. массив списков, состоящих из объектов-соревнований. Длина массива списков = количество спортивных объектов. При попытке добавления очередного Event'а мы смотрим, в какой список он попадает, и пробуем запихать его следом за последним элементом этого списка в соответствующий день. Если никак, то пробуем пихать другой Event. Если ни один Event не лезет из-за каких-то причин (вылезают за пределы дня, не могут стоять одновременно с другими соревнованиями), мы пихаем в расписание пустые Event'ы длительностью 1 час на все спорт.объекты и опять пробуем сгенерить расписание.

Псевдокод. Совсем "псевдо" :)

Plan - непосредственно расписание, большая структура для хранения генерящегося расписания Events - массив соревнований. hoursleftp[] - массив. Сколько осталось часов в текущем дне расписания (для каждого спорт.объекта) currday[] - массив. Текущий соревновательный день в расписании для каждого спорт.объекта (см. картинку выше) TryPushPlan - ф-ция с проверками на ограничения. з.ы. Остальные функции могут обозначаться странными значками <. > :)

Этот долбаный GitHub не хочет постить мой псевдокод красиво, поэтому получайте так: pseudo_algo