Это раздел генетического алгоритма, который кодирует в 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
Проблема в том, что оператор
/
выдает результаты с плавающей запятой для целочисленных аргументов, а результаты с плавающей запятой нельзя использовать для индексацииArray
. Вы можете проиндексироватьArray
с помощьюInteger
.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.У вас нет ошибки в первой строке, поскольку вы не используете здесь
i
для индексации. Все же лучше заменитьnc/4
одним из перечисленных выше вариантов.Дроби в Julia всегда выводят
Float64
, даже если ответ можно точно преобразовать вInt
.Важно отметить, что в вашем случае
Int
можно использовать для индексации массивов, аFloat64
— нет. Итак, вам нужно настроить:to
так что ваш индекс
k
будет иметь типInt
, а неFloat64
.Если не гарантируется, что
nc
будет четным целым числом, вам может потребоваться использоватьfloor(Int, nc/2)
илиceil(Int, nc/2)
, в зависимости от того, что более подходит.