Parameters AMPL中的稀疏矩阵

Parameters AMPL中的稀疏矩阵,parameters,null,sparse-matrix,missing-data,ampl,Parameters,Null,Sparse Matrix,Missing Data,Ampl,我在AMPL中有一个稀疏矩阵。因此,它包含许多编码为“”的值。AMPL中的“.”值表示“此处未指定任何值”。当我尝试解决优化问题时,收到一条消息,该消息针对包含“.”的单元格,读作“未为…指定任何值”。因此,它无法解决问题 但是,当我尝试指定一个默认值来替换“.”时,问题会反复出现,无法解决。是否有任何方法可以对参数设置限制,使解算器不会查看“.”值 希望这足够清楚。您可以使用稀疏矩阵,而不是指定默认值。例如: param m integer > 0; set C withi

我在AMPL中有一个稀疏矩阵。因此,它包含许多编码为“”的值。AMPL中的“.”值表示“此处未指定任何值”。当我尝试解决优化问题时,收到一条消息,该消息针对包含“.”的单元格,读作“未为…指定任何值”。因此,它无法解决问题

但是,当我尝试指定一个默认值来替换“.”时,问题会反复出现,无法解决。是否有任何方法可以对参数设置限制,使解算器不会查看“.”值


希望这足够清楚。

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

   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}
上的索引


另请参见。

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

话虽如此,如果你真的有一个大的稀疏矩阵,使用下面的公式代替。它确实利用了“内部”的结构,并且应该为您节省一些内存

参数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;

@jacobgrindal别忘了接受答案(如果有用=),你的解决方案似乎有效。然而,与你的矩阵(它是数字索引({1..4,1..4})不同,我的矩阵是分类索引的{ID_数,ID_数)。然而,它是对称的,所以只需要一半。我如何只引用一半,因为我不能在C:I>=j}中使用:{(I,j)),因为I和j不是数字。你可以将ID_数设置为有序集并使用索引{(i,j)在C:ord(i,ID_数)>=ord(j,ID_数)}。