如何在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
相关产品推荐
相关产品推荐

