Цикл For, где индекс не начинается с 1 или 0 и увеличивается на 30 вместо 1 - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть следующее:

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!, но безрезультатно.

Я прошу прощения, если мой вопрос не очень хороший, но я не вижу, как его улучшить. По сути, речь идет о циклах, в которых индекс НЕ начинается с 1 и увеличивается только с 1 до верхней границы, а не с единичным шагом и началом, отличным от 0 или единицы, если это имеет смысл.

1 Ответ

4 голосов
/ 17 апреля 2019

Синтаксис : в 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 th значение в timevector, timevector[k] обозначает время решения для solvetime[k].

Вы также можете найти другие способы решения проблемы, например, использовать Dict s и т. Д.

...