首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个稀疏数组保存在一个大型稀疏数组中

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

Stack Overflow用户
提问于 2020-06-16 20:05:34
回答 1查看 81关注 0票数 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-loop一次保存一个,这是相当昂贵的。所以问题是我的ubar,vbar和wbar的值是稀疏轴数组。我试着用其他方法保存它们,比如创建一个3d稀疏轴数组,但我不能工作,因为我不知道如何初始化它。

下面的代码可以工作(当然,在我的<>中插入了正确的代码),但没有我希望的那样好。所以如果有什么方法可以更有效地保存二维稀疏轴数组的值,我很想知道!提前谢谢!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-06-17 04:46:37

SparseAxisArray仅仅是Dict顶部的一个薄薄的包装器。它的定义是,当用户在JuMP宏中创建容器时,无论他获得的是ArrayDenseAxisArray还是SparseAxisArray,它的行为都尽可能地彼此接近,因此用户不需要关心他在大多数操作中获得了什么。出于这个原因,我们不能仅仅创建一个Dict,因为它的行为与数组不同。例如,您不能使用多个索引作为x[2, 2]来执行getindex。在这里,您可以根据自己的喜好使用DictSparseAxisArray。它们在设置和获取新元素时的复杂度都为O(1),而且存储空间稀疏,似乎足以满足您的需求。如果选择SparseAxisArray,可以使用以下命令对其进行初始化

代码语言:javascript
复制
ubar2 = JuMP.Containers.SparseAxisArray(Dict{Tuple{Int,Int,Int},Float64}())

并将其设置为

代码语言:javascript
复制
ubar2[i,k,s]=ubar[i,k]

如果选择Dict,可以使用以下命令对其进行初始化

代码语言:javascript
复制
ubar2 = Dict{Tuple{Int,Int,Int},Float64}()

并将其设置为

代码语言:javascript
复制
ubar2[(i,k,s)]=ubar[i,k]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62408066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档