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

如何在Gurobi中建模带14约束的嵌套求和目标函数?

Python Gurobi 完整建模实现

完整可运行代码

import gurobipy as gp
from gurobipy import GRB

# 初始化模型
model = gp.Model("max_binary_sum")

# 节点范围:0到19
node_count = 20
nodes = range(node_count)

# 批量创建二进制变量x(i,j),替代逐个addVar的繁琐操作
x = model.addVars(nodes, nodes, vtype=GRB.BINARY, name="x")

# 构建目标函数:最大化所有x(i,j)的双层求和
model.setObjective(gp.quicksum(x[i,j] for i in nodes for j in nodes), GRB.MAXIMIZE)

# 添加双向互斥约束:任意i≠j,x(i,j)和x(j,i)不能同时为1
for i in nodes:
    for j in nodes:
        if i != j:
            model.addConstr(x[i,j] + x[j,i] <= 1, f"mutual_excl_{i}_{j}")

# 添加自定义的14条约束(示例给出第一条,其余按此格式补充)
# 示例约束:x(0,13)+x(0,4)+x(0,17) ≤1
model.addConstr(x[0,13] + x[0,4] + x[0,17] <= 1, "constraint_1")
# 继续添加剩余13条约束,例如:
# model.addConstr(x[1,5] + x[1,9] <= 1, "constraint_2")
# ...
# model.addConstr(..., "constraint_14")

# 执行优化
model.optimize()

# 输出选中的变量(值为1的二进制变量)
if model.status == GRB.OPTIMAL:
    print("选中的变量:")
    for i in nodes:
        for j in nodes:
            # 用0.5阈值避免浮点精度误差
            if x[i,j].X > 0.5:
                print(f"x({i},{j}) = 1")
else:
    print("模型无可行解或最优解")

关键细节说明

  • 变量定义:使用addVars批量生成二维二进制变量,比循环调用addVar更高效且代码更简洁。
  • 目标函数构建:通过gp.quicksum嵌套遍历所有i和j,直接实现双层求和的最大化目标,Gurobi会自动处理求和逻辑。
  • 双向互斥约束:遍历所有i≠j的组合,添加x(i,j)+x(j,i)≤1,确保不会同时选中双向节点对。
  • 自定义约束补充:14条自定义约束只需按照示例格式,替换变量和条件即可,每个约束建议设置唯一名称便于后续调试。
  • 结果输出:通过检查变量的.X属性(最优解取值),筛选出值大于0.5的变量(二进制变量仅取0/1,阈值避免浮点精度问题)。

内容的提问来源于stack exchange,提问作者Sasha H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:29:53