Gurobipy技术问询:如何添加约束限制特定tupledict值的出现次数
Gurobi建模:添加位置约束的实现方法
需求回顾
你已完成篮球阵容优化模型的基础构建,现在需要添加约束:position值为1的球员(Johnson、Drexler、Olajuwon)最多选中2位。
约束实现代码
直接在现有建模代码后添加以下约束即可:
# 约束position为1的球员最多选2位 m.addConstr( quicksum(player[i] for i in name if position[i] == 1) <= 2, name="max_position_1_players" )
完整可运行代码
整合所有步骤后的完整代码如下:
import gurobipy as gp from gurobipy import GRB, quicksum # 初始化球员数据 name, position, pp90, value = gp.multidict({ ('Jordan'): [0, 3.68, 5.0], ('Bird'): [0, 3.61, 5.0], ('Johnson'): [1, 6.82, 6.0], ('Drexler'): [1, 6.61, 7.0], ('Olajuwon'): [1, 6.56, 7.5], ('Drexler'): [3, 5.03, 7], ('Ewing'): [3, 4.99, 5.5], ('Payton'): [3, 4.86, 7.5], ('Kemp'): [3, 4.75, 0], ('Stockton'): [3, 4.65, 0], }) # 创建优化模型 m = gp.Model("basketball_team_optimization") # 添加二进制决策变量:选中为1,未选中为0 player = m.addVars(name, obj=value, vtype=GRB.BINARY, name="player") # 设置目标函数:最大化总pp90值 m.setObjective(quicksum(pp90[i] * player[i] for i in name), GRB.MAXIMIZE) # 添加总薪资约束:总价值不超过100 total_value = 100 m.addConstr(quicksum(value[i] * player[i] for i in name) <= total_value, name="total_value") # 添加position=1的球员数量约束 m.addConstr( quicksum(player[i] for i in name if position[i] == 1) <= 2, name="max_position_1_players" ) # 求解模型 m.optimize() # 输出最优解 if m.status == GRB.OPTIMAL: print("最优选中球员列表:") for i in name: if player[i].x > 0.5: print(f"- {i}: 位置={position[i]}, pp90={pp90[i]}, 价值={value[i]}") print(f"\n总pp90: {round(m.objVal, 2)}") print(f"总价值: {round(quicksum(value[i]*player[i].x for i in name).getValue(), 2)}")
补充说明
- 如果需求是必须恰好选中2位position=1的球员,只需将约束中的
<= 2修改为== 2。 - 代码中通过
position[i] == 1精准筛选目标球员群体,确保约束只作用于指定位置的球员。
内容的提问来源于stack exchange,提问作者berns
相关产品推荐
相关产品推荐

