리그 스케줄링 알고리즘을 식별하는 데 도움이 필요합니다


9

스포츠 리그 스케줄러를 만들려고합니다. 각 슬롯을 효율적으로 채울 수 있도록 알고리즘을 식별하는 데 문제가 있습니다.

스케줄을 빌드하기위한 샘플 데이터는 다음과 같습니다.

  1. 10 팀
  2. 각 팀은 서로 1 회 플레이합니다 (총 45 개의 게임 필요).
  3. 각 팀은 하루에 한 번만 플레이합니다
  4. 내 테스트에서 나는 하루에 5 슬롯으로 9 일을 사용하고 있습니다.

콤보 테이블 (45 개의 콤보 포함)

ID
Team1ID
Team2ID
bitAssigned

스케줄 테이블 (45 개의 타임 슬롯 포함)

scheduleID
홈팀
ID 원정팀 ID
GameDate
GameTime

현재 기존 절차는 슬롯의 약 90 %를 채우고 슬롯의 10 %를 위 규칙에 따라 예약 충돌로 비 웁니다.

일정표를 오름차순 날짜 / 시간 순서로 반복합니다.
첫 번째 슬롯은 토요일 오전 8시에있을 수 있습니다.
아직 예약되지 않은 팀 목록을 쿼리합니다. 그런 다음 해당 팀의 가능한 조합을 배열합니다. 그런 다음 해당 배열을 사용하여 아직 예약되지 않은 조합에서 조합 테이블에서 무작위 레코드 1 개를 가져오고 해당 팀을 일정에 배치합니다. 그런 다음 해당 조합을 사용 된대로 설정합니다.

루프를 반복해서 반복하며 사용 가능한 팀 목록이 작아 질 때마다 배열도 작아집니다.

나는 며칠이 지났고 다른 날에는 마지막 두 남은 팀이 이미 지난 주에 뛰었으므로 일정에 다시 추가되지 않습니다.

내가 아직 시도하지 않은 유일한 것은 갈등의 날을 "재설정"하고 다시 배치하여 더 나은 게재 위치를 얻는 지 확인하는 것입니다.

누구든지 제안이 있습니까?


5
라운드 로빈 토너먼트 일정
케빈 클라인

케빈 감사합니다. 당신의 권리. 나는 지금 배열이 매번 같은 지점에서 시작하는 것으로 보이며 회전이 없으므로 팀을 페어링하는 순서가 없습니다.
steve

1
나는 완전히 임의의 접근 방식을 사용합니다. 슬롯과 두 팀을 무작위로 선택하십시오. 규칙이 충족되면 게임을 예약하십시오. 삭제하지 않으면 다시 시도하십시오. 총 시도 횟수에 제한을 설정하고 한도에 도달하면 전체 일정을 삭제하고 다시 시작합니다. 실제로 실제로는 잘 작동합니다.
Cerad

나는 라운드 로빈 접근법을 따르고 끝났다. DB에 연결하기 위해 스크립트 작성을 95 % 완료했지만 테스트에서 부드럽고 균형 잡힌 것처럼 보입니다. 나는 내 하루를 "라운드"처럼 대우하고 있고 그들은 잘 균형을 유지하고 있습니다. 나는 어떤 순서로든 내 라운드를 플레이 할 수 있고 각 라운드의 게임을 어떤 순서로든 넣을 수 있지만 게임을 한 라운드에서 다른 라운드로 옮기면 결국 규칙을 어기 게됩니다.
steve

답변:


5

여기 내가 스스로 발명 한 알고리즘이 있습니다. 이미 존재하는지 또는 실제로 라운드 로빈 구현인지 모르겠습니다.

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

기본적으로 당신은 시작

회전 사진

항상 1을 같은 위치에 유지하고 나머지는 돌리십시오.

그렇게하면 항상 독특한 경기 일정을 얻을 수 있습니다. 이는 구현하기가 매우 쉬우 며 짝수 또는 불균일 한 수의 상대와 함께 확장 할 수 있습니다. 상대편이 고르지 않은 경우, 팀을 1 위에 두지 말고 자유 라운드를하십시오.


2
재택 대 원가를 어떻게 관리합니까?
Eric Cope

이것은 실제로 작동하지 않습니다-이 간단한 회전 알고리즘에서 2 슬롯 간격 (2/4, 3/5) 인 회전 팀은 절대 재생되지 않습니다.
mdryden

@ mdryden 작동합니다. 더 잘 확인하고 의견을 제거하십시오.
Pieter B

@PieterB 나는 그것이 효과가 있다고 생각했지만 홀수의 팀이 있다면 실제로 작동하지 않습니다. 여기에 또한 홀수 다루는 좋은 반응이다 당신은 1 끝에서 아주 쉽게 볼 수 있으며, 또한 다른 쪽 끝에서 당신은 (안녕과) 댕글 링 팀을 가지고 있기 때문에 : stackoverflow.com/a/6649732/를 6489306
ragingasiancoder

@ragingasiancoder 팀이 홀수 인 경우 더미 팀을 추가하십시오. 당신이 연결 한 대답은 내가 제시 한 것과 똑같은 해결책을 설명합니다.
Pieter B

1

나는 당신이 그것을 뒤로하고 있다고 생각합니다. 스케줄 테이블로 시작 하지 말고 테이블 / 배열 / 모든 게임 조합 (45 게임)으로 시작하십시오. 거기에서 하루에 한 번만 경기하는 팀을 기반으로 하루에 게임을 지정하는 간단한 프로세스입니다. 매치업은 한 번만 수행되므로 (팀 A는 팀 B 만 한 번만 수행하므로) 매치업이 이미 수행되지 않았는지 확인해야하기 때문에 예약이 쉽습니다.


1

아래에서 10 팀 단일 라운드 로빈 일정을 생성했습니다. 약 3 분이 걸렸습니다.

일정 정보 :

10 개 팀-라운드 로빈 1 개 (첫 6 주만 표시됨)
시즌 시작 날짜 1/6/ 15-종료 날짜 매주
화요일 3/5/15 , 매주 목요일 3 회, 매주 5 회, 건너 뛰기 날짜 없음

  • 모든 팀은 5 개의 타임 슬롯에서 똑같이 플레이 할 수 있습니다.
  • 모두 9 게임을합니다.
  • 모두 한 번 서로 연주합니다.
  • 모두 가정 및 방문자 (5/4 또는 4/5)로 균등하게 분배됩니다. 참고 : 라운드 로빈 2가 끝나면 모든 팀이 18 개의 게임을하고 (9는 홈, 9는 방문자), 모든 팀에는 2 Byes가 있습니다.
  • 모두 매주 5 개의 시간대에 균등하게 분배됩니다.

우리는 구식 Honeywell 메인 프레임 컴퓨터를 사용했고 3 년 안에이 모든 것을 하나로 모았습니다. 예약 소프트웨어가 디버깅되면 메인 프레임 컴퓨터에서 수백만 개의 순열 및 조합을 검색하는 데 많은 시간이 걸렸습니다.

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 

수백 또는 수천 개의 서로 다른 유형의 리그, 스포츠 및 잠재적 상황과 관련된 전체 일정 문제를 해결하는 알고리즘은 없습니다. 이 문제를 해결하기 위해 수행 한 작업은 다른 방식으로 일정을 계산하는 것입니다. 적절한 라운드 로빈 팀 페어링 (매치업)을 결정하기 위해 매우 복잡한 수학으로 시작하지만 이는 시작에 불과합니다. 게시 및 배포 할 수있는 유용한 균형 잡힌 일정을 만들려면 다른 부분이 필요합니다. 선수, 코치, 부모 등은 모두 자신이 누구 인지를 알아야합니다 . 그러나 그들이 어디에서 놀고 있는지 ; 그들이 몇시에 놀았는지 ; 그들이 집 또는 방문자 인 경우 ; 많은 리그의 경우 게임 번호 입니다.

이것이 여러분과 다른 사람들이 3 년 동안 우리를 이해하는 데 도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.