AMPL变量大小设置迭代

时间:2014-07-13 23:27:04

标签: mathematical-optimization ampl

我正在学习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

1 个答案:

答案 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