我正在用纸浆解决一个整数优化问题。我正在创建一支梦幻运动队——在那里我需要在每场比赛日挑选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个约束条件运行良好。第五天的引入(这是对多日选择的限制)导致了问题
提前谢谢
最后一个限制:
不是纸浆中的有效约束。我可以看到您试图实现的目标,即创建一个中间二进制变量
((player_gd1[p] + player_gd2[p]) ==2)
,然后在所有参与者之间求和。如果您想这样做,您必须显式地声明这个二进制变量,并找到一种方法,当(并且仅当)该条件满足时,强制它接受一个真值例如,您可以创建一组新的变量:
player_swapped = LpVariable.dicts("player_swapped", player_names, 0, 1, cat='Integer')
然后有一组常数,如下所示:
然后,您可以设置游戏之间可以交换的玩家数量限制
相关问题 更多 >
编程相关推荐