AMPL代码执行报错:Assingment_3.mod第11行存在语法错误求助
解决AMPL代码语法错误的方案
错误根源
代码里的reset;语句位置错误——它会清除所有之前的AMPL定义,包括你刚定义的BOXES集合。后续定义Volume参数时,试图用1-8这些BOXES的元素作为索引,但此时BOXES已被清除,解析器无法识别这些索引值,直接触发语法错误。
修复方法
要么删除reset;语句,要么将它移到代码最开头(如果确实需要清除之前的定义),确保集合定义在reset操作之后。
修复后的完整代码
# 可选:清除之前的AMPL定义,放在代码开头 reset; # 定义箱子集合 set BOXES := 1..8; set TRUCKS := 1..2; param Volume := 1 30 2 60 3 70 4 20 5 10 6 10 7 50 8 50; param Priority := 1 2 # 箱子1优先级2(食品) 2 3 # 箱子2优先级3(紧急) 3 2 # 箱子3优先级2(食品) 4 2 # 箱子4优先级2(食品) 5 3 # 箱子5优先级3(紧急) 6 3 # 箱子6优先级3(紧急) 7 1 # 箱子7优先级1(普通) 8 4; # 箱子8优先级4(紧急食品) var x{BOXES, TRUCKS} binary; maximize TotalPriority: sum{i in BOXES, j in TRUCKS} Priority[i] * x[i,j]; subject to VolumeConstraint{j in TRUCKS}: 140 <= sum{i in BOXES} Volume[i] * x[i,j] <= 160; subject to OneTruckEach{i in BOXES}: sum{j in TRUCKS} x[i,j] = 1;
额外提示
- 若必须使用
reset;,务必将其放在所有集合、参数定义的最前面,避免刚定义的元素被清除后无法引用。 - AMPL中参数的索引依赖已存在的集合,因此集合定义必须在使用其元素的参数之前。
内容的提问来源于stack exchange,提问作者Heloise Carrer
相关产品推荐
相关产品推荐

