Cần giúp đỡ để xác định một thuật toán lập lịch giải đấu


9

Tôi đang cố gắng để tạo ra một lịch trình giải đấu thể thao. Tôi gặp khó khăn trong việc xác định một thuật toán để giúp tôi điền vào từng vị trí một cách hiệu quả.

Dữ liệu mẫu để xây dựng lịch trình sẽ là:

  1. 10 đội
  2. Mỗi đội chơi với nhau 1 lần (tổng số 45 trò chơi cần thiết)
  3. Mỗi đội chơi không quá 1 lần mỗi ngày
  4. Trong thử nghiệm của tôi, tôi đang sử dụng 9 ngày với 5 vị trí mỗi ngày.

Bảng kết hợp (chứa 45 combo)

ID
Team1ID
Team2ID
bit Được chỉ định

Bảng lịch trình (chứa 45 khe thời gian)

lịch trình về
nhàTeamID
điTeamID
GameDate
GameTime

Ngay bây giờ các quy trình hiện tại của tôi lấp đầy khoảng 90% vị trí còn lại 10% vị trí của tôi trống cho xung đột lịch trình dựa trên các quy tắc ở trên.

Tôi lặp qua bảng lịch trình của mình theo thứ tự ngày / giờ tăng dần.
Khe đầu tiên của tôi có thể là thứ bảy lúc 8 giờ sáng.
Tôi truy vấn danh sách các đội chưa được lên lịch. Sau đó tôi tạo ra một loạt các kết hợp có thể có của các đội đó. Sau đó, tôi sử dụng mảng đó để lấy 1 bản ghi ngẫu nhiên từ bảng kết hợp của mình từ các kết hợp chưa được lên lịch và tôi đặt các nhóm đó vào lịch trình. Sau đó tôi đặt kết hợp đó là sử dụng.

Tôi lặp đi lặp lại nhiều lần và mỗi lần danh sách các đội có sẵn của tôi trở nên nhỏ hơn và kết quả là mảng của tôi cũng nhỏ hơn.

Tôi thấy rằng một số ngày diễn ra tốt đẹp, và vào những ngày khác, 2 đội cuối cùng còn lại của tôi đã chơi trong tuần trước để họ không được thêm vào lịch trình nữa.

Điều duy nhất tôi chưa thử là "thiết lập lại" những ngày xung đột và thử lại lần nữa để xem liệu tôi có nhận được các vị trí tốt hơn không.

Có ai có bất cứ đề nghị?


5
lập lịch thi đấu vòng tròn
kevin cline

kevin cảm ơn quyền của bạn. Tôi có vẻ như ngay bây giờ mảng của tôi bắt đầu tại cùng một vị trí mọi lúc và không có vòng quay nên không có dòng chảy có trật tự để ghép các đội lên.
steve

1
Tôi sử dụng một cách tiếp cận hoàn toàn ngẫu nhiên. Chọn ngẫu nhiên một vị trí và hai đội. Nếu các quy tắc được thỏa mãn thì lên lịch cho trò chơi. Nếu không loại bỏ và thử lại. Tôi đặt giới hạn cho tổng số lần thử và nếu đạt đến giới hạn thì hãy hủy toàn bộ lịch trình và bắt đầu lại. Nó thực sự hoạt động khá tốt trong thực tế.
Cerad

Tôi đã kết thúc việc đi và làm theo cách tiếp cận vòng tròn. Tôi đã hoàn thành 95% việc viết tập lệnh để kết nối với DB, nhưng khi thử nghiệm, nó dường như đang chạy trơn tru và cân bằng. Tôi đang đối xử với những ngày của mình như "vòng" và họ đang sống tốt và cân bằng. Tôi có thể chơi các vòng của mình theo bất kỳ thứ tự nào và đặt các trò chơi cho mỗi vòng theo bất kỳ thứ tự nào nhưng việc chuyển một trò chơi từ vòng này sang vòng khác cuối cùng sẽ phá vỡ quy tắc.
steve

Câu trả lời:


5

Đây là một thuật toán tôi tự phát minh ra. Tôi không biết nếu nó đã tồn tại hoặc thực sự là việc thực hiện vòng tròn:

1 4    1 5   1 6   1 3   1 2
2 5    4 6   5 3   6 2   3 4
3 6    2 3   4 2   5 4   6 5

về cơ bản bạn bắt đầu với

xoay pic

và luôn giữ số 1 ở cùng vị trí và xoay phần còn lại.

Bằng cách đó, bạn sẽ luôn có được một lịch trình của các trận đấu độc đáo. Điều này cực kỳ dễ thực hiện và quy mô với bất kỳ số lượng đối thủ, thậm chí hoặc không đồng đều. Nếu bạn có số lượng đối thủ không đồng đều, chỉ cần không đặt một đội ở vị trí 1 và họ có vòng đấu miễn phí.


2
Làm thế nào để bạn quản lý số dư nhà và đi?
Eric đối phó

Điều này không thực sự hoạt động - trong thuật toán xoay đơn giản này, các đội xoay cách nhau 2 khe (2/4, 3/5) sẽ không bao giờ chơi.
mdryden

@mdryden nó không hoạt động. Kiểm tra nó tốt hơn và xin vui lòng xóa bình luận của bạn.
Pieter B

@PieterB Tôi đã nghĩ rằng nó sẽ hoạt động, nhưng nó thực sự không hoạt động nếu có một số lượng đội lẻ, vì các đội nằm ngay cạnh nhau (như 4 và 5) sẽ không bao giờ chơi với nhau. Bạn có thể thấy nó khá dễ dàng ở cuối với 1, và cả ở đầu kia bởi vì bạn có nhóm lơ lửng (tạm biệt) Đây là một phản hồi tốt cũng liên quan đến số lẻ: stackoverflow.com/a/6649732/ 6361306
ragingasiancoder

@ragingasiancoder nếu có số lượng đội lẻ, hãy thêm một đội giả. Câu trả lời bạn liên kết mô tả chính xác giải pháp tương tự như tôi đã trình bày.
Pieter B

1

Tôi nghĩ rằng bạn đang làm điều đó ngược lại. Đừng bắt đầu với bảng lịch trình, bắt đầu với một bảng / mảng / bất cứ thứ gì trong tất cả các kết hợp trò chơi (45 trò chơi). Từ đó, đây là một quy trình đơn giản để gán các trò chơi cho một ngày, dựa trên một đội chỉ chơi một lần một ngày. Và vì các trận đấu chỉ diễn ra một lần (Đội A chỉ chơi Đội B một lần) nên việc lên lịch rất dễ dàng vì bạn chỉ cần đảm bảo rằng trận đấu đã không xảy ra (các mục là "duy nhất" theo cách đó).


1

Tôi đã tạo ra lịch trình cướp vòng đơn 10 đội dưới đây. Tôi mất khoảng 3 phút.

Thông tin lịch trình:

10 đội - 1 vòng đấu (chỉ 6 tuần đầu tiên được hiển thị)
Ngày bắt đầu mùa 1/6/15 - ngày kết thúc 3/5/15
2 trận mỗi thứ ba, 3 trận mỗi thứ năm, 5 trận mỗi tuần không bỏ qua ngày

  • Tất cả các đội được phân phối để chơi trong 5 khe thời gian như nhau.
  • Tất cả chơi 9 trò chơi.
  • Tất cả chơi với nhau một lần.
  • Tất cả được phân phối đều như nhà & khách (5/4 hoặc 4/5). Lưu ý: khi kết thúc vòng 2, tất cả các đội chơi 18 trận (9 là sân nhà & 9 là khách) và tất cả các đội có 2 Byes.
  • Tất cả được phân phối để chơi đồng đều trong 5 khe thời gian mỗi tuần.

Chúng tôi đã sử dụng một máy tính khung chính Honeywell lỗi thời và chỉ dưới 3 năm để kết hợp tất cả mọi thứ lại với nhau. Khi phần mềm lập lịch của chúng tôi được gỡ lỗi, máy tính khung chính phải mất hàng giờ để tìm kiếm hàng triệu hoán vị & kết hợp để tính toán và tạo các mẫu cân bằng cho 4 đến 22 đội mà chúng tôi đang tìm kiếm.

10 Team Division Schedule   DATE 12/20/14

DATE   DAY TIME    LOCATION  GM  HOME vs VISITOR

Jan  6 Tue 6:00pm  Field #1   1  # 1 vs #10 
Jan  6 Tue 6:00pm  Field #2   1  # 2 vs # 9 
Jan  8 Thu 6:30pm  Field #3   1  # 3 vs # 8 
Jan  8 Thu 6:30pm  Field #4   1  # 4 vs # 7 
Jan  8 Thu 6:30pm  Field #5   1  # 5 vs # 6

Jan 13 Tue 6:00pm  Field #1   2  # 6 vs # 3 
Jan 13 Tue 6:00pm  Field #2   2  #10 vs # 8 
Jan 15 Thu 6:30pm  Field #3   2  # 7 vs # 2 
Jan 15 Thu 6:30pm  Field #4   2  # 9 vs # 1 
Jan 15 Thu 6:30pm  Field #5   2  # 4 vs # 5

Jan 20 Tue 6:00pm  Field #1   3  # 7 vs # 9 
Jan 20 Tue 6:00pm  Field #2   3  # 5 vs # 2 
Jan 22 Thu 6:30pm  Field #3   3  # 6 vs #10 
Jan 22 Thu 6:30pm  Field #4   3  # 3 vs # 4 
Jan 22 Thu 6:30pm  Field #5   3  # 8 vs # 1

Jan 27 Tue 6:00pm  Field #1   4  # 9 vs # 5 
Jan 27 Tue 6:00pm  Field #2   4  # 1 vs # 7 
Jan 29 Thu 6:30pm  Field #3   4  # 2 vs # 3 
Jan 29 Thu 6:30pm  Field #4   4  # 8 vs # 6 
Jan 29 Thu 6:30pm  Field #5   4  #10 vs # 4

Feb  3 Tue 6:00pm  Field #1   5  # 4 vs # 8 
Feb  3 Tue 6:00pm  Field #2   5  # 7 vs # 5 
Feb  5 Thu 6:30pm  Field #3   5  # 1 vs # 6 
Feb  5 Thu 6:30pm  Field #4   5  #10 vs # 2 
Feb  5 Thu 6:30pm  Field #5   5  # 3 vs # 9

Feb 10 Tue 6:00pm  Field #1   6  # 3 vs # 7 
Feb 10 Tue 6:00pm  Field #2   6  # 6 vs # 4 
Feb 12 Thu 6:30pm  Field #3   6  # 5 vs # 1 
Feb 12 Thu 6:30pm  Field #4   6  # 9 vs #10 
Feb 12 Thu 6:30pm  Field #5   6  # 8 vs # 2 

Không có thuật toán nào giải quyết được các vấn đề lập kế hoạch tổng thể liên quan đến hàng trăm hoặc hàng ngàn loại giải đấu, thể thao và các tình huống tiềm năng khác nhau. Những gì chúng tôi đã làm để giải quyết vấn đề này là thực hiện một cách tiếp cận khác để tính toán lịch trình. Nó bắt đầu với phép toán rất phức tạp để xác định các cặp đội vòng tròn phù hợp (trận đấu), nhưng đó mới chỉ là khởi đầu. Các phần khác là cần thiết để tạo ra một lịch trình cân bằng hữu ích có thể được công bố và phân phối. Người chơi, huấn luyện viên, phụ huynh, v.v., tất cả đều cần biết không chỉ họ đang chơi ai ; nhưng nơi họ đang chơi ; họ đang chơi lúc mấy giờ ; nếu họ là nhà hoặc khách ; và cho nhiều giải đấu, một số trò chơi .

Tôi hy vọng điều này sẽ giúp bạn và những người khác hiểu những gì chúng tôi đã mất 3 năm để tìm ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.