变化大小集生成的AMPL矩阵

时间:2017-06-07 13:15:46

标签: set ampl

我有一个与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循环填充/更新该矩阵的每个元素。因此,矩阵的每个元素都将包含一个集合。这些元素/集合的大小可以不同。

1 个答案:

答案 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"您的代码段开头的语句。