对称TSP实现调用addVars添加变量时报list无Keys属性的问题咨询
问题原因与解决方法
报错根因
错误的核心原因有两个:
- Python列表类型本身不存在
keys()方法,你调用Costs.Keys()(注意Gurobi官方方法里是小写的keys,大写本身也会报错)的操作本身不合法addVars()的第一个入参要求是变量的索引集合,不能直接用列表的方法获取
无需转换为字典的实现方案
你完全不需要把成本列表转为字典就可以正常添加变量,对称TSP场景下成本多为n×n的二维列表,按如下方式编写代码即可:
# n为城市数量,Costs为n行n列的二维成本列表 n = len(Costs) # 先按城市索引范围创建二元变量x[i,j],表示是否选择i到j的路径 x = m.addVars(n, n, vtype=GRB.BINARY, name='x') # 逐变量设置目标函数的成本系数 for i in range(n): for j in range(n): x[i,j].Obj = Costs[i][j]
如果是对称TSP需要优化变量数量,只创建i<j的变量,也可以按如下方式编写:
n = len(Costs) x = m.addVars(((i,j) for i in range(n) for j in range(i+1, n)), vtype=GRB.BINARY, name='x') for i,j in x.keys(): x[i,j].Obj = Costs[i][j]
可选:转字典后直接传参的方案
如果你偏好直接在addVars方法中传入obj参数,也可以把成本列表转为字典,实现代码如下:
n = len(Costs) # 二维列表转成本字典 cost_dict = {(i,j): Costs[i][j] for i in range(n) for j in range(n)} x = m.addVars(cost_dict.keys(), vtype=GRB.BINARY, obj=cost_dict, name='x')
内容的提问来源于stack exchange,提问作者lori
相关产品推荐
相关产品推荐

