Eu não acho que seja possível satisfazer estritamente este requisito em um sistema round-robin:
H/A rotation: each team should play a home game and an away game every other round, i.e. in a tournament with 5 rounds, a given team should have the following rotation: H-A-H-A-H.
Digamos que você tenha um sistema round-robin em que cada equipe participe de uma partida a cada rodada e cada equipe tenha uma programação alternada perfeitamente alternada. Sejam A e B equipes que jogam em casa no primeiro turno. Então eles estarão jogando em casa em cada round ímpar e jogando fora todos os rounds. Nunca haverá uma rodada em que A jogue em casa e B jogue fora ou vice-versa. Consequentemente, se A e B não compartilharem o local da casa, então A e B nunca se enfrentarão. O sistema é falho.
Acho que atribuir a localização da equipe (Home ou Away) às linhas do algoritmo round robin padrão e alterná-las deve funcionar razoavelmente bem.
Assim, para a primeira rodada (e para cada rodada ímpar), você teria as equipes da casa na primeira linha e as equipes ausentes na segunda linha:
Round 1. (1 plays 14, 2 plays 13, ... ) 1 2 3 4 5 6 7 (Home) 14 13 12 11 10 9 8 (Away)
Para a segunda rodada (e para cada rodada), você teria times fora na primeira linha e equipes da casa na segunda linha:
Round 2. (1 plays 13, 14 plays 12, ... ) 1 14 2 3 4 5 6 (Away) 13 12 11 10 9 8 7 (Home)
Alternar para casa e para longe pode ser implementado usando o primeiro algoritmo e alterando essa linha
pairings.append((teams[i], teams[len(teams) - i - 1]))
em algo parecido com isto
if turn % 2:
home = teams[i]
away = teams[len(teams) - i - 1])
else:
home = teams[len(teams) - i - 1])
away = teams[i]
pairings.append((home, away))