AMPL переменный размер набора итераций
Я изучаю AMPL, чтобы потом использовать его в своих программах. У меня есть маленький вопрос, хотя я не смог найти его ответ.
Предположим, у меня есть набор, этот набор будет содержать некоторые подмножества, эти подмножества могут отличаться по своим размерам. Например:
set x:= (a,b,c) (a,c) (d,t,r,e,s);
и так далее..
Теперь я хочу написать ограничение, которое будет иметь дело со всеми элементами в каждом подмножестве (аналогично циклу, который будет перебирать a,b и 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 ответ
У вас может быть индексированный набор в 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