【问题标题】:Sparse Matrix in AMPLAMPL 中的稀疏矩阵
【发布时间】:2015-04-29 22:25:05
【问题描述】:

我在 AMPL 中有一个稀疏矩阵。因此,它包含许多编码为“.”的值。这 ”。” AMPL 中的值表示“此处未指定值”。当我尝试解决优化问题时,我收到一条消息“没有为...指定值”,参考包含“。”的单元格。因此,它不会解决问题。

但是,当我尝试指定一个默认值来替换“.”时,问题会不断流失并且无法解决。有什么办法可以对参数设置限制,以便求解器不查看“。”价值观?

希望这已经足够清楚了。

【问题讨论】:

    标签: parameters null sparse-matrix missing-data ampl


    【解决方案1】:

    您可以使用稀疏矩阵,而不是指定默认值。例如:

       param m integer > 0; 
       set C within {1..m,1..m}; 
       param A{C}; 
    
       data;
       param m := 4; 
       param: C: A:    1  2  3  4 := 
                  1   36  .  . -2 
                  2    .  7  3  . 
                  3    .  . -8 16 
                  4   12  3  . 77 ; 
    

    在您的模型中,您应该将{i in 1..m, j in 1..m} 上的索引替换为{(i,j) in C} 上的索引。

    另见https://groups.google.com/d/msg/ampl/1s1X-UNSCg4/RWZm0sVa0IQJ

    【讨论】:

    • @jacobgrindal 不要忘记接受答案(如果有用的话=))
    • 您的解决方案似乎有效。但是,与您的矩阵(按数字索引({1..4,1..4})不同,我的矩阵按类别索引{ID_Number,ID_Number)。但是,它是对称的,所以只需要一半。由于我不能使用 {(i,j) in C: i >= j} 因为 i 和 j 不是数字,所以我该如何只引用一半。
    • 您可以将 ID_Number 设为有序集并在 C 中使用索引 {(i,j): ord(i, ID_Number) >= ord(j, ID_Number)}。
    【解决方案2】:

    用点(或句点)表示无用的值并不是我所说的“稀疏”。它可能会节省操作时间,但它会使用与密集表示一样多的内存。 话虽如此,上面的例子也不是我所说的稀疏。很多位置都是非零的。

    话虽如此,如果您确实有一个大型稀疏矩阵,请改用下面的公式。它确实利用了“内部”结构,应该可以节省一些内存。

    参数 m 整数 > 0;

    在 {1..m,1..m} 内设置 C;

    参数 A{C};

    数据;

    参数 m := 4;

    参数:C:A:=

       1 1 36
    
       1 4 -2
    
       2 2 7
    
       2 3 3
    
       3 3 -8
    
       3 4 16
    
       4 1 12
    
       4 2 3
    
       4 4 77;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 2012-01-10
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多