我一直在尝试在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
SparseAxisArray
只是Dict
顶部的薄包装纸。定义为当用户在JuMP宏中创建容器时,无论他得到的是Array
,DenseAxisArray
还是SparseAxisArray
,它的行为都尽可能地接近彼此,因此用户不需要关心他从大多数手术中获得的收益。因此,我们不能仅创建Dict
,因为它作为数组的行为不同。例如,您不能将多个索引设为getindex
来执行x[2, 2]
。在这里,您可以根据需要使用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]