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

OR-Tools约束添加报错:IntVar与float不支持*运算的解决方法

OR-Tools约束报错解决方案:IntVar与float运算不支持

报错原因

OR-Tools的整数变量(IntVar)不支持直接与浮点数进行乘法运算,求解器要求线性约束的系数必须为整数类型,因此会抛出TypeError: unsupported operand type(s) for *: 'IntVar' and 'float'错误。

正确解决方案

1. 将浮点数约束转换为整数运算

把原不等式两边同时乘以2,消除浮点数系数,转化为全整数运算的约束:

# 原约束(报错版)
# routing.solver().Add(capacity_dimension.CumulVar(idx) * routing.ActiveVar(idx) >= capacity_dimension.CumulVar(routing.End(v)) * 0.5 )

# 修改后的整数约束
routing.solver().Add(
    2 * capacity_dimension.CumulVar(idx) * routing.ActiveVar(idx) >= 
    capacity_dimension.CumulVar(routing.End(v))
)

2. 修正约束逻辑(针对激活节点的条件约束)

如果你的需求是仅当节点idx被激活时才要求累积变量满足条件,上述约束在节点未激活时(ActiveVar(idx)=0)会变成0 >= CumulVar(routing.End(v)),这可能不符合预期(终点的累积变量通常为正数)。此时需要用大M法构建条件约束:

# 定义一个足够大的常数M,需大于CumulVar的最大可能值
M = 10000  # 根据你的问题规模调整

routing.solver().Add(
    2 * capacity_dimension.CumulVar(idx) >= 
    capacity_dimension.CumulVar(routing.End(v)) - 
    2 * M * (1 - routing.ActiveVar(idx))
)
  • 当ActiveVar(idx)=1(节点激活):约束等价于2*CumulVar(idx) >= CumulVar(routing.End(v)),即原需求的CumulVar(idx) >= 0.5*CumulVar(routing.End(v))
  • 当ActiveVar(idx)=0(节点未激活):约束变为0 >= CumulVar(routing.End(v)) - 2*M,由于M足够大,该式必然成立,不会干扰其他逻辑

为什么.Value()会导致内核崩溃

在添加约束的阶段,求解器还未运行,变量的.Value()方法返回的是未初始化的默认值(通常为None),而非最终求解结果。用这个无效值参与计算会导致非法的数值操作,进而引发内核崩溃。必须直接使用变量对象构建约束,不能提前调用.Value()。

内容的提问来源于stack exchange,提问作者mufassir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:45:42