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

问题描述 投票:1回答:1

我一直在尝试在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
initialization julia sparse-matrix julia-jump
1个回答
1
投票

SparseAxisArray只是Dict顶部的薄包装纸。定义为当用户在JuMP宏中创建容器时,无论他得到的是ArrayDenseAxisArray还是SparseAxisArray,它的行为都尽可能地接近彼此,因此用户不需要关心他从大多数手术中获得的收益。因此,我们不能仅创建Dict,因为它作为数组的行为不同。例如,您不能将多个索引设为getindex来执行x[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]
© www.soinside.com 2019 - 2024. All rights reserved.