我有一个与AMPL有关的问题。我正在尝试构造一个集合矩阵,在下面的代码中命名为A(.mod文件的一部分)。这会给出“已定义A”的错误消息。
请注意,S,T是参数,B是.dat文件中的设置。 (它们已被我在以下代码中排除的.mod文件的前一部分读取。)
set A{s in 1..S, t in 1..T} default {};
for {s in 1..S} {
for {t in 1..T} {
/*set A{s,t} default {};*/
for {sprime in 1..S: sprime != s}{
if B[sprime,t] = B[s,t] then {
let A[s,t] := A[s,t] union {sprime};
}
}
}
}
我尝试评论第一行并取消注释第四行;然而,它没有帮助。
简而言之,我要做的是拥有一个空的A矩阵大小的SxT,然后用嵌套的for循环填充/更新该矩阵的每个元素。因此,矩阵的每个元素都将包含一个集合。这些元素/集合的大小可以不同。
答案 0 :(得分:0)
我测试了以下代码,它似乎做了你想要的,没有错误消息:
reset;
param S := 5;
param T := 3;
model;
param B{1..S,1..T};
data;
param B: 1 2 3 :=
1 1 2 3
2 2 3 2
3 0 0 3
4 1 1 1
5 3 2 3
;
model;
set A{s in 1..S, t in 1..T} default {};
for {s in 1..S}{
for {t in 1..T}{
for {sprime in 1..S: sprime != s}{
if B[sprime,t] = B[s,t] then {
let A[s,t] := A[s,t] union {sprime}};
}
}
}
我没有对您发布的部分进行重大修改,只是添加了一些定义,因此它是自包含的。但是,我确实有一个"重置"在剧本的开头。
您是否有可能忘记在两次运行中清除A的定义?如果是这样,那么你会得到一个" A已经定义了#34;错误,不是因为LET语句,而是因为"设置A"您的代码段开头的语句。