Indexing Ampl语法:返回集合中特定位置的值。AKA:使用一个集合作为另一个集合的索引

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集合上循环,

我的问题是: 如何使用子集(不连续集)来引用另一个集中的索引位置,而不是实际值?我知道ord()可以用来返回一个值在集合中的位置,但我想要的是相反的结果


我需要这个的原因:

我有一个模型,其中一些集合和数据语句大致如下:

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.