Как автоматически генерировать спортивное расписание лиги

Я знаю, что это ужасное решение, но на данный момент единственный способ провести различие между iPad Mini и iPad 2 - это проверить его номер сборки и сопоставить каждый номер сборки с соответствующим устройством.

Позвольте привести пример: iPad mini версии 6.0 отображает «10A406» в качестве номера сборки, а iPad 2 - «10A5376e».

Это значение может быть легко получено через регулярное выражение в пользовательском агенте (window.navigator.userAgent); к этому номеру добавляется префикс «Mobile/».

К сожалению, это единственный недвусмысленный способ обнаружить iPad Mini; Я бы предложил принять подход, связанный с viewport (где он поддерживается, с использованием блоков vh / vw) для правильного отображения содержимого на экранах разных размеров.

7
задан thaBadDawg 24 June 2009 в 08:20
поделиться

4 ответа

Существует довольно простая система, используемая, например, в шахматных турнирах, называемых круговыми.

Идея состоит в том, чтобы разделить игроков на две стороны стола. Один из игроков обозначен как «хаб» (для лучшего слова). Турнир начинается с того, что игроки сталкиваются друг с другом и играют друг против друга. После первого раунда все, кроме центра, передвигаются на один стул вперед, и порядок белого / черного (дома / на выезде в спорте) меняется. Соревнование по круговой системе заканчивается, когда игроки садятся на свои места. Если вы хотите, чтобы все сыграли со всеми дважды, просто сделайте то же самое еще раз.

Статья в Википедии с подробностями реализации.

В вашем особом случае я бы попробовал провести круговой алгоритм один раз, включая все команды. Затем вы делаете то же самое для каждого дивизиона один раз, и, чтобы убедиться, что команды внутри дивизионов играют друг с другом один раз дома и один раз на выезде, проверьте в первом круговом режиме, как команды играли в этом раунде.

это, конечно, то, что вы будете играть все матчи между дивизионами задолго до окончания турнира (поскольку последние n-1 матчей проводятся против команд внутри дивизиона [n = количество команд в дивизионе]). Если это проблема, вы можете просто немного поменять местами совпадения.

На самом деле я написал простой скрипт Python, который делает это. Это не потребовало много строк кода и дало довольно хорошие результаты. Это создаст расписание, в котором каждая команда сыграет с каждой командой своего дивизиона дважды и один раз против команд из других дивизионов. Однако нет проверки, чтобы команды встречались друг с другом дважды таким образом, чтобы одна и та же команда находилась дома. Но этот код должен дать хорошее представление о том, как создать свой собственный код планирования.

#!/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()
12
ответ дан 6 December 2019 в 07:52
поделиться

There are two algorithms, one for odd teams, one for even teams to make sure the round robin happens.

I am going to generate you a graphic if i can.

ODD # of teams

The algorithm is to rotate all the teams clockwise. If we had 5 teams:

1 2 --> 3 1 --> 5 3 --> 4 5 --> 2 4
3 4     5 2     4 1     2 3     1 5
5       4       2       1       3   

At this point we have completed one round robin where everyone plays each other once... the next round would again be..

1 2
3 4
5

EVEN # of teams

When we have an even number of teams, you do the same rotation, except you hold team #1 in fixed position and rotate all the other teams around #1 in a clockwise fashion. So, if we had 4 teams..

1 2 --> 1 3 --> 1 4 
3 4     4 2     2 3 

This would be one complete round robin... the next match up would be..

1 2 
3 4 

Programmatically, There's a few ways you could approach this. Maybe the code posted above does the same thing lol..

7
ответ дан 6 December 2019 в 07:52
поделиться

Я бы просто закодировал эти ограничения в виде логической формулы и использовал бы SAT-решатель для получения решений (например, MiniSAT для C ++, SAT4J для Java, и вы даже можете написать собственный простой решатель). Вход для этих решателей стандартизирован DIMACS.

См. Также «Кодирование SAT для социальной проблемы игрока в гольф» и «Планировщик на основе SAT для расписания турниров» для SAT-кодирования аналогичных задач.

2
ответ дан 6 December 2019 в 07:52
поделиться

вот пример реализации

public interface ITeam
{
   bool PlaysOn(DateTime date);
   bool canPlay(ITeam); //returns true if a game between the teams is legal (played once/twice   
                        //already, same different divisions and other applicable rules
}

IEnumerable<ITeam> teams = null; //replace with initialization
IEnumerable<ITeams> reversed = team.Reverse();
IEnumerable<DateTIme> gameDays = null;//replace with initialization
var count = teams.Count();

foreach(var date in gameDays)
{
   for(int i = 0;i<count;i++)
   {
      var innerTeams = i % 2 == 0 ? teams : reversed;
      var team = (from t in innerTeams
                  where !t.PlaysOn(date)
                  select t).First();  
      var opp = (from t in teams
                 where !t.PlaysOn(date) && t.CanPlay(team)
                 select t).First();
      SetupGame(team,opp);
   }
} //lot of optimazation possible :)

Я тестировал ее только на бумаге, но для моей установки она работает. Чередуя начало списка команд с начала и конца списка, я избегаю ситуаций, когда одной и той же команде придется играть с одной и той же командой снова и снова (или повторно играть в один и тот же день) в моем бумажном тесте. представлял все возможные встречи как разные противники, но в основном это то, что должен делать метод CanPlay. Надеюсь, это поможет, хотя это и не полное решение

2
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: