У меня есть проблема с производительностью в julia jump, насчет оператора сложения в выражении jump. (Предупреждение) - PullRequest
0 голосов
/ 12 мая 2019

Я перехожу к программированию оптимизации модели с помощью Julia & JuMP.Я новичок в Юлии и JuMP.Поэтому я думаю, что я не очень хорошо использую различные функции и опции Julia и JuMP.

Недавно я получил предупреждение от Jupyter, как показано ниже.

"" "Предупреждение:Оператор сложения использовался в выражениях JuMP много раз. Это предупреждение безопасно игнорировать, но оно может указывать на то, что создание модели происходит медленнее, чем необходимо. По соображениям производительности не следует добавлять выражения в цикл. Вместо x + = y, используйте add_to_expression! (x, y) для изменения x на месте. Если y - единственная переменная, вы также можете использовать add_to_expression! (x, coef, y) для x + = coef * y. └ @ JuMP C: \ Users\ User.julia \ packages \ JuMP \ jnmGG \ src \ JuMP.jl: 689 "" "

Это Waring дает мне серьезную проблему с производительностью.Я реализую точно такой же алгоритм с Python & Matlab.Но они намного быстрее, чем Юлия.Я думаю, что это невозможно, потому что Джулия быстрее, чем оба языка.

Я пытаюсь преодолеть эту проблему.Но я не могу найти решение этого.

    while eps_v > Eps_V
        k +=1;

        Grad_U, Grad_Gamma = Grad(U_BGD[1:m, i], Value_f_BGD);
        U_BGD[1:m, i] = U_BGD[1:m, i].-(Step_Size/sqrt(k))*Grad_U;
        Gamma_BGD[:,:,i] = Gamma_BGD[:,:,i].-(Step_Size/sqrt(k))*Grad_Gamma;

        p_bgd[1, 1:m] = -U_BGD[1:m,i]';
        p_bgd[1, m+1:m+N*M] = -reshape(Gamma_BGD[:,:,i]', 1 , N*M);


        # Generate Model & Variables
        model = Model(with_optimizer(CPLEX.Optimizer));
        @variable(model, U_temp[1:m]);
        @variable(model, 0<=Gamma_temp[1:N*M]);
        D = vcat(U_temp, Gamma_temp);
        D = reshape(D, length(D), 1);
        obj  = D'*Q_bgd*D+ p_bgd*D;

        @constraint(model, A_bgd*D.==b_bgd);
        @objective(model, Min, obj[1]);
        @suppress optimize!(model);

        U_BGD[1:m, i] = value.(U_temp);
        Gamma_BGD[:,:,i] = reshape(value.(Gamma_temp), M, N)';
        val = X[1:n,i]'*Q*X[1:n,i]+U_BGD[1:m,i]'*R.*U_BGD[1:m,i]+(alp/N)*sum(Gamma_BGD[:,:,i]*Value_f_BGD', dims=1);
        eps_v = abs(val[1]-val_prev[1]);

        #println(eps_v);
        val_prev = val[1];
    end

Выше я считаю проблемную часть.Особенно рассчитать часть обновления градиента.Нужна помощь с этим обновлением.

Спасибо.

...