Gurobi报错TypeError:int与tupledict不支持减法,求问题排查
问题分析与解决
你的错误根源确实在w的定义上。
问题原因
mdl.addVars(0,1)会创建一个tupledict类型的变量集合(包含两个变量:w[0]和w[1]),而非单个二进制变量。当你在约束中写1 - w时,Python尝试用整数1减去整个tupledict,这就触发了TypeError: unsupported operand type(s) for -: 'int' and 'tupledict'错误。
修正方案
场景1:w是单个全局辅助变量
把w的定义改成单个变量,使用addVar而非addVars:
w = mdl.addVar(vtype=GRB.BINARY, name='w')
约束中的w引用保持不变即可:
for i in customers: for j in customers: if i != j: mdl.addConstr(y[j] + z[j] <= y[i] + z[i] - df.demand[j]*(x1[i,j] + x2[i,j]) + 100000 * (1 - w), name='C8')
场景2:w是与(i,j)对绑定的辅助变量集合
如果你的逻辑需要每个(i,j)对对应一个独立的w,则需调整定义和约束引用:
- 定义时指定索引范围:
w = mdl.addVars(customers, customers, vtype=GRB.BINARY, name='w')
- 约束中引用对应索引的
w:
for i in customers: for j in customers: if i != j: mdl.addConstr(y[j] + z[j] <= y[i] + z[i] - df.demand[j]*(x1[i,j] + x2[i,j]) + 100000 * (1 - w[i,j]), name=f'C8_{i}_{j}')
内容的提问来源于stack exchange,提问作者MAYA
相关产品推荐
相关产品推荐

