ind = find(desc<0); stepmax = min(-(SigmaNew(ind))./desc(ind)); deltmax = stepmax; if isempty(stepmax) || stepmax==0 Sigma = SigmaNew; return end if stepmax > 0.1 stepmax=0.1; end %----------------------------------------------------- % Projected gradient %----------------------------------------------------- while costmax<costmin [costmax, S] = costgraph(KH,stepmax,desc,SigmaNew); if costmax<costmin costmin = costmax; SigmaNew = SigmaNew + stepmax * desc; %------------------------------- % Numerical cleaning %------------------------------- % SigmaNew(find(abs(SigmaNew<option.numericalprecision)))=0; % SigmaNew=SigmaNew/sum(SigmaNew); % SigmaNew =SigmaP; % project descent direction in the new admissible cone % keep the same direction of descent while cost decrease %desc = desc .* ( (SigmaNew>0) | (desc>0) ) ; desc = desc .* ( (SigmaNew>option.numericalprecision)|(desc>0)); desc(coord) = - sum(desc([[1:coord-1] [coord+1:end]])); ind = find(desc<0); if ~isempty(ind) stepmax = min(-(SigmaNew(ind))./desc(ind)); deltmax = stepmax; costmax = 0; else stepmax = 0; deltmax = 0; end end end %----------------------------------------------------- % Linesearch %----------------------------------------------------- Step = [stepmin stepmax]; Cost = [costmin costmax]; [val,coord] = min(Cost); % optimization of stepsize by golden search while (stepmax-stepmin)>option.goldensearch_deltmax*(abs(deltmax)) && stepmax > eps stepmedr = stepmin+(stepmax-stepmin)/gold; stepmedl = stepmin+(stepmedr-stepmin)/gold; [costmedr, S1] = costgraph(KH,stepmedr,desc,SigmaNew); [costmedl, S2] = costgraph(KH,stepmedl,desc,SigmaNew); Step = [stepmin stepmedl stepmedr stepmax]; Cost = [costmin costmedl costmedr costmax]; [val,coord] = min(Cost); switch coord case 1 stepmax = stepmedl; costmax = costmedl; S = S2; case 2 stepmax = stepmedr; costmax = costmedr; S = S2; case 3 stepmin = stepmedl; costmin = costmedl; S = S2; case 4 stepmin = stepmedr; costmin = costmedr; S = S1; end end %--------------------------------- % Final Updates %--------------------------------- CostNew = Cost(coord); step = Step(coord); % Sigma update if CostNew < CostOld SigmaNew = SigmaNew + step * desc; end Sigma = SigmaNew;
时间: 2023-08-15 20:12:26 浏览: 111
A NEW METHOD FOR FINDING MAXIMA AND MINIMA
这段代码是一个优化算法的实现,具体来说是一个基于梯度下降和线搜索的优化算法。它的主要目的是在给定的约束条件下,最小化一个代价函数。这个代价函数是通过调用 costgraph 函数计算得出的,其中的参数包括 KH、stepmax、desc 和 SigmaNew。
在这个算法中,首先计算出一个初始的步长 stepmax,然后根据这个步长进行梯度下降。在下降的过程中,通过比较当前得到的代价函数值和之前的最小代价函数值,来判断是否需要继续下降。如果代价函数值继续减小,则更新 SigmaNew,并重新计算下降的步长 stepmax。如果代价函数值不再减小,则进行线搜索,找到一个更小的代价函数值对应的步长,然后再进行梯度下降。这个过程一直持续,直到找到一个满足收敛条件的最小代价函数值。
除了梯度下降和线搜索,这个算法还包括其他一些细节处理,例如数值清理、梯度方向的更新等等。这些处理可以提高算法的稳定性和收敛速度。
阅读全文