set - AMPL:在集合的特定元素中定义约束
问题描述
我有这个结构:
set U;
param d {i in U};
如何在d的第一个、第二个和第三个元素中添加约束?
我正在抽象U的大小,因为我想它更好,但实际上,对于我的问题,U只有 3 个元素,所以d也是如此。
我不想为U创建 3 个参数,为d创建 3个变量。
解决方案
当你实现这个时, 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"} 更改为 {"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;
有关有序集的更多信息,请参见AMPL Book 的第 5 章。
推荐阅读
- python - 在 Python 中找到函数的最小值
- node.js - docker 容器中的 NPM 安装失败并返回“命令 '/bin/sh -c npm install' 返回非零代码:1”
- google-analytics - Google Analytics API 非常慢
- javascript - 第二次调用后变量未定义
- bash - 如何在目录中搜索 Bash 中的空文本文件?
- json - 如何阻止 DevOps REST API 将传入的 JSON 有效负载用双引号括起来?
- javascript - 我如何在按钮内的 span 内将值增加 1 个值
- android - Androidx 首选项库与数据存储首选项
- python - Named logger not writing when using dictConfig
- javascript - Axios mock adapter returns 404 on all reqeusts