2016-06-08 2 views
0

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

  • Есть 3 лиг с 5 команд в лиге
  • Каждая команда играет друг с другом дома и на выезде в пределах своей собственной лиги
  • каждого набор игр играют в круглом/неделе (например, круглые и спичек отображается в URL)

я настроил все команды и лиги, просто требует помощи светильники и ранее я использовал UNION и CROSS JOIN между таблицей «Team» и Таблица «Команда» (для определения домашних и гостевых команд), но теперь я хочу начать с нуля с помощью этого алгоритма. Я не хочу использовать вложенные циклы, я думаю, что это можно сделать с помощью набора базы, но просто требуется больше опыта разработчика, чтобы посмотреть, как они это сделают, и я считаю, что этот алгоритм может помочь.

Вот ссылка алгоритма: http://www.mathscareers.org.uk/article/football-fixtures-whats-score/

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

лига:

[LeagueID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [LeagueName] VARCHAR(30) UNIQUE 

Команда:

[TeamID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
[TeamAbbreviation] CHAR(3) UNIQUE, 
[TeamName] VARCHAR(50) UNIQUE, 
[LeagueID] TINYINT CONSTRAINT FK_Team_League FOREIGN KEY REFERENCES League(LeagueID) 

Светильник:

[FixtureID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
[WeekNumber] INT NOT NULL, 
[FixtureDate] DATE NULL, 
[HomeTeamID] TINYINT NULL, 
[AwayTeamID] TINYINT NULL, 
[LeagueID] TINYINT CONSTRAINT FK_Fixture_League FOREIGN KEY REFERENCES League(LeagueID) 

Надеюсь, что это помогает, ниже - существующая часть кода/логики, которую я использовал, если это не сработало, если вам нужна какая-либо ссылка (это не удавалось, потому что она проводила неделю 1-11 для домашних игр всей команды, что означает обратные крепления команды, когда они были в отъезде, никогда не были правильными, поскольку они будут играть в игры на той же неделе, что и их домашние игры). Вот почему я хочу изменить логику, чтобы следовать этому алгоритму многоугольника, но не знаю, как применить его с кодом.

CREATE PROCEDURE [dbo].[Fixture_Insert] 
@StartFixtureWeek DATE 

AS 
SET NOCOUNT ON 
BEGIN 

INSERT INTO dbo.Fixture (WeekNumber, HomeTeamID, AwayTeamID, FixtureDate, LeagueID) 
SELECT 
    ROW_NUMBER() OVER (PARTITION BY h.teamID ORDER BY h.TeamID, a.TeamID, h.LeagueID) AS WeekNumber, 
    h.TeamID, 
    a.TeamID, 
    DATEADD(day,(ROW_NUMBER() OVER (ORDER BY h.LeagueID)-1)*7,@StartFixtureWeek) AS FixtureWeek, 
    h.LeagueID 
FROM dbo.Team h 
CROSS JOIN dbo.Team a 
WHERE h.TeamID <> a.TeamID 
AND h.LeagueID = a.LeagueID 

END 

ответ

1

Позволяет нам перевести алгоритм, называемый round robin scheduling, в терминах упорядоченного списка l из N команд (которые соответствуют N-1 вершин многоугольника + многоугольник центр):

  • l Определяет при игре в первой команде из списка против последнего, второго по сравнению с первым и последним и т. д.
    То есть для 0 ≤ x < N, вы играете в команду l[x] против команды l[N-1-x].

  • Чтобы создать следующий набор светильников, вы поворачиваете N-1 первые элементы списка.
    Это l = l[1] + l[2] + ... + l[N-2] + l[0] + l[N-1]

  • После того, как вы сделали полный набор N-1 вращений, сделать это снова, но обмен дома и на выезде команды: играть команда l[N-1-x] против команды l[x] вместо противоположного.

Если начать с численно упорядоченный список 0..N-1 затем в круглых i список:
l = [(i + 0) % (N-1)] + [(i + 1) % (N-1)] + ... + [(i + N-2) % (N-1)] + [N-1]

То есть светильники на круглом i:

  • i против N-1
  • Для 0 < x < (N-1)/2, (x + i) % (N-1) против (N-1 - x + i) % (N-1)

Теперь есть трюк, так как это работает только для четных чисел. Иначе последняя команда всегда играет (против команды i в раунде i), тогда как в каждом раунде, естественно, есть одна команда, которая не может играть. Это означало бы, что команда 4 играет еще одну игру, чем другие команды.

Чтобы решить эту проблему, мы добавить фиктивную команду, так для 5 команд мы имеем N = 6, и на круглом i:

  • i против 5 (фиктивная команда)
  • (i + 1) % 4 против (4 + i) % 4
  • (i + 2) % 4 vs (3 + i) % 4

Теперь, когда вы это знаете, вы можете сгенерировать функцию, которая даст вам светильники на основе круглого номера. Он должен вывести следующее:

раунд 0: 0 отдыхает, 1 против 4, 2 против 3
раунд 1: 1 остатки, 2 против 0, 3 против 4
раунд 2: 2 остатки, 3 против 1, 4 против 0
раунд 3: 3 остатков, 4 против 2, 0 против 1
раунд 4: 4 остатков, 0 против 3, 1 против 2


Обратите внимание, что вместо того, чтобы i в формулы x + i и N-1 - x + i вы можете использовать любое количество m * i (так x + m * i и N-1 - x + m * i) до тех пор, пока m и N-1 и relatively prime. Здесь N - 1 = 5 является простым, поэтому вы можете использовать любые m, которые вы хотите.

+0

Спасибо, cimbali, что имеет смысл логически. Проблема, которую я буду иметь, это кодирование, поэтому я хотел бы знать, не возражаете ли вы, если мы сможем это пройти пополам (возможно, используя чат), чтобы я мог видеть и понимать, что делать? –

+0

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

+0

@carlBrooks Извините, у меня нет большого количества времени прямо сейчас (плюс я не могу найти вас в чате). Попробуйте начать с написания процедуры, которая возвращает (или вставляет) светильники всего за один раунд, учитывая номер раунда.У вас есть все формулы для этого. – Cimbali