Variables 变量索引超出AMPL中定义的范围

Variables 变量索引超出AMPL中定义的范围,variables,indexing,set,linear-programming,ampl,Variables,Indexing,Set,Linear Programming,Ampl,不太熟悉AMPL,但在索引方面遇到了一些问题 基本上,我定义了一些变量: var array{i in set}; 我需要在一些约束条件下对给定的I周围的元素进行一定量的检查: subject to Constraint{i in set}: array[i] + array[i-1] + array[i+1] <= 12; 受约束{i in set}: 数组[i]+数组[i-1]+数组[i+1]在AMPL中,您可以为有效索引创建或定义自己的“集”,并在约束中使用它们 因此,在

不太熟悉AMPL,但在索引方面遇到了一些问题

基本上,我定义了一些变量:

var array{i in set};
我需要在一些约束条件下对给定的
I
周围的元素进行一定量的检查:

subject to Constraint{i in set}:
    array[i] + array[i-1] + array[i+1] <= 12;
受约束{i in set}:

数组[i]+数组[i-1]+数组[i+1]在AMPL中,您可以为有效索引创建或定义自己的“集”,并在约束中使用它们

因此,在您的情况下,为了避免无效索引,您可以定义一组允许的索引:
param internal_i{2..(N-1)}
,并在创建约束时循环这些索引

我们所付出的代价是,我们必须明确地处理角落案件

这里有一种方法:(注意,我没有加载AMPL,因此代码未经测试。)

param N>0#元素数
集合元素元素
设置内部_i{2..(N-1)}>0#有效指数
变量数组{ELEM}>=0;
受限于LimitSum{i in inner_i}:

array[i-1]+array[i]+array[i+1]您可以使用if-then-else表达式有条件地包括一些术语:

subject to Constraint{i in set}:
    array[i] + (if i != 0 then array[i-1]) + (if i != N then array[i+1]) <= 12;
受约束{i in set}:

数组[i]+(如果i!=0,那么数组[i-1])+(如果i!=N,那么数组[i+1])内部_i应该是一个集合而不是一个参数:
set-internal_i=2..N-1是的,谢谢您的关注。我更新了回复。
subject to Constraint{i in set}:
    array[i] + (if i != 0 then array[i-1]) + (if i != N then array[i+1]) <= 12;