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
是集合的最后一个元素。
不太熟悉 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
是集合的最后一个元素。