Я пытаюсь смоделировать подбор 15 игроков на определенное количество игр. Моя LpProblem состоит из 2 бинарных переменных player и fixture.
choices = LpVariable.dicts(
"Choices", (fixtures, constraints["player"]), 0, 1, LpBinary)
Я хотел бы ограничить количество игроков, выбранных для набора приспособлений, используя это ограничение (что плохо - оно учитывает весь выбор, а не количество использованных игроков):
prob += lpSum([choices[f][p] for f in fixtures for p in constraints["player"]]
) <= player_count + len(fixtures) - 1, "Transfers limit"
Я также установил ограничение, чтобы выбрать ровно 15 игроков для каждого матча:
for fixture in fixtures:
prob += lpSum([choices[fixture][p]
for p in constraints["player"]]) == player_count, str(fixture) + " Total of " + str(player_count) + " players"
Моя цель - выбрать 15 и небольшое количество изменений от приспособления к приспособлению, но по какой-то причине эти ограничения создают недопустимую проблему. Например, если я ищу fixtures = [0,1,2]
, проблема становится возможной, когда я устанавливаю лимит передачи 45 (15 * 3). Я не уверен, как сформулировать ограничение на передачу для достижения моей цели.
Пример:
players = [1, 2, 3, 4, 5, 6]
fixtures = [1, 2, 3]
prob = LpProblem(
"Fantasy football selection", LpMaximize)
choices = LpVariable.dicts(
"Players", (fixtures, players), 0, 1, LpBinary)
# objective function
prob += lpSum([predict_score(f, p) * choices[f][p]
for p in players for f in fixtures]), "Total predicted score"
# constraints
for f in fixtures:
# total players for each fixture
prob += lpSum([choices[f][p] for p in players]) == 2, ""
if f != fixtures[0]:
# max of 1 change between fixtures
prob += lpSum([1 if choices[f-1][p] != choices[f]
[p] else 0 for p in players]) <= 2, ""
prob.solve()
print("Status: ", LpStatus[prob.status])
if
указанным вами способом, но будет способ сформулировать необходимое ограничение ... вам просто нужно подумать о том, какие операции / ограничения требуются для двоичных переменных. И что такоеpredict_score()
функция? - person kabdulla   schedule 02.12.2019predict_score()
, которую я вставил в свой ответ. - person kabdulla   schedule 03.12.2019