Это многомерный вариант метода |
||
function NDimHookJeavse(var _curx:TDynamicArray;eps:double):integer; var fkj,fpj,fmj,gamma,a{,rk}:double; i,j,k,Len:integer; curx,b,{wavexj,lastwavexj,wavex}wavex,xkwave,lastxkwave,tmpp,tmpm:TDynamicArray; basis:TMatrix; diff:boolean; begin gamma:=2;//параметр дробления вектора перемещения
_rk:=1;//параметр для функции штрафа
Len:=Length(_curx);//размерность оптимизации
MakeUnitMatrix(basis,Len);//формирование стандартного базиса
SetLength(b,Len); for i:=0 to Len-1 do b[i]:=0.5;//вектор перемещений
//инициализация динамических массивов
SetLength(tmpp,Len); SetLength(tmpm,Len);//для дихотомии
SetLength(uk,Len);//направление дихотомии
SetLength(xk,Len);//точка старта дихотомии
Copymatrix(_curx,curx); CopyMatrix(curx,xkwave); CopyMatrix(curx,wavex); k:=0;//счетчик итераций
while true do begin while EqVec(xkwave,wavex) do begin for j:=0 to Len-1 do begin fkj:=func(wavex); for i:=0 to Len-1 do tmpp[i]:=wavex[i]+b[i]*basis[j][i]; fpj:=func(tmpp); for i:=0 to Len-1 do tmpm[i]:=wavex[i]-b[i]*basis[j][i]; fmj:=func(tmpm); if (fpj<fkj) and (fpj<=fmj) then CopyMatrix(tmpp,wavex) else if(fmj<fkj) and (fmj<fpj) then CopyMatrix(tmpm,wavex); end{for j}; diff:=false; for i:=0 to Len-1 do{сравниваем вектора}
if xkwave[i]<>wavex[i] then begin diff:=true; break; end; if Not diff then begin for i:=0 to Len-1 do b[i]:=b[i]/gamma;{уменьшаем вектор, потом вернуться к началу}
if MaxValue(b)<eps/10 then begin CopyMatrix(wavex,_curx); Result:=k; exit; end; end ; end;{while}
{вектора различны}
if StopCondition(xkwave,wavex,eps) then begin CopyMatrix(wavex,_curx); Result:=k; exit; end; CopyMatrix(xkwave,lastxkwave); CopyMatrix(wavex,xkwave); for i:=0 to Len-1 do uk[i]:=xkwave[i]-lastxkwave[i]; CopyMatrix(curx,xk); a:=MakeNDDichotomy(0,100,eps/100,eps/100,Pseudo1D); for i:=0 to Len-1 do curx[i]:=lastxkwave[i]+a*uk[i]; CopyMatrix(curx,wavex); copymatrix(curx,xkwave); inc(k); _rk:=_rk+1;//was 4: 05.04.04
end;{while}
end;