2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Генерация формулы для рассадки игроков
Сообщение28.04.2017, 14:38 


28/04/17
4
У нас есть n столов, за которыми помещаются n игроков одновременно.
Необходимо создать формулу рассадки n*n игроков за n столами на максимальное количество раундов так, в конечном итоге каждый игрок сыграет с другим игроком не больше одного раза.

Я пробовал расписывать на бумажке, получалось примерно следующее.
Для $n=3$
123 456 789
159 483 726
168 429 735
147 258 369
Так же сформировал для $n=4$
1234 vbcd абвг 6789
17вd v28г аb39 6бc4
1б8b v4в9 а2с7 63гd
1v6a 2бd9 3cв8 4bг7
1сг9 2bв6 3vб7 4da8

Но я не могу вывести общую формулу, мне необходима такая рассадка для 10 игроков для 10 столов. Интуитивно кажется, что, согласно условиям, рассадку можно сформировать для 11 игр, но я не знаю, как правильно подходить к решению этой задачи.

Мои мысли и попытки решения:
1)Думал о том, что мы каждого игркоа на новый раунд сдвигаем на какое-то количество мест. И нам необходимо, чтобы ни одна пара игроков не играла дважды, поэтому можно создать что-то вроде маски сдвигов по примеру[0, 1, 2 ,3], которую применять к игрокам каждого стола, и формировать эту маску на каждый раунд так, чтобы суммарный сдвиг(маршрут) игроков, которые выходят из одной точки, не равнялся, потому что они тогда "сойдутся" за одним столом. Но этого недостаточно, в рассадке на троих возможна комбинация 147 258 369, сформированная путём группировки игроков по "разрядам", а не сдвигом. Получается, игрок перемещается не только по столам, но и по "разрядам", то есть маску надо формировать двумерную, и в этот момент это стало слишком сложно для меня, к тому же вполне вероятно, что это тупиковый вариант.

2) Пробовал написать программу, которая формирует такие столы тупым перебором, но у меня проблема с алгоритмом. В случае нужны, код программы на С++ могу предоставить.
Я писал так: каждый раунд мы выбираем из оставшегося пула игроков того, кто ещё не "знаком" ни с кем из игроков, уже набранных для данного стола, когда укомплектовали - идём к следующему. Столкнулся с тем, что уже на 3 раунде для случая n=3 можно начать укомплектовывать первые два стола так, что на третьем столе "пасьянс" уже не сойдётся, так как все оставшиеся игроки будут друг с другом знакомы. А на этапе формирования первого стола у нас недостаточно информации для того чтобы заглянуть в "остаток" для третьего стола. Возможно нужно формировать что-то вроде дерева решений, формировать список игроков подходящих для первого стола, и "смотреть", что будет если взять каждого конкретного игрока из списка, но это становится уже сложнее, и я тут решил попросить помощи у вас. Так же в голове крутится мысль попробовать использовать Prolog, так как все эти возвраты и проверки логических правил в духе языка, правда моё знакомство с прологом весьма шапочное, интересно послушать ваш совет.

Вполне возможно, эта задача решается по щелчку пальцев, я просто туповат.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение28.04.2017, 15:02 
Заслуженный участник


25/02/11
1786
Идея: представить элементы как квадратную матрицу. Одно решение – горизонтали, еще одно – вертикали. А затем попробовать циклически переставлять строки начиная со второй и брать столбцы получившихся матриц. В надежде, что удастся подобрать простые формулы для длин сдвигов, чтобы получить все оставшиеся $n-1$ вариантов. Скажем, чтобы получить 3й вариант, сдвинем вторую строку циклически на 1, третью на 2 и т.д.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение28.04.2017, 15:23 


28/04/17
4
Vince Diesel в сообщении #1212951 писал(а):
Идея: представить элементы как квадратную матрицу. Одно решение – горизонтали, еще одно – вертикали. А затем попробовать циклически переставлять строки начиная со второй и брать столбцы получившихся матриц. В надежде, что удастся подобрать простые формулы для длин сдвигов, чтобы получить все оставшиеся $n-1$ вариантов. Скажем, чтобы получить 3й вариант, сдвинем вторую строку циклически на 1, третью на 2 и т.д.

Можете, пожалуйста, переформулировать, я не совсем понял идею? Начиная с "еще одно – вертикали". Можете продемонстрировать 1 шаг вашего алгоритма?

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение28.04.2017, 15:34 
Заслуженный участник


25/02/11
1786
Возьмем $n=3$. Матрица:
$$\left(
\begin{array}{ccc}
 1 & 2 & 3 \\
 4 & 5 & 6 \\
 7 & 8 & 9 \\
\end{array}
\right)
$$
Одно решение $\{\{1, 2, 3\}, \{4, 5, 6\}, \{7, 8, 9\}\}$, второе $\{\{1, 4, 7\}, \{2, 5, 8\}, \{3, 6, 9\}\}$. Теперь сдвинем вторую строку на 1, третью на 2, получим
$$
\left(
\begin{array}{ccc}
 1 & 2 & 3 \\
 6 & 4 & 5 \\
 8 & 9 & 7 \\
\end{array}
\right)
$$
Третье решение — $\{\{1, 6, 8\}, \{2, 4, 9\}, \{3, 5, 7\}\}$.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение30.04.2017, 20:10 
Заслуженный участник


26/05/14
981
Эта задача - близкая родственница "Девушек из пансиона Киркмана" (Жак Арсак, Программирование игр и головомок). Автор признаётся что не построил никакой теории, зато придумал эвристики ускоряющие перебор.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение01.05.2017, 18:31 
Заслуженный участник


26/05/14
981
Ещё одно рассмотрение этой задачи можно найти на странице 309 книги Уолтера Уильяма Роуза Болла, Математические эссе и развлечения.
Будьте осторожны, сложная математика.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение01.05.2017, 19:50 
Заслуженный участник


10/01/16
2315
MayRiv
Нда, ну Вы попали....
Подсчет числа ребер-знакомств (пребывание за одним столом) показывает, что уж если мы сумели организовать $n+1$ тур, то каждый сыграет с каждым, причем ровно один раз. Эт что-то напоминает....
Давайте считать игроков точками, а столы в каждом туре - прямыми. Тогда: через каждую пару точек проходит ровно одна прямая. А любые две прямые... Ан нет., не пересекаются. Ну тогда так: пусть в каждом туре есть еще распорядитель тура, и в процессе тура пусть он посидит за каждым из столов - познакомится с игроками (а после турнира все распорядители соберутся за круглым столом, и тоже познакомятся. Распорядителеей тоже обзовем точками, а круглый стол - прямой). Вот теперь стало все хорошо:
точек: $100+11 = 111$
прямых: прямых-столотуров - $110$, да еще прямая- круглый_стол
через любые две точки проходит ровно одна прямая (для пары игроков - тот столотур, в котором они встретились; для игрока и ТУРА - тот столотур в туре, за которым сидел игрок в туре, для двух туров - круглый_стол)
любые две прямые имеют единственную общую точку (Проверить!)
на каждой прямой - ровно $10+1$ точка, через каждую точку - ровно $10+1$ прямых (Проверить!)
Такая конфигурация прямых-точек называется геометрия конечного порядка (а число 10 -и есть ее порядок)
Можно погуглить по этим словам - задача эта известна. Чтото хорошо известно (типа, для любого нечетного $n$ такая геометрия есть, для $n=6$ -- ее нет . Вроде бы так). А вот для $n=10$ - в те времена, когда я услышал про эту задачу (т.е., очень давно) , это была открытая проблема. Для одного моего студента эта задача стала задачей-бзик: сколько сил он на нее угробил - уму непостижимо. Но...

-- 01.05.2017, 21:58 --

Про общую формулу: вроде бы, для нечетных $n$ есть циклические геометрии, которые хорошо устроены. А для четных --увы..

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение01.05.2017, 22:27 
Заслуженный участник


26/05/14
981
DeBill в сообщении #1213505 писал(а):
MayRiv
Нда, ну Вы попали....

Как вы думаете, имеет смысл искать решение на компьютере?

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение02.05.2017, 01:13 
Заслуженный участник


10/01/16
2315
slavav
Ну, можно попробовать искать циклические геометрии.
Они устроены так:
в геометрии должно быть $N = n^2+n+1$ точек, и столько же прямых.
Вся геометрия задается матрицей инцедентности:
если $i$-я точка лежит на $j-$й прямой, то в матрице на этом месте пишем 1, иначе - 0.
Так вот, в циклической геометрии, все строки (да и столбцы тоже) получаются из первой (го) сдвигами.
Так что, надо в первой строке (длины 111) отметить 11 единичек, так, чтобы при любом сдвиге (циклическом), полученная строка имела ровно одну общую единичку с исходной. Так что, проверка требует $111^2$ операций, и надо проверить $C^{11}_{111}$ вариантов. Грубо, всего требуется что-то порядка $10^{33}$ операций. Многовато, однако...
Но все же надо посмотреть в сети: мобыть, за последние 10-15 лет был прогресс в этой задаче, и отсутствие (в которое я верю) циклических десятого порядка таки установили.

-- 02.05.2017, 03:25 --

А, ну вот, даже в ВИКИ есть: "несуществование конечной геометрии порядка 10 доказано с помощью компьютера в 1989 году". Так что моя информация сильно устарела (давно не обновлялся....)

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение03.05.2017, 16:59 


28/04/17
4
Цитата:
А, ну вот, даже в ВИКИ есть: "несуществование конечной геометрии порядка 10 доказано с помощью компьютера в 1989 году". Так что моя информация сильно устарела (давно не обновлялся....)

То есть задача эта не решается?

Пробую найти решение задачи с помощью брутфорса, написал программу, которая строит дерево решений и брутфорсит варианты, к сожалению, начиная с варианта на 9 игроков ресурсов компьютера не хватает для вычислений, может ли кто-то дать совет по оптимизации? код тут: https://github.com/MayRiv/Placing/blob/ ... h/main.cpp

-- 03.05.2017, 18:04 --

К слову, если сделать послабление, и разрешить людям играть до двух раз с другими людьми, то возможно решить задачу проще?

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение03.05.2017, 17:23 
Заслуженный участник


26/05/14
981
Первое что бросается в глаза - вы передаёте сложные структуры по значению. То есть они копируются при каждом вызове функции. Это так было предусмотрено?

-- 03.05.2017, 17:31 --

Второе - вы не удаляете экземпляры структуры Node.

-- 03.05.2017, 17:34 --

Третье - структура set<Node *> используется на по назначению. vector<Node *> будет работать быстрее и тратить меньше памяти.

-- 03.05.2017, 17:38 --

Четвёртое - верхний уровень вашего алгоритма - жадный. Даже если бы решение было, ваш алгоритм его может пропустить.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение03.05.2017, 21:08 
Заслуженный участник


10/01/16
2315
MayRiv в сообщении #1213902 писал(а):
То есть задача эта не решается?

Как это - не решается. Она решена: такой рассадки игроков (для 10) нет.
Для случаев, когда $n$ - простое (или степень простого) рассадка есть, и - "красивая".
Для $n$, не представимого в виде суммы двух квадратов, и дающего при делении на 4 остаток 1 или 2, рассадки нет.
Т.е., для 3,4,5,7,8,9,11,13,... ответ: есть
Для 6 и 10 : нет
Для 12: неизвестно.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение03.05.2017, 22:00 
Заслуженный участник
Аватара пользователя


01/09/13
4321
DeBill в сообщении #1213948 писал(а):
Она решена: такой рассадки игроков (для 10) нет.

Вроде бы вопрос был про максимально возможное количество раундов - т.е. не требовалось что бы все со всеми сыграли...

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение04.05.2017, 14:09 


28/04/17
4
Geen в сообщении #1213952 писал(а):
DeBill в сообщении #1213948 писал(а):
Она решена: такой рассадки игроков (для 10) нет.

Вроде бы вопрос был про максимально возможное количество раундов - т.е. не требовалось что бы все со всеми сыграли...

Верно.

 Профиль  
                  
 
 Re: Генерация формулы для рассадки игроков
Сообщение04.05.2017, 22:07 
Заслуженный участник


10/01/16
2315
MayRiv в сообщении #1214032 писал(а):
Верно.

А, ну да.
Но мне вот что интересно: неужели Ваш алгоритм (перебор, да?) для $n=9$нашел "максимальное" решение (из 10 туров)? А для $n=6$ - показал, что из 7 туров - нет?
Если - да, то это круто!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: confabulez


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group