AMPL: определить ограничения в определенных элементах набора - PullRequest
0 голосов
/ 16 октября 2018

У меня есть такая структура:

set U;
param d {i in U};

Как добавить ограничения в первый, второй и третий элемент d ?

Я абстрагируюразмер U потому что я думаю, что это лучше, но на самом деле, для моей проблемы, U имеет только 3 элемента, как и d .

Я бы не хотел создавать 3 параметра для U и 3 параметра для d .

1 Ответ

0 голосов
/ 19 октября 2018

Когда вы это реализовали, 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 для получения дополнительной информации о заказанных наборах.

...