Parameters AMPL中的稀疏矩阵
我在AMPL中有一个稀疏矩阵。因此,它包含许多编码为“”的值。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
希望这足够清楚。您可以使用稀疏矩阵,而不是指定默认值。例如:
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_数)}。