OR-Tools约束定义报错TypeError: Not a number的原因咨询
OR-Tools TypeError: Not a number: duration 问题解析与修复
问题原因
你遇到的TypeError: Not a number: duration是因为OR-Tools的IntVar对象不是Python原生数值类型,不能直接用Python内置的sum()函数累加,也不能直接用*运算符做乘法操作。这些变量是模型中的抽象变量,必须使用OR-Tools提供的表达式构造工具来构建约束。
修复方案
需要替换Python原生的sum()为OR-Tools的model.Sum(),并用model.Mul()方法来构造变量与常数、变量与变量之间的乘积项。修改后的约束代码如下:
for i in list_keys: #like ("100x15","80x12", "67x8") # 逐个构造乘积表达式 constraint_terms = [] for a, b, c in dic_stock_var[i]: # 先计算常数b与变量c的乘积,再与变量a相乘 product_term = model.Mul(a, model.Mul(b, c)) constraint_terms.append(product_term) # 使用OR-Tools的Sum方法累加所有项,添加约束 model.Add(model.Sum(constraint_terms) <= dic_order[i])
关键说明
- 乘积构造:OR-Tools要求所有变量间的运算必须通过其内置方法(如
model.Mul())来生成合法的模型表达式,不能直接用Python的*运算符。 - 求和操作:Python的
sum()会尝试将每个项转换为数值,但OR-Tools变量是未赋值的模型元素,无法直接转换,必须用model.Sum()来构建累加表达式。 - 非线性约束兼容:由于你的约束中包含二元变量
a与整数变量c的乘积,属于非线性整数约束,而你使用的CP-SAT求解器(从model.NewIntVar判断)是支持这类约束的,所以上述修改可以正常运行。
内容的提问来源于stack exchange,提问作者Vincente
相关产品推荐
相关产品推荐

