我的问题是: 如何使用SUBSET(一个不连续的集合)来引用另一个集合中的索引位置而不是实际值?我看到ord()可以用来返回一个集合中一个值的位置,但我想要反过来...
我之所以需要这个:
我有一个模型,其中一些set和data语句大致是:
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}等。< / p>
我从一个看起来像这样的文件中读入了另一个不连续的集合(下面是的是错误的语法,“......”只是意味着该模式一直持续到达到1000所以我不知道必须输入所有内容):
set SUBSET := {6,7,8,9,10, 16,17,18,19,20, 26,27.....}
一旦myTIME递增使得它不再包含“6”,我从约束中得到一个下标未定义的错误,我理解这是因为在这种情况下myTIME是{7..1007}因此在下面,tSUB = 6导致ALPHA [6]并且未定义:
subject to CONSTRAINT {tSUB in SUBSET}:
ALPHA [tSUB] = ALPHA[last(tSUB)];
我想要的是能够使用SUBSET始终引用ALPHA,DATA等的相同索引位置。 所以:
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.
(我是Ampl的新手并且很难解决索引和设置工作的问题 - 如果有什么不合理的话,请询问并且我会尝试澄清。如果你认为它会更有帮助看到我的实际代码,我会尝试清理公司数据并发布它。此外,上面的一些代码位具有糟糕的语法。它们不是从我的代码中复制的,只是近似试图解释我的问题。 :)