我正在尝试使用Julia和JuMP进行编程优化模型。 我是Julia和JuMP的新手。因此,我认为我不擅长充分利用Julia和JuMP的各种功能和选项。
最近我从Jupyter收到了一些警告通知,如下所示。
“”“ 警告:加法运算符已在JuMP表达式上多次使用。此警告可以忽略不计,但可能表明模型生成的速度比必要的慢。出于性能原因,您不应在循环中添加表达式。代替x + = y,使用add_to_expression!(x,y)修改x。如果y是单个变量,则还可以对x + = coef * y使用add_to_expression!(x,coef,y)。 └@ JuMP C:\ Users \ User.julia \ packages \ JuMP \ jnmGG \ src \ JuMP.jl:689 “”“
此警告给了我一些严重的性能问题。 我用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
以上是我认为有问题的部分。 特别是计算梯度更新部分。 需要有关此升级的帮助。
谢谢。