2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 генерация таблицы игр чемпионата
Сообщение15.04.2008, 21:17 
здраствуйте...

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

например, может получиться такая таблица
1 2 3 4 5 6
------------------
1 | 2 1 6 5 4 3
2 | 3 5 1 6 2 4
3 | 6 4 5 2 3 1
4 | 4 3 2 1 6 5
5 | 5 6 4 3 1 2

то есть в результате каждая команда сыграет с каждой по одному разу...

на самом деле вся задача сводится к построению матрицы размером (N-1)*N таким образом, чтобы числа в столбцах и строках не повторялись, а-ля магический квадрат, но плюс к этому, добавляется ещё одно условие - каждому элементу k, находящемуся на позиции [i, j] должен соответствовать элемент j, находящийся на позиции [i, k], чтобы каманды "играли друг с другом" в каждом туре..

я написал алгоритм, который действует следующим образом:
1. обнуляем матрицу

2. проходим всю матрицу по строкам

3. если элемент [i, j] равен нулю, то составляем список команд, с которыми эта команда ещё не играла(то есть этого элемента не было в столбце j) и которые ещё не играли в этом туре(строка i).

4. случайным образом выбираем из этого списка одну команду k и записываем число k ячейку [i, j] и соответственно j в ячейку [i, k]

вроде бы всё просто, однако порой вознивает ситуация, когда "не из чего выбирать", то есть те команды, с которыми текущая команда ещё не играла, уже участвуют в данном туре

И вот тут то я и застрял... мне кажется что должно быть какоето решение проще и "красивее" из комбинаторики или теории множеств, но, увы, я в этом не силён... может мне кто подскажет как это сделать?

 
 
 
 
Сообщение15.04.2008, 22:15 
такая таблица пойдёт?

N, N-1, N-2, ...., 1
N-1, N-2, ..., 1, N
N-2, N-3, ... ,1, N, N-1
.....

 
 
 
 
Сообщение15.04.2008, 22:45 
мне ж надо чтобы таблица случайным образом формировалась...

 
 
 
 
Сообщение15.04.2008, 22:49 
Аватара пользователя
Ну так и перенумеруйте потом всех случайным образом. Или ещё строки попереставлять?

 
 
 
 
Сообщение15.04.2008, 23:08 
помоему это не совсем то... во-первых у меня в j-ом столбце не может быть числа j.. во-вторых, как я писал в самом начале, если в клетке [i, j] стоит число k, то в клетке [i, k] должно быть число j... слишком "простой" метод помоему..

 
 
 
 
Сообщение15.04.2008, 23:21 
а как именно случайно должна быть устроена таблица? все таблицы с такими свойствами равновероятны?
Мне кажется удачным такой способ: построить таблицу, где строки и стобцы команды, а на пересечении стоит номер тура. Теперь требования простые: матрица симметричная, на главной диагонали у нее ничего нет(ставь нули), в строке - какая-то перестановка чисел от 1 до 4(в столбце, соответственно, отраженная). как моделировать такую таблицу вроде понятно. как из нее пересчитывать то, что Вам нужно, вроде тоже. или я все не так понял?

 
 
 
 
Сообщение15.04.2008, 23:47 
в этом случае в каждой клетке нужно будет искать общие "свободные" туры, то есть туры, в которых пересекающиеся команды ещё не играли и выбрать случайным образом один из этих туров... но может возникнуть ситуация, когда таких туров нету, то есть ситуация аналогичная моему варианту

 
 
 
 
Сообщение15.04.2008, 23:59 
krinart
Либо я чего-то не понимаю, либо Вы. То, что матрица симметричная не спасет? Заполнив, скажем, первую строку, мы автоматически заполним и первый столбец. таким образом при построении первой строки у нас 4! возможностей, при заполнении второй - 3!, третьей -2! и четвертая заполнится единственным образом. Если я что-то не то говорю, приведите, пожалуйста пример, когда на каком-то шаге у нас кроллизия.
Сомнительно только, будут ли итоговые матрицы распределены так, как Вам надо, но это уже другой вопрос

 
 
 
 
Сообщение16.04.2008, 00:16 
я, к сожалению, в теории не силён, могу только программы писать, но кажется Вы меня убедили что это рабочий вариант... я попробую и отчитаюсь... огромное спасибо

 
 
 
 
Сообщение16.04.2008, 00:18 
пожалуйста. Я старался:)

 
 
 
 
Сообщение16.04.2008, 00:40 
krinart писал(а):
помоему это не совсем то... во-первых у меня в j-ом столбце не может быть числа j.. во-вторых, как я писал в самом начале, если в клетке [i, j] стоит число k, то в клетке [i, k] должно быть число j... слишком "простой" метод помоему..

Кстати, такое возможно только при чётных N

 
 
 
 
Сообщение16.04.2008, 00:57 
написал я программу, в результате всё равно вышла та ошибка про которую я говорил.. приведу полученную таблицу


0 1 3 2 5 0
1 0 2 3 4 0
3 2 0 4 1 0
2 3 4 0 0 0
5 4 1 0 0 0
0 0 0 0 0 0

ошибка произошла на пересечении команд 5(строка) и 4(столбец), когда у них нету общего свободного тура

Добавлено спустя 2 минуты 21 секунду:

маткиб писал(а):
Кстати, такое возможно только при чётных N


естественно, мне другого и не нужно

 
 
 
 
Сообщение16.04.2008, 01:07 
krinart
последний столбец - он вообще не нужен, верно?
Мне думается, что если команд 5, то тура номер 5 нет.
тогда в первой строчке - баг
там должно быть 01324. и дальше поехало. так чтоя настаиваю на своем:)

 
 
 
 
Сообщение16.04.2008, 01:14 
команд 6.. состветсвенно туров 5, в таблице нет ячейки со значением больше 5

Добавлено спустя 47 секунд:

последняя строка не успела заполнится так как произошла ошибка

Добавлено спустя 5 минут 31 секунду:

а так как не заполнилась строка, поэтому и столбец пуст

 
 
 
 
Сообщение16.04.2008, 01:55 
krinart, Вам это подойдёт?

 
 
 [ Сообщений: 22 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group