AMPL:在集合的特定元素中定义约束

时间:2018-10-15 22:53:04

标签: set constraints ampl

我有这样的结构:

set U;
param d {i in U};

如何在 d 的第一,第二和第三元素中添加约束?

我正在提取 U 的大小,因为我认为它更好,但是实际上,对于我的问题, U 仅包含3个元素,因此 d

我不想为 U 创建3个参数,为 d 创建3个变量。

1 个答案:

答案 0 :(得分:0)

实施此操作后,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的每个成员应用 same 约束,则可以使用在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的每个元素在该集合内都有特定的基数,您可以使用“成员”和“ 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”}更改为{“ chips “,” fish“,” salt“},该约束现在将应用于d [” fish“]而不是d [” chips“]。

如果我想对d的第5个至第10个成员设置约束,我可以写这样的东西:

s.t. constrain_5th_to_10th{u in U: ord(u,U) >= 5, ord(u,U) <= 10}: d[u] >= 100;

有关有序集的更多信息,请参见chapter 5 of the AMPL Book