Предыстория... Есть
написанная мной некая программка, предназначенная для автоматизации стартов в авиамодельном спорте, в классе RCCR - вот
здесь я описывал, что это такое. Одним из основных модулей этого "АРМ секретаря стартов" является жеребьевка. Остальные функции - занесение и подсчет результатов, расчет рейтингов этапа, пилотов, подсчет личных и командных мест, работают нормально и вопросов не вызывают. А вот с жеребьевкой есть проблемы... При чем. проблемы стали усугубляться в этом году - в связи с кризисом, количество участников существенно сократилось, и все "косяки" полезли наружу...
Краткое описание ТЗ:
1. Жеребьится четыре тура.
2. В каждом бою участвуют 4 пилота.
3. Каждый тур состоит из N-количества боев, равным общему количеству участников/4
4. При некратном 4 количестве участников, производится "стыковка" туров с помощью стыковых боев. Например: при количестве участников 25, проводятся три тура по 6 боев, и один, четвертый тур 7 боев - в него собираются остатки от деления на 4, в результате все равно каждый участник отлетвает 4 боя, просто в одном из трех он не летит, а в четвертом летит дважды. В остальных случаях, когда остаток от деления 2 или 3, тоже все стыкуется по аналогичному принципу.
А вот теперь самое интересное, критерии жеребьевки:
5. Каждый пилот должен по одному разу слетать на одном цвете ленты(стартовой позиции). Условие обязательное и неотключаемое.
6. По возможности надо развести членов команд, что-бы они друг с другом не встречались в одном бою. Это не всегда возможно - например, теже 25 участников, а в одной из команд оказалось 7 пилотов... В первых трех турах, по 6 боев, они все равно будут пересекаться, и только в четвертом, где семь боев, можно их развести.
7. По возможности надо развести пилотов от повторов, что-бы уменьшить вероятность дважды а то и трижды встретиться одним и тем-же пилотам в разных турах.
Вобщем, все это сейчас реализовано и работает. Но!!! Писал я это тогда, когда этапы проводились по 40 человек, команд было много тоже, и все это довольно сносно работало, в архиве программка вместе с базой данных с самого начала, можно посмотреть у кого есть возможность(это конфигурация под 1С 7.7 любой компоненты).
Алгоритм сейчас устроен линейно -
1. Жеребьится первый тур, используя генератор случайных чисел, из критериев только разводятся команды.
2. Жеребьится второй и последующие туры, но добавляются критерий цвета ленты и повтора - для этого анализируются предыдущие туры.
Все это сейчас происходит "неинтелектуально" - от того "как какрта легла" в первом и далее турах, зависит насколько успешно будет дальше разводиться...
Пока были крупные этапы, это в принципе работало... Но, сейчас, в связи с кризисом, численность этапов сильно сократилась, и этот алгоритм перестал нормально отрабатывать... В том же Волгограде, в прошедшую субботу, мне начиная со второго тура пришлось отключить оба критерия - "учитывать повторы" и "разводить команды"... Недовольных было куча...
Есть мысль, переделать весь алгоритм: жеребьить сразу в одной таблице все четыре тура, добиваясь минимальных пересечений по критериям, а потом делить по отдельным четырем турам, с учетом стыковых боев... Вобщем, высшая математика получается, вместе с теорией матриц...
Вот такая нетривиальная задача... С удовольствием принимаю все советы, кроме - "брось ты это нафиг, зачем тебе это нужно?".
PS Написано это все на 1С 7.7, но, это не принципиально - на чем мне было проще, на том и реализовывал. Для любой среды разработки, алгоритм будет в принципе один...
PSS Проект не коммерческий, делаю на чистом энтузиазме, по принципу - "если не я, то кто?"