Ограничение выбора двоичной переменной целлюлозы на основе другой переменной - PullRequest
1 голос
/ 11 мая 2019

Я создаю сценарий оптимизации для Fantasy Football. Это начинается довольно легко - загрузка в игроков и их соответствующие данные.

Ключевым моментом в этой игре является то, что в вашем отряде может быть выбрано 15 игроков, но в неделю может участвовать только 11 игроков.

То, что я хотел бы сделать, это иметь 2 переменные - одну, определяющую, что игрок находится в вашем отряде, и подменю, которое определяет, положите ли вы игрока в свои стартовые 11.

Я пробовал несколько вещей - одно широкое решение состоит в том, чтобы иметь 2 не связанные переменные. 1, который выбирает 11 стартеров, и второй, который выбирает 4 сабвуфера. Это хорошо работает в течение 1 недели, но, например, одну неделю игрок А из вашего отряда мог бы начать лучше, а на следующей он лучше на скамейке запасных. Поэтому я бы получил более оптимальное решение, если бы мог сделать начальную переменную 11 подмножеством переменной отряда.

Я приложил код, определяющий переменные, и мою попытку создать ограничение, которое связало бы их вместе. (Существуют и другие ограничения, которые все успешно работают. Например, я могу выбрать стартовые 11 или отряд из 15, чтобы максимизировать ожидаемые результаты без проблем, но я не могу выбрать стартовые 11 в отряде из 15.

#VECTORS OF BINARY DECISIONS VARIABLES
squad_variables = []
for rownum in ID:
    variable = str('x' + str(rownum))
    variable = pulp.LpVariable(str(variable), lowBound = 0, upBound = 1, cat= 'Integer') 
    squad_variables.append(variable)

xi_variables = []
for rownum in ID:
    bariable = str('y' + str(rownum))
    bariable = pulp.LpVariable(str(bariable), lowBound = 0, upBound = 1, cat= 'Integer') 
    xi_variables.append(bariable)

Приведенный ниже код не работает для этой задачи и является корнем проблемы.

#ID CONSTRAINTS (ie. only 15 unique id selection across both systems)
id_usage = ""
for rownum in ID:
    for i, player in enumerate(squad_variables):
        if rownum == i:
            formula = max(1*xi_variables[rownum],(1*player))
            id_usage += formula
prob += (id_usage ==15)

Любая помощь будет принята с благодарностью - возможно, это просто нелинейная проблема. Спасибо:)

1 Ответ

0 голосов
/ 11 мая 2019

Вы хотите ограничение, которое говорит "если x[i] = 0, то y[i] = 0".Типичный способ сделать это - через ограничение y[i] <= x[i].Обратите внимание, что это работает, только если обе переменные являются двоичными;в противном случае необходим измененный подход.Я не могу точно следовать вашему PuLP коду, поэтому я не буду пытаться дать вам код для этого ограничения, но я предполагаю, что вы сможете реализовать его, как только поймете логику.

...