Tôi đã được đưa ra thuật toán này để giúp tôi tạo một danh sách lịch thi đấu trong SQL, nhưng áp dụng nó như là mã SQL, tôi không có ý tưởng làm thế nào để làm. Có cách ai đó có thể hướng dẫn tôi về cách áp dụng nó với mã không?Làm thế nào để mã hóa một thuật toán toán học nhất định
Dưới đây là sơ đồ bảng của tôi và dưới đó là các thuật toán:
League:
[LeagueID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[LeagueName] VARCHAR(30) UNIQUE
Đội bóng:
[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)
Fixture:
[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)
Thuật toán:
Cho phép chúng tôi dịch các thuật toán, được gọi là round robin scheduling, trong điều khoản của một danh sách có thứ l
của đội N (tương ứng với N-1 đa giác đỉnh + trung tâm đa giác):
l
định nghĩa cố định bằng cách chơi nhóm đầu tiên từ danh sách so với người cuối cùng, nhóm thứ hai so với đội đầu tiên trước, v.v.
Tức là, đối với0 ≤ x < N
, bạn chơi độil[x]
với độil[N-1-x]
.Để tạo bộ đồ đạc tiếp theo, bạn xoay các thành phần đầu tiên của danh sách
N-1
.
Đó làl = l[1] + l[2] + ... + l[N-2] + l[0] + l[N-1]
Khi bạn đã thực hiện đầy đủ các
N-1
quay, làm điều đó một lần nữa nhưng trao đổi nhà và sân khách đội: chơi độil[N-1-x]
vs độil[x]
thay vì ngược lại.
Nếu bạn bắt đầu với danh sách số lượng đặt hàng 0..N-1
sau đó tại vòng i
danh sách là: l = [(i + 0) % (N-1)] + [(i + 1) % (N-1)] + ... + [(i + N-2) % (N-1)] + [N-1]
Đó là, đồ đạc đang ở vòng i
:
i
vsN-1
- Đối
0 < x < (N-1)/2
,(x + i) % (N-1)
vs(N-1 - x + i) % (N-1)
Bây giờ có một trick, như này chỉ hoạt động cho số chẵn. Nếu không, đội cuối cùng luôn chơi (đối đầu với đội i
ở vòng i
) trong khi mỗi vòng tự nhiên có một đội không thể chơi. Điều đó có nghĩa là đội 4 chơi một trận đấu nhiều hơn các đội khác.
Để giải quyết việc này, chúng tôi thêm một đội hình nộm, như vậy cho 5 đội chúng tôi có N = 6
, và ở vòng i
:
i
vs5
(đội dummy)(i + 1) % 4
vs(4 + i) % 4
(i + 2) % 4
vs(3 + i) % 4
Bây giờ bạn biết điều này, bạn có thể tạo ra một hàm sẽ cung cấp cho bạn đồ đạc dựa trên số vòng. Nó nên đầu ra như sau:
vòng 0: 0 nghỉ, 1 vs 4, 2 vs 3
vòng 1: 1 nghỉ, 2 vs 0, 3 vs 4
vòng 2: 2 nghỉ, 3 vs 1, 4 vs 0
vòng 3: 3 nghỉ, 4 vs 2, 0 vs 1
vòng 4: 4 nghỉ, 0 vs 3, 1 vs 2
Lưu ý rằng thay vì i
trong các công thức x + i
và N-1 - x + i
bạn có thể sử dụng bất kỳ số nào nhiều m * i
(vì vậy x + m * i
và N-1 - x + m * i
) miễn là m
và N-1
và relatively prime. Ở đây N - 1 = 5
là số nguyên tố, vì vậy bạn có thể sử dụng bất kỳ số m
nào bạn muốn.
UPDATE:
Theo yêu cầu dưới đây là ngươi kiểm tra dữ liệu cho đầu bảng League và thứ hai bảng đội (phù hợp với các cột schema bảng theo thứ tự)
League:
1, 'English Premiership'
2, 'English Division 1'
Đội:
1, 'BCN', 'FC Barcelona', 1
2, 'MAD', 'Real Madrid', 1
3, 'ATH', 'Athletico Madrid', 1
4, 'ESP', 'Espanyol', 1
5, 'MAN', 'Manchester United', 2
6, 'BOL', 'Bolton', 2
7, 'CHE', 'Chelsea', 2
8, 'ARS', 'Arsenal', 2
Các đội chơi mỗi gia đình khác và đi và chỉ có thể thi đấu với các đội người trong cùng một giải đấu (do đó LeagueIDs khác nhau)
Các trận đấu sẽ như thế này cho mỗi vòng:
League 1:
Round 1- 01/05/2016:
1v4, 2v3
Round 2- 08/05/2016:
1v2, 3v4
Round 3- 15/05/2016:
3v1, 4v2
Round 4- 22/05/2016:
4v1, 3v2
Round 5- 29/05/2016:
2v1, 4v3
Round 6- 05/06/2016:
1v3, 2v4
League 2:
Round 1- 01/05/2016:
5v8, 6v7
Round 2- 08/05/2016:
5v6, 7v8
Round 3- 15/05/2016:
3v1, 4v2
Round 4- 22/05/2016:
8v5, 7v6
Round 5- 29/05/2016:
6v5, 8v7
Round 6- 05/06/2016:
5v7, 6v8
- giải số là
- số Round 'LeagueID' là 'WeekNumber'
- ngày là 'ngày thi đấu'
- số đội nhà là 'HomeTeamID'
- Số đội khách là 'AwayTeamID'
Tất cả điều này sẽ được đưa vào bảng 'Lịch thi đấu'.
Bây giờ, đó là cách câu hỏi nên được hỏi. –
chỉ liên kết với bạn câu hỏi liên quan trước đó: http://stackoverflow.com/questions/37610060/creating-a-fixture-list-logic – Tanner
@Tanner Cool, vâng vấn đề với cách tiếp cận trước đó là mặc dù nó hiển thị chính xác các nhóm , nó gặp sự cố khi hiển thị số tuần chính xác cho mỗi vòng kết quả phù hợp. Bằng cách này, sử dụng thuật toán sẽ giúp giải quyết vấn đề tuần nhưng nó là một tuyến hoàn toàn mới và nhiều hơn nữa toán học –