如何管理Julia中的循环索引?

时间:2019-05-05 11:29:13

标签: julia julia-jump julia-studio

这是遗传算法中用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

2 个答案:

答案 0 :(得分:2)

问题是/运算符为整数参数提供浮点结果,并且浮点结果不能用于为Array编制索引。您可以用ArrayInteger编制索引。

  

/(x,y)

     

右除运算符:将xy的倒数相乘。     对。给出整数参数的浮点结果。

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 >> 2nc >>> 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

答案 1 :(得分:1)

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),这取决于哪个更合适。