Variables 变量索引超出AMPL中定义的范围
不太熟悉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中,您可以为有效索引创建或定义自己的“集”,并在约束中使用它们 因此,在
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;