AMPL 中定义范围之外的变量索引

Variable indexes outside of defined range in AMPL

不太熟悉 AMPL,但是 运行 遇到一些索引问题...

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

var array{i in set};

而且我需要在某些约束条件下检查给定 i 周围的元素:

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

但显然 array[0]array[card(set) + 1] 不存在。要添加一个进一步的问题,我正在尝试对一种问题进行建模,其中 array[0]array[card(set) + 1] 根本不应该被考虑到我们的计算中(例如,它不应该限制其他变量).任何帮助表示赞赏 :) 谢谢。

在 AMPL 中,您可以为有效索引创建或定义自己的 "sets" 并在您的约束中使用它们。

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

我们付出的代价是我们必须明确处理极端情况。

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

param N > 0;      #number of elements

set ELEM;         # Elements    
set inner_i {2..(N-1)} > 0; #valid indices

var array {ELEM} >= 0;

subject to LimitSum{i in inner_i}:
    array[i-1] + array[i] + array[i+1] <= 12;

#Take care of the boundary conditions explicitly, if needed
subject to LimitSum_start:
    array[1] + array[2] <= 12;
    #only two elements since array[0] doesn't exist.

subject to LimitSum_last:
    array[N-1] + array[N] <= 12;
    #only two elements since array[N+1] doesn't exist.

希望这能帮助你前进。

您可以使用 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;

其中 N 是集合的最后一个元素。