Помогите мне выяснить алгоритм случайного планирования с использованием Python и PostgreSQL - PullRequest
0 голосов
/ 06 апреля 2009

Я пытаюсь составить график предстоящего сезона для моей симуляционной бейсбольной команды. У меня есть база данных Postgresql, которая содержит старое расписание.

В базе данных 648 строк: 27 недель серии для 24 команд. Проблема в том, что график стал предсказуемым и позволяет командам заранее знать о слабых местах своего графика. То, что я хочу сделать, это взять существующее расписание и рандомизировать его. Таким образом, команды все еще играют друг с другом нужное количество раз, но не в том же порядке, что и раньше.

Есть одно правило, которое сбивает меня с толку: каждая команда может играть только один домашний и один дорожный сериал в неделю. Я дурачился с инструкциями SELECT, основанными на ORDER BY RANDOM (), но я не понял, как сделать так, чтобы у команды был только один домашний и один дорожный ряд в неделю.

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

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2009

Рассматривали ли вы сохранить свое «расписание» и просто перетасовывать команды? Создание расписания, в котором все играют друг друга нужное количество раз, возможно, но если у вас уже есть такое расписание, то гораздо проще просто перетасовать команды.

Вы можете сохранить свою текущую таблицу, но заменить каждую команду в ней идентификатором (0-23, или AX, или любым другим), а затем случайным образом сгенерировать в другую таблицу, где вы назначаете каждой команде каждый идентификатор (0 = TeamJoe, 1 = TeamBob и т. Д.). Затем, когда придет время снова перемешать в следующем году, просто регенерируйте эту таблицу сопоставления.

Не уверен, что это ответ на вопрос так, как вы хотите, но, вероятно, это то, с чем я хотел бы пойти (и на самом деле, как я делаю это на моем сайте фэнтези-футбола).

1 голос
/ 06 апреля 2009

Мне кажется, я правильно понял ваш вопрос, но в любом случае вы можете использовать функциональность набора данных Python и функциональность генератора:

import random

def scheduler(teams):
    """ schedule generator: only accepts an even number of teams! """
    if 0 != len(teams) % 2:
        return

    while teams:
        home_team = random.choice(list(teams))
        teams.remove(home_team)
        away_team = random.choice(list(teams))
        teams.remove(away_team)
        yield(home_team, away_team)

# team list from sql select statement
teams = set(["TEAM A", "TEAM B", "TEAM C", "TEAM D"])

for team in scheduler(teams):
    print(team)

Это сводит обработку SQL к минимуму и должно быть очень легко добавить к новым правилам, вроде тех, которые я не понимал;) Удачи

EDIT:

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

1 голос
/ 06 апреля 2009

Я не уверен, что полностью понимаю проблему, но вот как бы я это сделал: 1. создать полный список матчей, которые должны произойти 2. Выполните итерации в течение нескольких недель, выбирая, какое совпадение должно произойти на этой неделе.

Вы можете использовать списки Python для представления совпадений, которые еще должны произойти, и для каждой недели совпадения, которые происходят на этой неделе.

На шаге 2 выбор совпадения будет работать следующим образом: а. используйте random.choice, чтобы выбрать случайное совпадение. б. определить, у какой команды есть домашний раунд для этого матча, используя random.choice ([1,2]) (если бы это был домашний раунд для любой команды) с. временно удалить все совпадения, заблокированные этим выбором. матч блокируется, если у одной из ее команд уже есть два матча в неделю, или если у обеих команд уже есть домашний матч на этой неделе, или если у обеих команд уже есть дорожный матч на этой неделе. д. если в течение недели больше нет доступных матчей, переходите к следующей неделе, читая все матчи, заблокированные на предыдущей неделе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...