我有以下内容:
include("as_mod.jl")
solvetimes = 50:200
timevector = Array{Float64}(undef,length(solvetimes))
for i in solvetimes
global T
T = i
include("as_dat_large.jl")
m, x, z = build_model(true,true)
setsolver(m, GurobiSolver(MIPGap = 2e-2, TimeLimit = 3600))
solve(m)
timevector[i-49] = getsolvetime(m)
end
plot(solvetimes,log.(timevector),
title = "solvetimes vs T", xlabel = "T", ylabel = "log(t)")
只要我的求解时间向量仅增加1,这就行得很好。但是,我对30增量感兴趣,然后它显然不起作用,因为我的时间向量超出界限。有没有办法解决这个问题?我阅读并尝试使用push!
功能但无济于事。
如果我的问题不好,我很抱歉,但我不知道如何改进它。问题主要是关于for循环,其中索引不是从1开始并且仅以1递增到上限,而是非一个增量和一个不同于0或1的开始,如果这是有意义的。
:
或50:200
中的50:30:200
语法在Julia中创建了一个范围对象。这些范围对象不仅可以迭代,而且还实现方法getindex
,这意味着您可以使用a[index]
语法简单地访问范围中的步骤,就像它是一个数组一样。
julia> solvetimes = 50:30:200 # 50, 80, 110, 140, ...
50:30:200
julia> solvetimes[3]
110
您可以通过多种方式解决问题。
首先,你可以引入一个itercount
变量来计算迭代次数,并知道你将把解决时间放在timevector
的哪个索引上。
solvetimes = 50:30:200 # increment by 30
timevector = Vector{Float64}(undef,length(solvetimes))
itercount = 1
for i in solvetimes
...
timevector[itercount] = getsolvetime(m)
global itercount
itercount += 1
end
其他方式是创建一个空的timevector
和push!
。
solvetimes = 50:30:200 # increment by 30
timevector = Float64[] # an empty Float64 vector
for i in solvetimes
...
push!(timevector, getsolvetime(m)) # push the value `getsolvetime(m)` into `timevector`
end
push!
操作可能需要julia分配内存和复制数据以补偿增加的数组大小,因此可能效率不高,尽管它在您的问题中并不重要。
另一种方法是从1到length
的solvetimes
迭代。您的循环控制变量仍然逐个递增,但现在它代表solvetimes
中的索引而不是时间点。
solvetimes = 50:30:200 # increment by 30
len = length(solvetimes)
timevector = Vector{Float64}(undef, len)
for i in 1:len
global T
T = solvetimes[i]
...
timevector[i] = getsolvetime(m)
end
通过这些修改,k
中的timevector
th值,timevector[k]
代表solvetime[k]
的求解时间。
您可能还会找到解决此问题的其他方法,例如使用Dict
s等。