Когда вы это реализовали, U - неупорядоченный набор.Это означает, что «первый элемент U» четко не определен.Поскольку U - это индекс, установленный для d, из этого следует, что «первый элемент d» также не определен четко.
Например, рассмотрим следующий код:
set U := {"fish","chips","salt"};
var d{U} := 0;
solve;
display d;
ответ отображается как:
d [*] :=
chips 0
fish 0
salt 0
;
Обратите внимание, что AMPL отсортировал элементы U в порядке, отличном от того, в котором я их объявил.(В частности, он их в алфавитном порядке.)
Таким образом, ответ на этот вопрос зависит от того, что именно вы подразумеваете под «добавить ограничения в первый, второй и третий элемент d».
Если выпросто хотите применить то же самое ограничение к каждому члену d, вы можете использовать одно ограничение, индексированное по U:
set U := {"fish","chips","salt"};
var d{U};
s.t. constrain_all{u in U}: d[u] >= 0;
Если вы хотите применить определенное ограничение к каждому членуd по имени , вы можете использовать аналогичный формат:
set U := {"fish","chips","salt"};
var d{U};
s.t. constrain_fish: d["fish"] >= 0;
s.t. constrain_chips: d["chips"] >= 5;
s.t. constrain_salt: d["salt"] >= 10;
Если у вас есть определенный порядок на U, то вам нужно объявить U как упорядоченный набор .Каждый элемент U затем имеет определенную мощность в этом наборе, и вы можете использовать функции «member» и «ord» для ссылки на элементы U по позиции.Например:
set U := {"fish","chips","salt"} ordered;
var d{U};
s.t. constrain_fish: d["fish"] >= 0;
s.t. constrain_chips: d["chips"] >= 5;
s.t. constrain_salt: d["salt"] >= 10;
s.t. constrain_second_member_of_U: d[member(2,U)] >= 25;
minimize of: sum{u in U} d[u];
solve;
display d;
Как написано, для этого требуется, чтобы d ["chips"] был больше или равен 25. Однако, если я изменил объявление U с {"fish", "chips", "salt"} to {"chips", "fish", "salt"}, это ограничение теперь будет применяться к d ["fish"] вместо d ["chips"].
Если бы я хотел установить ограничение для (скажем) 5-10-го членов d, я мог бы написать что-то вроде:
s.t. constrain_5th_to_10th{u in U: ord(u,U) >= 5, ord(u,U) <= 10}: d[u] >= 100;
См. главу 5 Книги AMPL для получения дополнительной информации о заказанных наборах.