AMPL语法错误偏移量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 行是:受制于 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"语法错误"消息对于找出此类问题的原因不是很有帮助。给我线索的一件事是,即使"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}

并且该错误仍与"OR[l]中的n"相关联。这很清楚,n或l有一些特别之处,所以我在程序的其他地方寻找,注意到你已经声明了n。

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

最新更新