Có một hệ thống khá đơn giản được sử dụng trong ví dụ: giải đấu cờ vua được gọi là round-robin.
Ý tưởng là chia các trình phát cho hai bên của bảng. Một trong những người chơi được chỉ định là một "trung tâm" (cho một mong muốn của một từ tốt hơn). Giải đấu bắt đầu bằng việc có người chơi đối đầu nhau chơi với nhau. Sau vòng đầu tiên tất cả mọi người, nhưng các trung tâm di chuyển một ghế phía trước và trắng/đen (nhà/đi trong thể thao) thứ tự được chuyển. Toàn bộ cuộc thi round-robin kết thúc khi các cầu thủ ngồi ở vị trí ban đầu của họ. Nếu bạn muốn tất cả mọi người chơi tất cả mọi người hai lần chỉ làm như vậy một lần nữa.
Wikipedia article với chi tiết triển khai.
Trong trường hợp đặc biệt của bạn, tôi sẽ thử thực hiện vòng quay một lần bao gồm tất cả các đội. Sau đó, bạn làm tương tự cho mỗi bộ phận một lần và để đảm bảo các đội trong các bộ phận chơi lẫn nhau một lần ở nhà và một lần, hãy kiểm tra từ vòng đầu tiên theo cách mà các đội chơi trong vòng đó. Tất nhiên, bạn sẽ chơi tất cả các trận đấu liên bộ trước khi trận đấu kết thúc (kể từ khi trận đấu n-1 cuối cùng chống lại các đội phân chia nội bộ [n = số đội trong phân chia]). Nếu đây là một vấn đề bạn có thể chỉ cần trao đổi các trận đấu xung quanh một chút.
Tôi thực sự đã viết một tập lệnh Python đơn giản thực hiện việc này. Nó không có nhiều dòng mã và tạo ra kết quả khá tốt. Điều này sẽ tạo ra một lịch trình mà mỗi đội chơi mỗi đội trong bộ phận của họ hai lần và một lần chống lại các đội trong các bộ phận khác. Không có kiểm tra để đảm bảo rằng các đội gặp nhau hai lần theo cách mà cùng một đội là ở nhà, tuy nhiên. Nhưng mã này nên cung cấp ý tưởng hay về cách tạo mã lập lịch của riêng bạn.
#!/usr/bin/python
div1 = ["Lions", "Tigers", "Jaguars", "Cougars"]
div2 = ["Whales", "Sharks", "Piranhas", "Alligators"]
div3 = ["Cubs", "Kittens", "Puppies", "Calfs"]
def create_schedule(list):
""" Create a schedule for the teams in the list and return it"""
s = []
if len(list) % 2 == 1: list = list + ["BYE"]
for i in range(len(list)-1):
mid = int(len(list)/2)
l1 = list[:mid]
l2 = list[mid:]
l2.reverse()
# Switch sides after each round
if(i % 2 == 1):
s = s + [ zip(l1, l2) ]
else:
s = s + [ zip(l2, l1) ]
list.insert(1, list.pop())
return s
def main():
for round in create_schedule(div1):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div2):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div3):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div1+div2+div3):
for match in round:
print match[0] + " - " + match[1]
print
if __name__ == "__main__":
main()
Vâng đó là ý định của mã trên :) –
@Rune: Trong trường hợp đó, +1 !!!! –