2016-06-08 49 views
0

我一直在做一些研究,並看看這種數學算法的多邊形算法,以幫助爲五個側面聯盟創建裝置。我希望通過一套基礎技術來實現這一點。我收購只是現在是五邊聯賽下列要求要創建的賽程表:使用數學方法創建夾具列表

  • 有3輪聯賽,每個聯賽
  • 每個小組5支球隊中起着對方主場和客場自己的聯賽中
  • 每一組的比賽中(在URL中顯示的示例輪和比賽的)圓/周

我已經設置所有的球隊和聯賽中出場,只是需要幫助夾具和之前我使用過UNION和'Team'表和'CROSS JOIN' '團隊'表(以確定主隊和客隊),但現在我想從頭開始使用這種算法。我不想使用嵌套循環,我認爲它可以通過集合基礎完成,但只需要更多的開發人員來看看他們將如何做,我相信這個算法可以提供幫助。

這裏是算法的鏈接:http://www.mathscareers.org.uk/article/football-fixtures-whats-score/的聯賽,球隊和夾具表

禰架構如下:

聯賽:

[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,在N-團隊的有序列表l(對應於N-1多邊形頂點+多邊形中心)的術語:

  • l定義通過打出最後一場比賽中的第一陣容,第二場比賽和第一場比賽之後的比賽等等。
    也就是說,對於0 ≤ x < N,你打球隊l[x] vs隊。

  • 要生成下一組固定裝置,請旋轉列表的第一個元素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 VS N-1
  • 對於0 < x < (N-1)/2(x + i) % (N-1) VS (N-1 - x + i) % (N-1)

現在有一個小竅門,因爲這僅適用於偶數。否則,最後一支球隊總是上場(對陣球隊i,輪次爲i),而每輪比賽自然會有一支球隊無法比賽。這意味着第4隊比其他球隊多打一場比賽。

爲了解決這個問題,我們添加一個虛擬團隊,所以5支球隊,我們有N = 6,並在第二輪i

  • i VS 5(虛擬團隊)
  • (i + 1) % 4 VS (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 + iN-1 - x + i只要mN-1relatively prime,您可以使用任何多個m * i(so x + m * iN-1 - x + m * i)。這裏N - 1 = 5是素數,所以你可以使用任何你想要的m

+0

謝謝cimbali,這在邏輯上合理。我將要面對的問題是編碼,所以我想知道如果你不介意我們可以一點一點地通過它(也許使用聊天),所以我可以看到並理解該怎麼做? –

+0

已標記的答案,但沒有編碼它,如所述,如果你不介意與我通過如何編碼它,請給我評論。我會非常活躍,所以我知道發生了什麼 –

+0

@carlBrooks對不起,我現在沒有太多時間了(加上聊天中找不到你)。試着從編寫一個返回(或插入)燈具的過程開始,只需一輪,給定一個整數。你有所有的公式來做到這一點。 – Cimbali