在一个大的稀疏数组中保存多个稀疏数组

时间:2020-06-16 12:05:34

标签: initialization julia sparse-matrix julia-jump

我一直试图在Julia JuMP中实现一些代码。我的代码的想法是,我的while循环中有一个for循环,运行S次。在这些循环的每一个中,我都会解决一个子问题,并获得一些变量,如果子问题最优,则获得opt = 1;如果不是最优问题,则获得opt = 0。根据opt的值,我有两种约束,要么是最优削减(如果opt = 1),要么是可行性削减(如果opt = 0)。因此,我的代码的目的是,如果s = 1:S没有可行性削减,则仅添加所有最优性削减(即每次迭代从1:S得到opt = 1)。 我正在寻找的是一种更好的方法来保存ubar,vbar和wbar的值。目前,我使用for循环一次保存一个,这非常昂贵。 所以问题是我的ubar,vbar和wbar的值是稀疏轴数组。我试图以其他方式保存它们,例如制作3d稀疏轴阵列,由于无法弄清楚如何对其进行初始化,所以我无法使用它。

下面的代码可以正常工作(在我的<>中插入正确的代码),但是效果却不理想。因此,如果有某种方法可以更有效地保存2d稀疏轴数组的值,我很想知道!预先谢谢你!

ubar2=zeros(nV,nV,S)
vbar2=zeros(nV,nV,S)
wbar2=zeros(nV,nV,S)
while <some condition>
    opts=0
    for s=1:S
        <solve a subproblem, get new ubar,vbar,wbar and opt=1 if optimal or 0 if not>
        opts+=opt
        if opt==1
            # Add opt cut Constraints
            for i=1:nV
                for k=1:nV
                    if i!=k
                        ubar2[i,k,s]=ubar[i,k]
                    end
                end
                for j=i:nV
                    if links[i,j]==1
                        vbar2[i,j,s]=vbar[i,j]
                        wbar2[i,j,s]=wbar[i,j]
                    end
                end
            end
        else
            # Add feas cut Constraints
            @constraint(mas, <constraint from ubar,vbar,wbar> <= 0)
            break
        end
        if opts==S
            for s=1:S
               @constraint(mas, <constraint from ubar2,vbar2,wbar2> <= <some variable>)
            end
        end
    end

1 个答案:

答案 0 :(得分:1)

SparseAxisArray只是Dict顶部的薄包装。 定义为,当用户在JuMP宏中创建容器时,无论他得到的是ArrayDenseAxisArray还是SparseAxisArray,它的行为都尽可能地接近彼此用户无需关心他在大多数操作中获得了什么。 由于这个原因,我们不能仅仅创建一个Dict,因为它的行为与数组不同。例如,您不能使用多个索引作为getindexx[2, 2]。 在这里,您可以根据需要使用DictSparseAxisArray。 它们都具有O(1)复杂性,用于设置和获取新元素以及稀疏的存储,似乎足以满足您的需求。 如果选择SparseAxisArray,则可以使用

进行初始化
ubar2 = JuMP.Containers.SparseAxisArray(Dict{Tuple{Int,Int,Int},Float64}())

并使用

进行设置
ubar2[i,k,s]=ubar[i,k]

如果选择Dict,则可以使用

进行初始化
ubar2 = Dict{Tuple{Int,Int,Int},Float64}()

并使用

进行设置
ubar2[(i,k,s)]=ubar[i,k]