为什么CPLEX运行约束代码时报错"name j2 does not exist"?
CPLEX报错"name j2 does not exist"问题排查
核心错误原因
你遇到的报错是forall循环作用域配置错误导致的:
- CPLEX的
forall语法默认仅对紧随其后的第一条语句生效,如果你需要让forall遍历的变量作用于多条约束,必须用花括号{}将所有对应约束包裹在循环体内。 - 你当前的代码中,第二条约束
(T[j1][r] >= ...)完全处于forall (j1, j2 in J)的作用域之外,解释器解析到这条约束时找不到j1、j2、r的定义,就会抛出变量不存在的报错。
另外你注释中标注了需要j1 != j2的过滤条件,现有代码的forall没有添加对应过滤,后续运行也会出现j1、j2取值相同的无效迭代问题,建议同步修正。
修正后代码
subject to { forall (r in R) { forall (j1, j2 in J: j1 != j2) // 增加j1不等于j2的过滤条件 { (T[j2][r] >= C[j1] - bigM*(1-Q[j1][j2][r]) - bigM*(2-z[j1][r]-z[j2][r])); (T[j1][r] >= C[j2] - bigM*Q[j1][j2][r] - bigM*(2-z[j1][r]-z[j2][r])); } } }
修正点说明
- 给两层
forall循环都添加了花括号{},确保两条约束都在r、j1、j2的作用域范围内 - 在
forall (j1, j2 in J)后添加了: j1 != j2的过滤逻辑,匹配你注释里的业务要求,避免无效迭代
内容的提问来源于stack exchange,提问作者Francesca
相关产品推荐
相关产品推荐

