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

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就成了无定义的状态,自然触发错误。

具体修复步骤:

  1. 给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 - ...,再把所有结果累加,完全符合你原本的目标函数逻辑。

  1. 检查集合定义的完整性:

    • 要确保在模型的数据部分(或通过命令行输入)给集合I和J指定了具体元素,比如:
      data;
      set I := 1 2 3;  # 示例元素,根据你的实际需求调整
      set J := 1 2 3 4;
      
    • 如果集合I是空的,也会引发类似的未定义错误,所以一定要保证I有可迭代的实际元素。
  2. 验证参数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:42