![]() |
Это многомерный вариант метода |
|
Комментарий
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;