使用OR-Tools CP-SAT添加约束时出现TypeError错误求助
OR-Tools CP-SAT构建约束时出现TypeError错误
问题背景
使用Python结合OR-Tools 9.9.3963版本的CP-SAT模块求解约束满足问题,在构建变量约束时触发如下错误:
File "D:\Python39\lib\site-packages\ortools\sat\python\cp_model.py", line 342, in get_integer_var_value_map raise TypeError("Unrecognized linear expression: " + str(expr)) TypeError: Unrecognized linear expression: -3.0
对应的约束构建代码:
for v in range(len(self.solution)): for s in range(len(schedule[v])): self.a[v, s] = self.model.NewIntVar(0, self.data.num_T, f'a_{v}_{s}') for v in range(len(self.solution)): for s in range(len(self.schedule[v]) - 1): lhs = self.a[v, s + 1] - self.a[v, s] if self.schedule[v][s][1:] == self.schedule[v][s + 1][1:]: rhs = self.dwell_times[v][int(s / 2)] else: rhs = self.data.travel_time[ (int(self.schedule[v][s][1:]), int(self.schedule[v][s + 1][1:]))] name = f"a_{v}_{s}" print(lhs) print(rhs) self.model.Add(lhs >= rhs)
根本原因
- 数据类型不匹配:你定义的
a[v,s]是整数变量(IntVar),因此lhs是整数线性表达式,但rhs是浮点数类型(如报错中的-3.0),CP-SAT要求整数变量的表达式只能与整数常数进行比较,浮点数会导致线性表达式解析失败。 - 业务数据错误:
rhs出现负数,不符合实际场景(停留时间、旅行时间不可能为负),说明dwell_times或travel_time数据集存在非法值。
修复方法
- 修正非法数据:检查
dwell_times和travel_time的数据源,找出并修正其中的负数错误,确保所有时间值为非负整数。 - 统一数据类型:将
rhs转换为整数类型后再传入约束,避免浮点数导致的解析问题。
修改后的代码片段:
for v in range(len(self.solution)): for s in range(len(self.schedule[v]) - 1): lhs = self.a[v, s + 1] - self.a[v, s] if self.schedule[v][s][1:] == self.schedule[v][s + 1][1:]: rhs = self.dwell_times[v][int(s / 2)] else: rhs = self.data.travel_time[ (int(self.schedule[v][s][1:]), int(self.schedule[v][s + 1][1:]))] # 排查并修正负数时间值 if rhs < 0: raise ValueError(f"非法负数时间值: v={v}, s={s}, 值={rhs}") # 转换为整数 rhs_int = int(rhs) name = f"a_{v}_{s}" print(lhs) print(rhs_int) self.model.Add(lhs >= rhs_int)
内容的提问来源于stack exchange,提问作者Wang Yiran
相关产品推荐
相关产品推荐

