我正在学习AMPL,这样我以后可以在我的课程中使用它。我有一个小问题,但我还没有找到答案。
假设我有设置,此设置将包含一些子集,这些子集的维度可能不同。例如:
set x:= (a,b,c) (a,c) (d,t,r,e,s);
依旧......
现在我想写一个约束,它必须处理每个子集中的所有元素(类似于将在 a , b 和<之间迭代的循环第一个子集中的strong> c ,第二个子集中的 a 和 c ,依此类推)。问题是我们不知道每个的大小,所以我们不能使用以下内容:
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
答案 0 :(得分: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