Я создаю сценарий оптимизации для 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)
Любая помощь будет принята с благодарностью - возможно, это просто нелинейная проблема. Спасибо:)