【发布时间】: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