AMPL代码出现offset 1067语法错误,请求协助排查原因
排查AMPL代码中的语法错误
我帮你定位到了第37行语法错误的核心原因,以及对应的修正方案:
错误根源
你在doctor1和doctor2约束的索引条件中使用了k>l进行元素大小比较,但k和l属于aa[c]集合,而aa[c]的元素来自未被声明为**有序集合(ordered)**的surgery集合。AMPL的语法规则明确要求:只有当集合被标记为ordered时,才能使用<、>这类大小比较运算符来比较集合内的元素。
你的代码里仅给surgeon集合加了ordered标记,而核心的surgery集合只是普通集合:
set surgery; # 未声明为ordered,无法进行元素大小比较
修正方案
有两种可行的修正方式,你可以根据需求选择:
方式1:将surgery声明为有序集合
修改surgery的定义,添加ordered关键字,直接支持元素大小比较:
set surgery ordered;
这样k>l这类比较逻辑就会被AMPL识别为合法的索引条件,同时也能保留你原本避免重复处理(k,l)和(l,k)对的设计意图。
方式2:替换大小比较为唯一性判断(无需修改集合类型)
如果你不需要surgery集合是有序的,可以把k>l替换为k ne l(ne是AMPL中“不等于”的缩写),同时调整变量定义避免约束重复:
# 先修改z变量的定义,只保留k≠l的情况 var z{c in surgeon,k in aa[c],l in aa[c],m in OR[k],n in OR[l]:k ne l} binary; # 再修改约束条件 subject to doctor1{c in surgeon,k in aa[c],l in aa[c],m in OR[k],n in OR[l]:k ne l}: et[l,n]-st[k,m]<=S*z[c,k,l,m,n]; subject to doctor2{c in surgeon,k in aa[c],l in aa[c],m in OR[k],n in OR[l]:k ne l}: et[k,m]-st[l,n]<=S*(1-z[c,k,l,m,n]);
不过这种方式会生成重复的约束对((k,l)和(l,k)),可能会增加求解器的计算负担,更推荐第一种方案。
额外优化提示
为了避免潜在的类型不匹配问题,建议明确aa集合的元素类型,指定它是surgery的子集:
set aa{surgeon} subsetof surgery;
内容的提问来源于stack exchange,提问作者X.Xiao
相关产品推荐
相关产品推荐

