Это многомерный вариант метода

Главная страница по методам
оптимизаций

Главная страница
сайта

Написать письмо
автору

Метод Хука-Дживса (многомерный)


Комментарий
Этот метод трудился в одном из курсовых проектов, в котором балка под действием сосредоточенной силы оптимизировалась по профилю исходя из условий минимума массы при ограничениях на максимальный прогиб и наоборот: из условия минимума максимального прогиба при ограничениях на массу. Поскольку эта задача решалась методами нелинейного программирования, а, если конкретно, с помощью метода барьерных функций, то это наложило некоторые изменения в код метода. В частности, переменная _rk - это глобальная переменная, необходимая для построения функции штрафа. Хотя процедуры дихотомии не изменилась, название ее поменялось, она стала называться MakeNDDichotomy. Зато функция Pseudo1D изменилась, поскольку глобальная переменная xk модуля является уже вектором. Кроме того, в этой процедуре используются функции для работы с матрицами, такие как CopyMatrix, MakeUnitMatrix и др. Описания этих функций можно найти в модуле Gauss.pas.
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;


Главная страница по методам
оптимизаций

Главная страница
сайта

Написать письмо
автору

Мещанинов Николай © 2004.(nsft.narod.ru)


Hosted by uCoz