我一直在尝试在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稀疏轴数组,但我不能工作,因为我不知道如何初始化它。
下面的代码可以工作(当然,在我的<>中插入了正确的代码),但没有我希望的那样好。所以如果有什么方法可以更有效地保存二维稀疏轴数组的值,我很想知道!提前谢谢!
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发布于 2020-06-17 04:46:37
SparseAxisArray仅仅是Dict顶部的一个薄薄的包装器。它的定义是,当用户在JuMP宏中创建容器时,无论他获得的是Array、DenseAxisArray还是SparseAxisArray,它的行为都尽可能地彼此接近,因此用户不需要关心他在大多数操作中获得了什么。出于这个原因,我们不能仅仅创建一个Dict,因为它的行为与数组不同。例如,您不能使用多个索引作为x[2, 2]来执行getindex。在这里,您可以根据自己的喜好使用Dict或SparseAxisArray。它们在设置和获取新元素时的复杂度都为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]https://stackoverflow.com/questions/62408066
复制相似问题