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
Другие вопросы по тегам