Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Построение алгоритма жеребьевки, нужна помощь... : Программирование

23.11.2024 3:24


14.09.2015 21:09
Цитата:
OlegON и отсортировать по возрастанию.
По возрастанию чего? Индексов? А смысл... По размерам команд, пробовал, при чем в обе стороны... Результат неудовлетворительный...

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

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

Далее их надо развести по 4-рем стартовым позициям(лентам, летают сразу по 4 пилота!), на 4 тура(в которых каждый должен отлетать по 1 разу), с учетом стыков из-за некратного четырем количества пилотов, развести по возможности от пересечения с членами своей команды, и при этом на протяжении всех 4-х туров, минимизировать повторы участников между собой.
И вот эта вся канитель, в моем варианте построения алгоритма всего этого безобразия, оказывается очень чувствительна к начальному расположению пилотов в списке. От того, как они там расположены, зависит конечный результат - остаток неразведенных повторов. Уловить как должны располагаться пилоты(по какому принципу), мне так и не удалось... Поэтому, как временная мера, для получения наилучшего конечного результата и использовал случайную перетасовку входных данных, отработку алгоритма, сравнение полученного результата с предыдущим сохраненным, и в случае лучшего результата - замена сохраненного результата на лучший.
Это конечно не правильно, но как это решать с точки зрения комбинаторики - х.з., у меня тут полный пробел в знаниях...
27.09.2015 22:21
Если ещё актуально, то попробую поделиться некоторыми соображениями.
Исходя из условий задачи её можно решить (если это вообще возможно) только перебором всех возможных вариантов. Из комбинаторики Количество перестановок = 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
Небольшое дополнение насчет сортировки - можно сортировать участников внутри команды, а так-же сами команды если количество участников в этих командах меньше количеста боёв в одном туре.
28.09.2015 13:53
Спасибо, что нашли время вникнуть в мою проблему!

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

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

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


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


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

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

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

PS Там в программе самая нижняя кнопочка "Произвести жеребьевку(случ. перемешать каждый тур)" пока не доделан алгоритм, я только вчера ее начал делать, как раз призвана уйти от "диагональных полос", каждый тур заполняю случайным порядком, ориентируясь только на цвета лент(чтобы каждый не более одного раза был на одной ленте), а потом разводить теми-же процедурами от повторов и пересечений... Думаю, в таком варианте больше будет случайных комбинаций...
28.09.2015 16:08
Если я правильно понял, то стыковой бой это например 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
Вообще, интересный подход... Надо попробовать сделать рабочий вариант по такому принципу... Но, это только расстановка начальной таблицы, потом, придется все равно переставлять пилотов внутри туров, чтобы развести со "своими" членами команд... И кроме того, даже в начальной таблице четвертую(синюю) колонку тоже придется заполнять подбором - "кто подойдет", а вариантов может и не быть... Вобщем, есть над чем подумать...
Я до этого заполнял по такому принципу:
Цитата:
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, время: 03:24.

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