AMPL 语法错误偏移量 1067

AMPL syntax error offset 1067

我的代码中有语法错误,有人可以帮助我吗?

set surgery; 
set OOR;
set OR{surgery};
set surgeon ordered;
set aa{surgeon};

param S>0;
param time{i in surgery}>=0;
#param aa{i in surgery}>=0;#病人对应的医生
var st{i in surgery,m in  OR[i]}>=0;
var et{i in surgery,m in  OR[i]}>=0;
var x{i in surgery,m in OR[i]} integer binary;
#var y{i in surgery,a in stage, b in stage:a<>b} binary;
var z{c in surgeon,k in aa[c],l in aa[c],m in OR[k],n in OR[l]:k>l or k<l} binary;
var n{i in surgery,k in surgery,m in OR[i] inter OR[k]:k>i or k<i} binary;

var C;


minimize t:C;
subject to seven{i in surgery,m in OR[i]}:
st[i,m]+time[i]*x[i,m]<=C;#目标

subject to choose{i in surgery}:
sum{m in OR[i]}x[i,m]=1;#至少选择一个

subject to time2{i in surgery,j in OR[i]}:
et[i,j]=st[i,j]+time[i]*x[i,j];#et计算公式

subject to OR1{i in surgery,k in surgery,m in OR[i] inter OR[k]:k>i}:
et[i,m]-st[k,m]<=S*n[i,k,m];

subject to OR2{i in surgery,k in surgery,m in OR[i] inter OR[k]:k>i}:
et[k,m]-st[i,m]<=S*(1-n[i,k,m]); 


subject to doctor1{c in surgeon,k in aa[c],l in aa[c],m in OR[k],n in OR[l]:k>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>l}:
et[k,m]-st[l,n]<=S*(1-z[c,k,l,m,n]);

以上是我的代码,我收到一条消息:

4.mod,第 37 行(偏移量 1067): 语法错误

第37行是:subject to doctor1{c in surgeon,k in aa[c],l in aa[c],m in OR[k],n in OR[l]:k>l }:

谁能说说原因?非常感谢!

您已经在程序的第 15 行将 n 定义为索引变量。现在您在约束定义中引用 n 。我猜它不应该与您作为变量创建的 "n" 相同。在任何情况下,您都不允许在这样的约束索引中使用变量,因此 AMPL 会给出错误消息。

AMPL "syntax error" 消息对于找出此类问题的原因不是很有帮助。给我一个线索的一件事是,即使 "m in OR[k]" 部分与 "l in OR[l]" 具有完全相同的格式并出现在它之前,但该部分不会触发错误消息。

{c in surgeon,k in aa[c],**m in OR[k]**,l in aa[c],**n in OR[l]**: k>l}

我尝试将 k & m 项与 l & n 项交换:

{c in surgeon,l in aa[c],n in OR[l],k in aa[c],m in OR[k]: k>l}

并且错误仍然与 "n in OR[l]" 有关。这清楚地表明 n 或 l 有一些特别之处,所以我在程序的其他地方查看并注意到您已经声明了 n。

(顺便说一句,这是使用有意义的变量名而不是仅仅调用 "n" 和 "aa"... 的好理由)