我如何管理 julia 中的循环索引?
How can I mange the index of the loop in julia?
这是在 Julia 中编码的遗传算法部分。代码如下:
popc= [individual(rand(0:1,nvar),[]) for i in 1:nc/4,j in 1:2];
for k=1:nc/4
#select firdt parent
i1=rand(1:npop);
p1=pop[i1];
#select second parent
i2=rand(1:npop);
if i1==i2
i2=rand(1:npop);
end
p2=pop[i2]
#apply crossover
m=singlepointcrossover(p1.position,p2.position);
append!(popc[k,1].position, m[1]);
append!(popc[k,2].position, m[2]);
end
function singlepointcrossover(x1,x2)
nvar=length(x1);
cutpoint=rand(1:nvar-1);
y1=append!(x1[1:cutpoint],x2[cutpoint+1:end]);
y2=append!(x2[1:cutpoint],x1[cutpoint+1:end]);
return y1,y2
end
但是它有这个错误。你能帮帮我吗?为什么会这样?
ArgumentError: invalid index: 1.0
getindex(::Array{individual,2}, ::Float64, ::Int64) at abstractarray.jl:883
macro expansion at GA.juliarc.jl:87 [inlined]
anonymous at <missing>:?
include_string(::String, ::String) at loading.jl:522
include_string(::String, ::String, ::Int64) at eval.jl:30
include_string(::Module, ::String, ::String, ::Int64, ::Vararg{Int64,N} where N) at eval.jl:34
(::Atom.##102#107{String,Int64,String})() at eval.jl:82
withpath(::Atom.##102#107{String,Int64,String}, ::String) at utils.jl:30
withpath(::Function, ::String) at eval.jl:38
hideprompt(::Atom.##101#106{String,Int64,String}) at repl.jl:67
macro expansion at eval.jl:80 [inlined]
(::Atom.##100#105{Dict{String,Any}})() at task.jl:80
Julia 中的分数总是输出 Float64
,即使答案可以精确转换为 Int
。
重要的是,在您的情况下,请注意 Int
可用于索引数组,但 Float64
不能。所以你需要调整:
for k=1:nc/2
到
for k=1:Int(nc/2)
这样您的索引 k
将是 Int
类型,而不是 Float64
。
如果nc
不能保证是偶数,那么您可能需要使用floor(Int, nc/2)
或ceil(Int, nc/2)
,取决于哪个更合适。
问题是 /
运算符为整数参数提供浮点结果,而浮点结果不能用于索引 Array
。您可以使用 Integer
.
索引 Array
/(x, y)
Right division operator: multiplication of x
by the inverse of y
on the
right. Gives floating-point results for integer arguments.
for k=1:nc/4
1:nc/4
将创建一个 Float64
范围和 k
,一个 Float64
,稍后用于您在 append!(popc[k,1].position, m[1]);
处的代码中的索引。因此,您应该将 k
设为 Integer
。
如果 nc
是一个整数,您应该使用带 div(nc, 4)
的欧几里德除法或简单地使用 nc ÷ 4
,或者移位运算符 nc >> 2
和 nc >>> 2
(对于除以 2^n 的欧几里德除法,您应该移动 n)。他们都会给出整数参数的整数结果。
如果 nc
本身是一个浮点数,您可能应该使用@Colin T Bowers 指出的选项之一。
popc= [individual(rand(0:1,nvar),[]) for i in 1:nc/4,j in 1:2];
第一行没有错误,因为这里没有使用 i
进行索引。最好用我上面列出的选项之一替换 nc/4
。
这是在 Julia 中编码的遗传算法部分。代码如下:
popc= [individual(rand(0:1,nvar),[]) for i in 1:nc/4,j in 1:2];
for k=1:nc/4
#select firdt parent
i1=rand(1:npop);
p1=pop[i1];
#select second parent
i2=rand(1:npop);
if i1==i2
i2=rand(1:npop);
end
p2=pop[i2]
#apply crossover
m=singlepointcrossover(p1.position,p2.position);
append!(popc[k,1].position, m[1]);
append!(popc[k,2].position, m[2]);
end
function singlepointcrossover(x1,x2)
nvar=length(x1);
cutpoint=rand(1:nvar-1);
y1=append!(x1[1:cutpoint],x2[cutpoint+1:end]);
y2=append!(x2[1:cutpoint],x1[cutpoint+1:end]);
return y1,y2
end
但是它有这个错误。你能帮帮我吗?为什么会这样?
ArgumentError: invalid index: 1.0
getindex(::Array{individual,2}, ::Float64, ::Int64) at abstractarray.jl:883
macro expansion at GA.juliarc.jl:87 [inlined]
anonymous at <missing>:?
include_string(::String, ::String) at loading.jl:522
include_string(::String, ::String, ::Int64) at eval.jl:30
include_string(::Module, ::String, ::String, ::Int64, ::Vararg{Int64,N} where N) at eval.jl:34
(::Atom.##102#107{String,Int64,String})() at eval.jl:82
withpath(::Atom.##102#107{String,Int64,String}, ::String) at utils.jl:30
withpath(::Function, ::String) at eval.jl:38
hideprompt(::Atom.##101#106{String,Int64,String}) at repl.jl:67
macro expansion at eval.jl:80 [inlined]
(::Atom.##100#105{Dict{String,Any}})() at task.jl:80
Julia 中的分数总是输出 Float64
,即使答案可以精确转换为 Int
。
重要的是,在您的情况下,请注意 Int
可用于索引数组,但 Float64
不能。所以你需要调整:
for k=1:nc/2
到
for k=1:Int(nc/2)
这样您的索引 k
将是 Int
类型,而不是 Float64
。
如果nc
不能保证是偶数,那么您可能需要使用floor(Int, nc/2)
或ceil(Int, nc/2)
,取决于哪个更合适。
问题是 /
运算符为整数参数提供浮点结果,而浮点结果不能用于索引 Array
。您可以使用 Integer
.
Array
/(x, y)
Right division operator: multiplication of
x
by the inverse ofy
on the right. Gives floating-point results for integer arguments.
for k=1:nc/4
1:nc/4
将创建一个 Float64
范围和 k
,一个 Float64
,稍后用于您在 append!(popc[k,1].position, m[1]);
处的代码中的索引。因此,您应该将 k
设为 Integer
。
如果 nc
是一个整数,您应该使用带 div(nc, 4)
的欧几里德除法或简单地使用 nc ÷ 4
,或者移位运算符 nc >> 2
和 nc >>> 2
(对于除以 2^n 的欧几里德除法,您应该移动 n)。他们都会给出整数参数的整数结果。
如果 nc
本身是一个浮点数,您可能应该使用@Colin T Bowers 指出的选项之一。
popc= [individual(rand(0:1,nvar),[]) for i in 1:nc/4,j in 1:2];
第一行没有错误,因为这里没有使用 i
进行索引。最好用我上面列出的选项之一替换 nc/4
。