1

我正在学习 AMPL,以便稍后在我的程序中使用它。我有一个小问题,虽然我还没有找到答案。

假设我有一个set,这个set将包含一些子集,这些子集的维度可能不同。例如:

set x:= (a,b,c) (a,c) (d,t,r,e,s);

等等 ..

现在我想编写一个约束,它必须处理每个子集中的所有元素(类似于一个循环,它将在第一个子集中的abc之间迭代,在第二个子集中的 ac之间迭代,依此类推)。问题是我们不知道每个的大小,所以我们不能使用以下内容:

set x dimen 3;
subject to constraint {(i,j,k) in x}: "some constraint";
data;
set x:= (a,b,c) (a,c) (d,t,r,e,s);

有没有办法这样做?如果是,您能否提供一些示例代码或链接以供学习?提前致谢。感谢您的帮助:D

4

1 回答 1

1

您可以在 AMPL 中有一个索引集,它是一种“集集”,但它的所有元素都应该具有相同的维度:

set S;
set T{S} dimen 3; # indexed set with all elements of dimension 3 (triples).

但是,您可以使用参数实现相同的效果:

set V ordered;
param values{V} symbolic;

# Indices in values where each subset starts.
set Indices ordered;

data;
param:
V: values :=
 1 a
 2 b
 3 c
 4 a
 5 c
 6 d
 7 t
 8 r
 9 e
10 s;

set Indices := 1 4 6 11;

print {i in Indices: i != last(Indices)}: {j in i .. next(i) - 1} values[j];

运行此代码将打印

a b c
a c
d t r e s
于 2014-07-15T14:20:19.173 回答