使用数学方法创建夹具列表

时间:2016-06-08 22:04:31

标签: sql sql-server database math

我一直在做一些研究,并研究了这种多边形算法的数学技术,以帮助创建一个五人联盟的固定装置。我希望这可以使用一套基本技术来实现。我现在获得的是为具有以下要求的五人联赛创建的夹具列表:

  • 每个联盟有3个联赛,每队5支队伍
  • 每支球队在自己的联赛中主场和客场比赛
  • 每组游戏都在一周/周内播放(圆形示例和网址中显示的匹配)

我已经设置了所有的球队和联赛,只需要帮助我们以及之前我使用过UNION和队友之间的交叉联赛。表和'团队'表(确定主队和客队)但现在我想从头开始使用这个算法。我不想使用嵌套循环,我认为它可以通过set base完成,但只需要一个更有经验的开发人员来看看他们将如何做到这一点,我相信这个算法可以提供帮助。

以下是算法的链接: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周,意味着一个团队&#39当他们离开时,他们的反向装置永远不会正确,因为他们将在他们的主场比赛的同一周玩游戏)。这就是为什么我想改变遵循该多边形算法的逻辑,但不知道如何将其应用于代码。

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 个答案:

答案 0 :(得分:1)

让我们根据N队的有序列表l(对应于N-1多边形顶点+多边形中心)翻译名为round robin scheduling的算法:

  • 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 vs N-1
  • 对于0 < x < (N-1) / 2 (x + i) % (N-1) vs (N-1 - x + i) % (N-1)

现在有一个技巧,因为这个仅适用于偶数。否则最后一支球队总是在第i轮比赛中对阵球队i,而自然每一轮有一支队伍无法上场。这意味着第4队比其他球队多出一场比赛。

要解决此问题,我们添加虚拟团队,以便我们拥有N = 6和第i轮的5个团队:

  • i vs 5(虚拟团队)
  • (i + 1) % 4 vs (4 + i) % 4
  • (i + 2) % 4 vs (3 + i) % 4

现在你已经知道了,你可以生成一个函数,它会根据整数为你提供灯具。它应该输出以下内容:

  第0轮比赛0:0比1,比4比2比2比3   1:1轮比赛,2比0比3比3比4   第2轮:2轮比赛,3比1比4比0比0   第3轮:3轮比赛,4比2比0比1比赛   4:4轮比赛,0比3比1比2比赛2比赛

请注意,公式ix + i代替N-1 - x + i,您可以使用任意多个m * i(因此x + m * iN-1 - x + m * i)只要mN-1以及relatively prime。此处N - 1 = 5是素数,因此您可以使用任何您想要的m