You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:39:40