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

对称TSP实现调用addVars添加变量时报list无Keys属性的问题咨询

问题原因与解决方法

报错根因

错误的核心原因有两个:

  1. Python列表类型本身不存在keys()方法,你调用Costs.Keys()(注意Gurobi官方方法里是小写的keys,大写本身也会报错)的操作本身不合法
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:04