Как исправить ошибку, связанную в Джулии? - PullRequest
0 голосов
/ 13 мая 2019

Этот код является частью кода, который сортирует недоминированные точки. F - это массив ячеек, сохраняющий фронты парето. но Юлия дает эту ошибку:

BoundsError: attempt to access 0-element Array{Any,1} at index [1] setindex!(::Array{Any,1}, ::Any, ::Int64) at essentials.jl:183 macro expansion at Nondominated sorting.juliarc.jl:41 [inlined]

не могли бы вы мне помочь. Как я могу это исправить?

#=pop is a structure including 
struct individual
    position
    cost
    Rank
    Dominationset
    Dominatedcount
    Crowdingdostance
end
this pop is used for this code as input
5-element Array{individual,1}:
 individual(Any[-3, 4, -2], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[4, 4, 1], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[1, 4, 4], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[4, 4, -2], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[1, 4, 2], Any[0.999999, 1.0], Any[], Any[], Any[], Any[])=#

using JuMP,DataStructures
npop=length(pop);
l=0;
F=[]; # F{1}=[] in matlab it is correct
for i=1:npop
    for j=i+1:npop
        p=pop[i];
        q=pop[j];
        if (dominates(p.cost,q.cost))
            append!(p.Dominationset,j);
            append!(q.Dominatedcount,l+1)
        end
        if (dominates(q.cost,p.cost))
            append!(q.Dominationset,i);
            append!(p.Dominatedcount,l+1)
        end
        pop[i]=p;
        pop[j]=q;
    end
    if pop[i].Dominatedcount==[]
        F[1]=[F;i]; #F{1}=[F{1} i] in matlab is used
        append!(pop[i].Rank,1);
    end
end

доминирующая функция выглядит следующим образом:

function dominates(x,y)  
    b=all(x.<=y) && any(x.<y);
    return(b);
end

1 Ответ

2 голосов
/ 13 мая 2019

Ваша проблема здесь:

F[1]=[F;i]

F - пустой вектор, поэтому вы ничего не можете присвоить элементу 1.Это отличается от Matlab, который автоматически (и imho, опасно) динамически расширяет ваш массив.Вместо этого используйте: push!:

push!(F, ??)

Я поставил вопросительные знаки, потому что я не понимаю, что вы на самом деле пытаетесь вставить в F здесь.Поместить F внутри вектора, а , а затем присвоить это первому элементу F?Это не имеет никакого смысла для меня, извините, чтобы сказать.( Редактировать: Ваш код Matlab F{1}=[F{1} i] здесь также не имеет смысла. Вы случайно не хотели писать F = [F, i]?)

Кроме того, вы уверены, что вам нужноиспользовать Any везде?Нетипизированные векторы struct s и Any сделают ваш код чрезвычайно медленным.

...