GLPK报错「i not defined」求助:模型变量未定义问题排查
解决GLPK模型中"i not defined"错误的思路
首先,咱们来拆解这个错误的根源:你碰到的pv.mod:9: i not defined报错,核心问题是运算符优先级导致sum的作用范围不完整。
看你原目标函数的写法:
minimize surface: sum{i in I} p[i,1]-(p[i,2] * S)-(p[i,3] * O)-(p[i,4] * E);
在GLPK的语法规则里,sum的作用范围默认只覆盖紧跟它的第一个表达式项(也就是p[i,1]),后面的-(p[i,2] * S)等部分不在{i in I}的循环作用域内——这时候这些部分里的变量i就成了无定义的状态,自然触发错误。
具体修复步骤:
- 给sum内的整个表达式加括号,确保所有包含
i的项都被纳入循环范围:
minimize surface: sum{i in I} (p[i,1] - p[i,2] * S - p[i,3] * O - p[i,4] * E);
这样sum会遍历集合I里的每一个i,先计算每个i对应的p[i,1] - p[i,2]*S - ...,再把所有结果累加,完全符合你原本的目标函数逻辑。
检查集合定义的完整性:
- 要确保在模型的数据部分(或通过命令行输入)给集合
I和J指定了具体元素,比如:data; set I := 1 2 3; # 示例元素,根据你的实际需求调整 set J := 1 2 3 4; - 如果集合
I是空的,也会引发类似的未定义错误,所以一定要保证I有可迭代的实际元素。
- 要确保在模型的数据部分(或通过命令行输入)给集合
验证参数
p的维度匹配:
确认参数p{i in I, j in J}的索引和你使用的p[i,1]、p[i,2]等一致——比如集合J必须包含1、2、3、4这几个元素,不然会出现索引越界的新错误。
修复后的完整模型示例:
param nbpdt; set J; set I; param p{i in I, j in J}; var S, integer, >=0; var O, integer, >=0; var E, integer, >=0; # 目标函数:最小化面积(修复后) minimize surface: sum{i in I} (p[i,1] - p[i,2] * S - p[i,3] * O - p[i,4] * E);
内容的提问来源于stack exchange,提问作者Romain CAILLIERE
相关产品推荐
相关产品推荐

