[ОТВЕТИТЬ]
26.08.2015 11:13
MWWRuza
 
Предыстория... Есть написанная мной некая программка, предназначенная для автоматизации стартов в авиамодельном спорте, в классе 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 Проект не коммерческий, делаю на чистом энтузиазме, по принципу - "если не я, то кто?"
28.08.2015 14:11
MWWRuza
 
Две ночи работы, и в результате что-то начинает проясняться, но только начинает...
Вобщем, "чем дальше в лес, тем толще партизаны!"...
Не буду грузить кодом программы, там все запутано, а разбираться в чужом коде, ясное дело, никто просто так не станет... Вот результат работы в Exel-евском файле, сейчас в таблице разведены пилоты по четырем турам, с учетом условия - "по одному разу на каждой позиции(цвете ленты)", с учетом "стыковых" боев(отделено жирной черной линией, первые три тура по 6 боев, 4-тый 7 боев), максимально разведены пересечения команд - их всего три, потому, что в одной команде 7 пилотов, а количество боев в трех турах по 6, по этому по другому не получится.

Осталось самое сложное - теперь надо минимизировать повторы(это когда один пилот летает с конкретным соперником в течении всех соревнований более одного раза)... Сейчас их довольно много, при чем, некоторые повторяются более двух раз... Например, пилот Костенко Иван, во всех четырех турах встречается в одном бою с пилотом Сысоевым Сергеем...
Двигать пилотов можно только в пределах одного столбца таблицы, и в пределах строк принадлежащих одному туру, при этом учитывая не пересечение со своими членами команд...

Каким образом это сделать, ума не приложу... В голову лезут только какие-то бесконечные циклы с ограничением по количеству попыток и с запоминанием лучших результатов, с последующим возвратом к наилучшей запомненой комбинации... Но, чувствую, что это совсем не оптимально, должен быть более простой и эффективный алгоритм... Но, как его придумать??? Прям задачка для любителей головоломок
28.08.2015 14:26
MWWRuza
 
Перезалил файл, потому, что попытался загрузить в хранилище исходный xls, а форум автоматом заархивировал его в 7zip, после чего он оказался нечитаем... Вобщем, заархивировал сам в rar, и перезалил. Теперь, читается: Жеребьевка
28.08.2015 17:34
OlegON
 
Цитата:
MWWRuza Перезалил файл, потому, что попытался загрузить в хранилище исходный xls, а форум автоматом заархивировал его в 7zip, после чего он оказался нечитаем... Вобщем, заархивировал сам в rar, и перезалил. Теперь, читается: Жеребьевка
Код:
diff -s Жеребьевка из rar.xls Жеребьевка из 7z.xls 
Files Жеребьевка из rar.xls and Жеребьевка из 7z.xls are identical
28.08.2015 18:06
MWWRuza
 
Ну, значит у меня на компе 7zip криво разархивируется, тем-же WinRar... А родного для него WinZip у меня на компе нет, точнее есть, но с истекшим сроком бесплатного использования, не работает. Все архивы в принципе WinRar открывает нормально, поэтому как-бы и ненужен был, первый раз подобный косяк встретился... Да и фиг с ним, щас голова другим забита, "супер-интеллектуальный" алгоритм изобретаю по сабжевой задаче.
28.08.2015 19:22
OlegON
 
Извини, но http://www.7-zip.org/download.html, выкинь винрар, как давно уже пора было сделать, особо в свете моего сомнения, что ты его купил :)
Что касается сути вопроса, то основная сложность в том, что когда ты все понятно опишешь, то сам поймешь, что нужно сделать :) Поэтому тут никого нет, что понять суть соревнований и ранжирования сейчас, я пока, например, особо не могу.
Если представить себе соревнования и пересечения соперников в виде дерева, то, видимо, берешь рекурсию и идешь вверх по дереву, наращивая массив соперников. Оценивая ситуацию, берешь количество совпадений с имеющимся массивом пройденных соперников и берешь вариант наименьшего совпадения по количеству.
28.08.2015 20:09
MWWRuza
 
Да это понятно, что суть соревнований мне понятна, как никому другому... И объяснить ее "на пальцах" довольно сложно.
Но, в принципе, можно абстрагироваться от соревнований, и просто видеть таблицы - ту, что из предыдущего сообщения, и эту, дополнение к ней, содержащую список повторов...
А дерево... Я как-то слабо себе представляю, как эти таблицы представить в виде дерева... Там все прямое, никакого ветвления нет, есть четыре колонки, и четыре диапазона строк, внутри которых можно двигать значения, чтобы добиться наименьших повторений комбинаций в строках...
28.08.2015 21:26
OlegON
 
я подразумевал, что соревнование строится аналогично такой схеме, нет?
28.08.2015 22:05
twix
 
Енто ж финальная таблица. А сперва участники должны быть разбиты на группы, в которых играют друг с другом не менее одного раза. По итогам этих отборочных игр участник, набравший бОльшее количество очков попадает в приведённую тобой табличку.

ЗЫЖ Имхо всё, что приведено выше, ибо я не спец... просто немного логику применил.
28.08.2015 22:08
OlegON
 
Хм, я думал, что просто определяется именно жеребьевкой чуть длиннее дерево (схемку просто в инете первой выцепил).
28.08.2015 22:34
twix
 
Погугли турнирные таблицы ногомяча со всеми группами - ближе будет к тому, что требуется ТСу.
28.08.2015 23:04
MWWRuza
 
Цитата:
OlegON я подразумевал, что соревнование строится аналогично такой схеме, нет?
Нет... У нас все завязано на четыре... Четыре отборочных тура, с количеством боев в каждом туре - число участников(общее, всего) деленное на 4. С распределением остатка от деления с помощью стыковых боев.
Далее, после отборочных туров, идут финалы(три боя), в которые выходит первая четверка по итогам отборочных туров. Там никакой жеребьевки не требуется - просто по занятым местам после отборочных туров, распологаются стартовые позиции с лева на право. В каждом следующем финальном бою, спортсмены сдвигаются вправа на одну позицию(что-бы не летать на одной ленте(читай - с одними судьями)). Поэтому, в рамках текущей задачи, финалы нас не интересуют совсем - там и так все просто и понятно...
Проблема развести отборочные туры...
28.08.2015 23:26
MWWRuza
 
Цитата с rccombat:
Цитата:
А я вот лично не доволен - жеребьева на этапе была ни в "...у" , 2 тура отлетал с Диденко и 3 с Ворфоломеевым ни против одного или другогоу меня "вопросов" нет, НО САМ ФАКТ!!!!
Парируйте...
_________________
С уважением.




rememba



Зарегистрирован: 07.09.2009
Сообщения: 103
Откуда: Лыткарино, Мос. обл.
Добавлено: Пн Авг 24, 2015 1:20 pm Заголовок сообщения:

--------------------------------------------------------------------------------

Что понравилось ?
Все. Организация, гостеприимство, атмосфера, юмор лился рекой )
Коровы на поле, арбузы. Счастье есть. Вечер прошел под лозунгом " даешь этапы в Волгограде каждый год" )))) и не один раз ))
Что огорчило ( не касается организации и проведения этапа ) :
4 тарана у меня, в каждом бою по тарану и в итоге 5 место, что конечно же обидно чуть чуть. + все таки на обратной дороге сломался опель нашего самого доброго пилота олега- вытекло все масло ( 5 канистр, залитые постепенно )и в конце оборвался ремень генератора и 60 км эвакуатора ((
Жеребьевка не айс, согласен с лехой. Надо софт доработать !!!))) Но это мелочи, Гена и Алиса Спасибищще большое !!
А это я "Парирую":

Цитата:

Зарегистрирован: 21.05.2007
Сообщения: 794
Откуда: Руза
Добавлено: Пн Авг 24, 2015 6:13 pm Заголовок сообщения:

--------------------------------------------------------------------------------

Змий моторный писал(а):
А я вот лично не доволен - жеребьева на этапе была ни в "...у" ,
*********************************
Парируйте...


А что тут парировать... Согласен на все сто... Блок программы, занимающийся именно жеребьевкой, надо делать заново... Когда это писалось, этапы были от 30 пилотов, и команд много... А сейчас?
В данный момент, программа жеребьит каждый тур в отдельности, с учетом предыдущих туров, на основании генератора случайных чисел и учитывая три критерия - ленты(безусловно), команды(отключаемо), и пресловутые повторы(тоже отключаемо)... В Волгограде изначально было понятно, что не разведется при всех критериях - 25 человек, это 6 боев в туре, а в одной из команд - 7 пилотов... Поэтому, "Разводить команды" пришлось снять сразу, начиная со второго тура... А оно отключается не для одной "многочисленной" команды, а для всех сразу... Поэтому, пришлось руками распихивать всех кого куда можно, тут уж не до повторов... А времени на это никто не дает - после построения, команда "Начало стартов через 10 минут..." А что касается того, "что проще руками развести, мы же в спорте разводим!"... У меня слов нет... Ты, Леша, попробуй развести, чтобы все учесть, хотябы два тура - я уже не говорю про третий и четвертый... И засеки время, сколько провозишься... Справишься? Тогда разведи третий, с учетом первых двух... За четвертый, я вообще молчу, это не реально.

Буду переделывать программу, на другой принцип вообще... Жеребьить сразу в одной таблице все четыре тура, чтобы получить матрицу с минимальными повторами и пересечениями, а потом распихивать получившийся результат по турам, с учетом стыковых боев... Должно лучше получиться, но, сложнее...

PS Еще раз повторюсь - в лучшие времена это было нафик не нужно - и так все разводилось, ну максимум, в крайнем, четвертом туре мог быть один-два повтора, а сейчас, когда народу с гулькин хрен, это уже не работает
Это пара фраз с профильного форума... А сколько говна я выслушал на поле... Поэтому, и занялся конкретно...
28.08.2015 23:32
MWWRuza
 
Вот, кстати, главный судья прошедших соревнований меня поддержал, приятно, но, мне, как автоу этого софта не легче...

Цитата:



Зарегистрирован: 10.12.2003
Сообщения: 1270
Откуда: г. Самара
Добавлено: Пн Авг 24, 2015 7:58 pm Заголовок сообщения:

--------------------------------------------------------------------------------

Очень хорошо помню то время, когда жеребили руками без компа. Это был тихий ужас - долго, не справедливо, постоянные споры и переделки. По времени перед каждым туром занимало не менее получаса. Ни о каких современных критериях жеребьевки и речи не было. А вот потом появилась программа Степуры, а затем уже более продвинутая версия Влада.

Надо сказать, при многочисленной команде проблемы были всегда. Думается, если количество пилотов в команде более трех, ничего страшного нет, если будут воевать между собой. а если не хотят, пусть на несколько команд делятся) Гораздо важнее что бы все за соревнования были на разных лентах и как можно меньше в повторных боях встречались.
_________________
г.Самара
07.09.2015 21:37
MWWRuza
 
Цитата:
OlegON Что касается сути вопроса, то основная сложность в том, что когда ты все понятно опишешь, то сам поймешь, что нужно сделать :) Поэтому тут никого нет, что понять суть соревнований и ранжирования сейчас, я пока, например, особо не могу.
Вот, расписал все, разложил по полочкам, уж незнаю, как еще... Честно говоря, писал как раз для того, что-бы привлечь к решению проблемы человека, далекого от предмета, но зато повернутого на математике... За одно, решил и сюда выложить, может кто-то что-то интересного предложит...
13.09.2015 22:26
MWWRuza
 
Глухо... Как в танке...
Я уже на CyberForum создал тему, в разделе Математика/Комбинаторика... За три дня, ни одного ответа
Пока "оттачивал" свой алгоритм, выяснил, что на конечный результат очень сильно влияет начальное расположение строк в таблице! Попробовал найти закономерность - не получилось... Сортировка по размерам команд(в обе стороны - и по убыванию, и по возрастанию), не помогает, только хуже... Сейчас сделал перемешивание строк с помощью генератора случайных чисел, и повтор всего этого в цикле, с запоминанием наилучшего результата и выводом потом его в таблицу. При 500 циклах, получен результат с одним повтором, при тех-же исходных данных, что в описании. Но, это около 40 минут на моем компе(на поле, на ноуте, будет раза в полтора больше), что совершенно не приемлемо, да и результат негарантирован. Должны же быть какие-то другие, более "научные" способы решения этой задачи? Подскажите, может есть еще где-то тусовки людей, знакомых с комбинаторикой и подобными задачами? Кроме КиберФорума, ничего больше найти не удалось...
14.09.2015 08:04
OlegON
 
Сейчас народ сильно ленив стал на форумах... Многих уволили, наверное.
Я по прежнему не нахожу время погрузиться в задачу, но почему именно 500 циклов? поставь 5, с учетом базы на генераторе случайных чисел (его надо инициализировать, может, сначала?) случайности будет достаточно?
14.09.2015 18:27
MWWRuza
 
Да какая разница, сколько циклов... Это влияет только на время выполнения задачи, и на шанс нарваться на удачную раскладку исходного списка - попасть пальцем в ж**у Если повезет, то может и с первого раза разложиться оптимально, а если нет, то может и после 500 циклов остаться много повторов... На то он и генератор случайных чисел...
По хорошему, он там не нужен в таком виде совсем - должно быть решение в виде готовой матрицы, в которую уже можно запихнуть список, случайно перемешанный(или не перемешанный, а расположенный по каким-то критериям, если это неизбежно!), и на выходе получить максимально разведенную таблицу...
То, что я сейчас использую ГСЧ, это временная мера, что-бы понять, на сколько вообще может решиться задача, потому-как, понять закономерность расположения пилотов в исходном списке и влияние этого расположения на конечный результат - выше моего понимания... По крайней мере - пока выше
14.09.2015 18:35
MWWRuza
 
Цитата:
OlegON с учетом базы на генераторе случайных чисел
Что значит базы? Он сейчас генерит случайное число в диапазоне от 1 до количества пилотов - в моем примере 25. Выбирает по этому получившемуся числу пилота из исходного списка, помещает в выходной список, а из исходного удаляет. И так, пока исходный список не будет пустым. В результате все пилоты из исходного списка переместятся в выходной список, "перетасованные" в случайном порядке, как колода карт.
А база... Это, как я понимаю, варианты расстановки исходного списка... При количестве участников 25 - 25 в 25 степени(могу ошибаться, но думаю так). Число огромное, и задача неделю будет решаться...
14.09.2015 20:38
OlegON
 
Поскольку это все же не случайное, а псевдослучайное число на самом деле, во всяких васиках раньше надо было инициализировать чем-то вроде RANDOMIZE TIMER, в противном случае последовательность была хаотичная, но одна и та же. По моему предложенный вариант избыточен по циклам. Исходя из того, что число все же действительно произвольное, можно сразу дать всем пилотам индексы и отсортировать по возрастанию.
14.09.2015 21:09
MWWRuza
 
Цитата:
OlegON и отсортировать по возрастанию.
По возрастанию чего? Индексов? А смысл... По размерам команд, пробовал, при чем в обе стороны... Результат неудовлетворительный...

Случайное число получаю с помощью "MSScriptControl.ScriptControl".
"ScrCtrl.ExecuteStatement("randomize");"
"СлучайноеЧисло = ScrCtrl.Eval("rnd");"
14.09.2015 21:23
OlegON
 
Странно, чем он неудовлетворительный? В чем разница, за 100 циклов вытащить случайного пилота или сразу им произвольный порядок назначить? Прошу меня извинить, я начало темы забыл...
14.09.2015 21:40
MWWRuza
 
Проблема то не в случайном порядке пилотов... С этим то как раз - проблем нет

Проблема в том, что случаино отсортированный список, это только исходные данные...

Далее их надо развести по 4-рем стартовым позициям(лентам, летают сразу по 4 пилота!), на 4 тура(в которых каждый должен отлетать по 1 разу), с учетом стыков из-за некратного четырем количества пилотов, развести по возможности от пересечения с членами своей команды, и при этом на протяжении всех 4-х туров, минимизировать повторы участников между собой.
И вот эта вся канитель, в моем варианте построения алгоритма всего этого безобразия, оказывается очень чувствительна к начальному расположению пилотов в списке. От того, как они там расположены, зависит конечный результат - остаток неразведенных повторов. Уловить как должны располагаться пилоты(по какому принципу), мне так и не удалось... Поэтому, как временная мера, для получения наилучшего конечного результата и использовал случайную перетасовку входных данных, отработку алгоритма, сравнение полученного результата с предыдущим сохраненным, и в случае лучшего результата - замена сохраненного результата на лучший.
Это конечно не правильно, но как это решать с точки зрения комбинаторики - х.з., у меня тут полный пробел в знаниях...
27.09.2015 22:21
Shift
 
Если ещё актуально, то попробую поделиться некоторыми соображениями.
Исходя из условий задачи её можно решить (если это вообще возможно) только перебором всех возможных вариантов. Из комбинаторики Количество перестановок = n!. В нашем случае для 25 человек это 100 позиций и соответственно 100! вариантов.
Возникла следующая идея.
Поскольку из условий задачи каждый пилот должен по 1 разу отлетать на каждом цвете, то красный цвет мы можем расставить сразу, перечислив пилотов по порядку. Следующий (жёлтый) мы смещаем на какое-то число (не меньше чем Количество боёв в туре и не большее чем 1/3 боёв во всех турах). Соответственно следующий (зелёный) смещаем ещё на кое-то число с предыдущими ограничениями. Тем самым мы обеспечиваем распределение 75% позиций без дополнительных проверок. Остается только расставить оставшиеся 25%, что составляет 25!, если перебирать все варианты, а на самом деле гораздо меньше. Для уменьшения пересечения пилотов одной команды, соответственно отсортируем пилотов в порядке убывания размеров команд.
Вот что у меня получилось:

Шабельский Геннадий(Алиса-Эйр) * Диденко Анатолий(Волжанин) * Александров Сергей(RC-Lytkarino) * Костенко Иван(СТК-СЮТ Клин)
Борисов Алексей(Алиса-Эйр) * Иванов Герман(Волжанин) * Кувакин Олег(RC-Lytkarino) * Савельев Максим(СТК-СЮТ Клин)
Никулин Артем(Алиса-Эйр) * Дронов Михаил(РуПъ) * Нестеров Владимир(Юпитер) * Курбатов Руслан(СТК-СЮТ Клин)
Гринжола Артем(Алиса-Эйр) * Медведев Владислав(РуПъ) * Захарчук Игорь(Юпитер) * Карпов Игорь(RC-Lytkarino)
Долганов Александр(Алиса-Эйр) * Сашин Алексей(АК Метеор УСЦ ДОСААФ) * Гладченко Александр(Юпитер) * Шукуров Рауф(Авиаклуб Диар-Флай)
Сысоев Сергей(Алиса-Эйр) * Должиков Сергей(Анна) * Китаев Александр(Авиаклуб Диар-Флай) * Курбатов Николай(СТК-СЮТ Клин)
Ворфоломеев Петр(Алиса-Эйр) * Шабельский Геннадий(Алиса-Эйр) * Шукуров Рауф(Авиаклуб Диар-Флай) * Нестеров Владимир(Юпитер)
Курбатов Николай(СТК-СЮТ Клин) * Борисов Алексей(Алиса-Эйр) * Диденко Анатолий(Волжанин) * Захарчук Игорь(Юпитер)
Костенко Иван(СТК-СЮТ Клин) * Никулин Артем(Алиса-Эйр) * Иванов Герман(Волжанин) * Гладченко Александр(Юпитер)
Савельев Максим(СТК-СЮТ Клин) * Гринжола Артем(Алиса-Эйр) * Дронов Михаил(РуПъ) * Китаев Александр(Авиаклуб Диар-Флай)
Курбатов Руслан(СТК-СЮТ Клин) * Долганов Александр(Алиса-Эйр) * Медведев Владислав(РуПъ) * Должиков Сергей(Анна)
Карпов Игорь(RC-Lytkarino) * Сысоев Сергей(Алиса-Эйр) * Сашин Алексей(АК Метеор УСЦ ДОСААФ) * Кувакин Олег(RC-Lytkarino)
Александров Сергей(RC-Lytkarino) * Ворфоломеев Петр(Алиса-Эйр) * Должиков Сергей(Анна) * Иванов Герман(Волжанин)
Кувакин Олег(RC-Lytkarino) * Курбатов Николай(СТК-СЮТ Клин) * Шабельский Геннадий(Алиса-Эйр) * Дронов Михаил(РуПъ)
Нестеров Владимир(Юпитер) * Костенко Иван(СТК-СЮТ Клин) * Борисов Алексей(Алиса-Эйр) * Медведев Владислав(РуПъ)
Захарчук Игорь(Юпитер) * Савельев Максим(СТК-СЮТ Клин) * Никулин Артем(Алиса-Эйр) * Сашин Алексей(АК Метеор УСЦ ДОСААФ)
Гладченко Александр(Юпитер) * Курбатов Руслан(СТК-СЮТ Клин) * Гринжола Артем(Алиса-Эйр) * Ворфоломеев Петр(Алиса-Эйр)
Китаев Александр(Авиаклуб Диар-Флай) * Карпов Игорь(RC-Lytkarino) * Долганов Александр(Алиса-Эйр) * Диденко Анатолий(Волжанин)
Шукуров Рауф(Авиаклуб Диар-Флай) * Александров Сергей(RC-Lytkarino) * Сысоев Сергей(Алиса-Эйр) * Гринжола Артем(Алиса-Эйр)
Диденко Анатолий(Волжанин) * Кувакин Олег(RC-Lytkarino) * Ворфоломеев Петр(Алиса-Эйр) * Никулин Артем(Алиса-Эйр)
Иванов Герман(Волжанин) * Нестеров Владимир(Юпитер) * Курбатов Николай(СТК-СЮТ Клин) * Долганов Александр(Алиса-Эйр)
Дронов Михаил(РуПъ) * Захарчук Игорь(Юпитер) * Костенко Иван(СТК-СЮТ Клин) * Сысоев Сергей(Алиса-Эйр)
Медведев Владислав(РуПъ) * Гладченко Александр(Юпитер) * Савельев Максим(СТК-СЮТ Клин) * Шабельский Геннадий(Алиса-Эйр)
Сашин Алексей(АК Метеор УСЦ ДОСААФ) * Китаев Александр(Авиаклуб Диар-Флай) * Курбатов Руслан(СТК-СЮТ Клин) * Александров Сергей(RC-Lytkarino)
Должиков Сергей(Анна) * Шукуров Рауф(Авиаклуб Диар-Флай) * Карпов Игорь(RC-Lytkarino) * Борисов Алексей(Алиса-Эйр)


Теперь жирный минус - алгоритм работает для 23,25 и более команд, хотя в теории без повторений нельзя развести менее 13 пилотов (каждый встречается с 3*4=12 пилотами). Возможно надо попробовать поиграться со сдвигом при начальном заполнении.

Код для 1С ниже:
скрытое
27.09.2015 22:33
Shift
 
Небольшое дополнение насчет сортировки - можно сортировать участников внутри команды, а так-же сами команды если количество участников в этих командах меньше количеста боёв в одном туре.
28.09.2015 13:53
MWWRuza
 
Спасибо, что нашли время вникнуть в мою проблему!

Я тут тоже время не терял, много чего написал, восновном для анализа...

Вот база на текущий момент...

А вот, как выглядит закладка документа "Этап" с "обилием вариантов" жеребьевки:


Каждая кнопочка формирует таблицу жеребьевки, разными способами, используя список пилотов в документе, таблицу "повторов", и исходный список:


С Вашим кодом пока не разбирался, вечером попробую. Я так понимаю, это обработка, без обращения к БД, с заполнением списка при открытии из модуля... На форме нужны какие-то реквизиты, кроме кнопки "Жеребьевка()" - ?

И еще вопрос - что означает восклицательный знак - "100!" - ? Я просто не знаком с правилами записи формул в комбинаторике, это степень числа или еще что-то?
28.09.2015 13:56
Stels
 
Цитата:
MWWRuza "100!" - ?
читается Факториал

n! = 1* 2 *3 *4 * ...* n
28.09.2015 14:14
MWWRuza
 
Цитата:
Shift красный цвет мы можем расставить сразу, перечислив пилотов по порядку. Следующий (жёлтый) мы смещаем на какое-то число (не меньше чем Количество боёв в туре и не большее чем 1/3 боёв во всех турах).
Почти так, но не совсем... А как в таком случае "стыковые бои" распределятся? (в моей табличке, жирной пунктирной линией отделены туры с учетом стыков). А так, в принципе я так и делал начальное заполнение колонок, только для каждого тура в отдельности с учетом стыков... И если до запучка алгоритма разведения, посмотреть на таблицу, то она как-бы будет в диагональную полосочку - если в первом туре пилот был на Красной, то во втором будет на Желтой, в третьем на Зеленой, и в четвертом на Синей. Если в первом попал на Желтую, то во втором на Зеленую, в третьем на Синюю, и в четвертом - на Красную...
Потом, первым проходом, развожу команды - двигаю пилотов в пределах туров вверх/вниз, чтобы убрать пересечения команд во всех четырех турах. Потом, развожу повторы - так-же двигаю вверх/вниз пилотов в своих колонках, естественно, что-бы не вылезти за границы туров - с учетом стыков. Например, в первом туре красную позицию можно сдвинуть в пределах строк с первой по седьмую, желтую-синюю - в пределах строк с первой по шестую. И далее в том-же стиле. После отработки всех этих алгоритмов, пилоты должны остаться в пределах туров, куда изначально попали, по максимуму разойтись от повторов и пересечения со своими однокомандниками...

PS Там в программе самая нижняя кнопочка "Произвести жеребьевку(случ. перемешать каждый тур)" пока не доделан алгоритм, я только вчера ее начал делать, как раз призвана уйти от "диагональных полос", каждый тур заполняю случайным порядком, ориентируясь только на цвета лент(чтобы каждый не более одного раза был на одной ленте), а потом разводить теми-же процедурами от повторов и пересечений... Думаю, в таком варианте больше будет случайных комбинаций...
28.09.2015 16:08
Shift
 
Если я правильно понял, то стыковой бой это например 7 (красный участник в 1 туре, а остальные во 2 туре).
В таком случае распределение происходит само собой. Например для 25 это будет так:
Код:
К - Ж - З
1 - 20 - 13
2 - 21 - 14
3 - 22 - 15
4 - 23 - 16
5 - 24 - 17
6 - 25 - 18
7- 1 - 19
8 - 2 - 20
9 - 3 - 21
10 - 4 - 22
11 - 5 - 23
12 - 6 - 24
13 - 7 - 25
14 - 8 - 1
15 - 9 - 2
16 - 10 - 3
17 - 11 - 4
18 - 12 - 5
19 - 13 - 6
20 - 14 - 7
21 - 15 - 8
22 - 16 - 9
23 - 17 - 10
24 - 18 - 11
25 - 19 - 12
За счет того что смещение желтых относительно красных не равно смещению зеленых относительно желтых, а так-же потому, что эти смещения не меньше количества боев в одном туре, как раз и получается что каждый из участников поучаствовал в 3-х турах и в 3-х цветах. Остается только расставить последний цвет.
28.09.2015 22:27
MWWRuza
 
Вообще, интересный подход... Надо попробовать сделать рабочий вариант по такому принципу... Но, это только расстановка начальной таблицы, потом, придется все равно переставлять пилотов внутри туров, чтобы развести со "своими" членами команд... И кроме того, даже в начальной таблице четвертую(синюю) колонку тоже придется заполнять подбором - "кто подойдет", а вариантов может и не быть... Вобщем, есть над чем подумать...
Я до этого заполнял по такому принципу:
Цитата:
01 - 02 - 03 - 04
05 - 06 - 07 - 08
09 - 10 - 11 - 12
13 - 14 - 15 - 16
17 - 18 - 19 - 20
21 - 22 - 23 - 24
25 - 01 - 02 - 03 - стык
04 - 05 - 06 - 07
08 - 09 - 10 - 11
12 - 13 - 14 - 15
16 - 17 - 18 - 19
20 - 21 - 22 - 23
24 - 25 - 01 - 02 - стык
03 - 04 - 05 - 06
07 - 08 - 09 - 10
11 - 12 - 13 - 14
15 - 16 - 17 - 18
19 - 20 - 21 - 22
23 - 24 - 25 - 01 - стык
02 - 03 - 04 - 05
06 - 07 - 08 - 09
10 - 11 - 12 - 13
14 - 15 - 16 - 17
18 - 19 - 20 - 21
22 - 23 - 24 - 25
Немного другой подход, надо попробовать по Вашему, может и лучше получится...


Опции темы


Часовой пояс GMT +3, время: 20:33.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.