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"... 的好理由)
我的代码中有语法错误,有人可以帮助我吗?
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"... 的好理由)