Indexing Ampl语法:返回集合中特定位置的值。AKA:使用一个集合作为另一个集合的索引
我的问题是: 如何使用子集(不连续集)来引用另一个集中的索引位置,而不是实际值?我知道ord()可以用来返回一个值在集合中的位置,但我想要的是相反的结果Indexing Ampl语法:返回集合中特定位置的值。AKA:使用一个集合作为另一个集合的索引,indexing,syntax,ampl,Indexing,Syntax,Ampl,我的问题是: 如何使用子集(不连续集)来引用另一个集中的索引位置,而不是实际值?我知道ord()可以用来返回一个值在集合中的位置,但我想要的是相反的结果 我需要这个的原因: 我有一个模型,其中一些集合和数据语句大致如下: set ALL_TIME := {0..20000}; param DATA {ALL_TIME}; #read from file in later data statement; set myTIME := {0...1000}; 我在myTIME集合上循环,
我需要这个的原因: 我有一个模型,其中一些集合和数据语句大致如下:
set ALL_TIME := {0..20000};
param DATA {ALL_TIME}; #read from file in later data statement;
set myTIME := {0...1000};
我在myTIME集合上循环,每次求解模型,然后将开始和结束增加1:{1..1001}、{2..1002}、{3..1003},等等
我从一个类似这样的文件中读取了另一个不连续的集合(下面是错误的语法,“…”表示模式将持续到达到1000,所以我不必全部键入):
一旦myTIME增加到不再包含“6”,我就会从一个约束中得到一个下标未定义的错误,我理解这是因为在本例中myTIME是{7..1007},因此在下面的例子中,tSUB=6导致ALPHA[6],并且是未定义的:
subject to CONSTRAINT {tSUB in SUBSET}:
ALPHA [tSUB] = ALPHA[last(tSUB)];
我想要的是能够使用子集始终引用ALPHA、数据等的相同索引位置。
因此:
(我是Ampl的新手,很难理解索引和集合是如何工作的——如果有什么不合理的地方,请询问,我会尽力澄清。如果你认为看到我的实际代码会更有帮助,我会尝试清理公司数据并发布)。此外,上面的一些代码位具有糟糕的语法。它们不是从我的代码中复制出来的,只是为了解释我的问题 您可以使用
成员(i,S)
获取集合S
的第i个成员,其中i
是基于1的索引,S
是有序集合。这在AMPL手册的章节中有描述。您可以通过成员(i,S)
获得集合S
的第i个成员,其中i
是一个基于1的索引,S
是一个有序集合。这在AMPL手册的章节中有描述
subject to CONSTRAINT {tSUB in SUBSET}:
ALPHA [tSUB] = ALPHA[last(tSUB)];
SUBSET[0] (which equals 6) should always be the 6th value of for example DATA:
{tSUB in SUBSET}: DATA[tSUB]. when tSUB is 0, I want the 6th value of DATA.