我一直在做一些研究,并研究了这种多边形算法的数学技术,以帮助创建一个五人联盟的固定装置。我希望这可以使用一套基本技术来实现。我现在获得的是为具有以下要求的五人联赛创建的夹具列表:
我已经设置了所有的球队和联赛,只需要帮助我们以及之前我使用过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
答案 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比赛
请注意,公式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
。