【问题标题】:Variable indexes outside of defined range in AMPL超出 AMPL 定义范围的变量索引
【发布时间】:2015-06-02 06:20:40
【问题描述】:

对 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] 根本不应该被考虑到我们的计算中(例如,它不应该约束其他变量)。任何帮助表示赞赏:) 谢谢。

【问题讨论】:

    标签: variables indexing set linear-programming ampl


    【解决方案1】:

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

    因此,在您的情况下,为避免无效索引,您可以定义一组允许的索引: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.
    

    希望这可以帮助您继续前进。

    【讨论】:

    • inner_i 应该是一个集合而不是一个参数:set inner_i = 2..N-1;
    • 是的,感谢您了解这一点。我更新了回复。
    【解决方案2】:

    您可以使用 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 是集合的最后一个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多