【问题标题】:Saving multiple sparse arrays in one big sparse array将多个稀疏数组保存在一个大稀疏数组中
【发布时间】:2020-06-16 12:05:34
【问题描述】:

我一直在尝试在 Julia JuMP 中实现一些代码。我的代码的想法是,我的 while 循环中有一个运行 S 次的 for 循环。在每个循环中,我解决一个子问题并获得一些变量,如果子问题是最优的,则选择 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

【问题讨论】:

  • zeros 不会创建稀疏数组。如果你使用spzeros会发生什么?
  • spzeros 给出了一个SparseMatrixCSC,其中设置元素是为了提高效率。使用 SparseMatrixArray 是一个好主意,因为设置元素是 O(1),因为它在内部使用 dict
  • 其实spzeros用三个维度不会返回SparseMatrixCSC。由于没有维度为 3 的稀疏数组,因此会出错。

标签: initialization julia sparse-matrix julia-jump


【解决方案1】:

SparseAxisArray 只是Dict 顶部的薄包装。 它被定义为当用户在 JuMP 宏中创建一个容器时,无论他得到ArrayDenseAxisArray 还是SparseAxisArray,它的行为都尽可能地相互接近,因此用户不需要关心他为大多数操作获得了什么。 出于这个原因,我们不能只创建一个Dict,因为它的行为与数组不同。例如,您不能使用多个索引作为x[2, 2] 来执行getindex。 在这里,您可以根据需要使用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]

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2011-02-02
    • 2020-11-22
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多