使用Python纸浆进行二进制优化,以进行多日播放器选择

2024-05-17 16:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用纸浆解决一个整数优化问题。我正在创建一支梦幻运动队——在那里我需要在每场比赛日挑选11名球员。[为简单起见,假设只有2个游戏日]。另一个限制是,我不能在两天内进行超过3次更改。换言之,8名球员需要在两天内保持一致。我买的球员需要在100学分的预算之内

我有两个决策变量:即两天中每一天的选定团队

    prob = LpProblem("Fantasy_Cricket", LpMaximize)
    player_names = list(squad.Player)
    player_gd1 = LpVariable.dicts("playerChosen1", player_names, 0, 1, cat='Integer')
    player_gd2 = LpVariable.dicts("playerChosen2", player_names, 0, 1, cat='Integer')

仅供参考:player_names指所有可用玩家的列表。 目标函数是在2天内最大化预测分数(gd1和gd2指比赛日1和比赛日2)。这是所选球员的函数*他的“价值”以及他的球队是否在某一天比赛

    prob += lpSum([player_gd1[p]*squad[squad.Player==p]['Value'].sum()*squad[squad.Player==p]['gd1'].sum() + player_gd2[p]*squad[squad.Player==p]['Value'].sum()*squad[squad.Player==p]['gd2'].sum() for p in player_names])

约束集如下所示:

    prob += lpSum([player_gd1[p]*squad[squad.Player==p]['Points'].sum() for p in player_names]) <=100
    prob += lpSum([player_gd2[p]*squad[squad.Player==p]['Points'].sum() for p in player_names]) <=100
    
    prob += lpSum([player_gd1[p] for p in player_names]) == 11
    prob += lpSum([player_gd2[p] for p in player_names]) == 11
    
    prob += lpSum([((player_gd1[p] + player_gd2[p]) ==2) for p in player_names]) >=8

前4个约束工作正常。这是导致“不可行”解决方案的第五个解决方案。基本上,我正在执行一项规则,即在两天内至少有8名球员是普通球员

prob.solve()
print("Status:", LpStatus[prob.status]) 

Status: Infeasible

我不熟悉Python和纸浆。有人能帮忙吗?我错过了什么

在此重申,前4个约束条件运行良好。第五天的引入(这是对多日选择的限制)导致了问题

提前谢谢


Tags: infornames纸浆playersum球员dicts
1条回答
网友
1楼 · 发布于 2024-05-17 16:58:16

最后一个限制:

prob += lpSum([((player_gd1[p] + player_gd2[p]) ==2) for p in player_names]) >=8

不是纸浆中的有效约束。我可以看到您试图实现的目标,即创建一个中间二进制变量((player_gd1[p] + player_gd2[p]) ==2),然后在所有参与者之间求和。如果您想这样做,您必须显式地声明这个二进制变量,并找到一种方法,当(并且仅当)该条件满足时,强制它接受一个真值

例如,您可以创建一组新的变量:

player_swapped = LpVariable.dicts("player_swapped", player_names, 0, 1, cat='Integer')

然后有一组常数,如下所示:

for p in player_names:
    player_swapped[p] >= player_gd1[p] - player_gd2[p]
    player_swapped[p] >= player_gd2[p] - player_gd1[p]

然后,您可以设置游戏之间可以交换的玩家数量限制

相关问题 更多 >