@tj57

Как исправить ошибки в реализациях методов градиентного спуска и имитации отжига?

Имеются реализации вышеуказанных методов на Matlab:

Градиентный спуск
clc;
iters=1000;% кол-во итераций
 
xr=0; % нахождение глобального минимума функции
yr=0;
dr=sqrt(xr*xr+yr*yr);
Z=Func(xr,yr);% значение функции в этой точке
 
k=100; % выбираем начальную точку из диапазона (-k,k)
x0=-k+rand(1,1)*(k-(-k));
y0=k;
x00=x0;
y00=y0;
Z0=Func(x00,y00);
 
step=1e-4;% шаг
w=1.9;% параметр (1,2]
 
for i=1:1:iters
    Grad_dx= (Func(x0+step,y0)-Func(x0,y0))/step; % определяем для текущей точки значение градиента
    Grad_dy=(Func(x0,y0+step)-Func(x0,y0))/step;
    Grad_Norm=sqrt(Grad_dx*Grad_dx+Grad_dy*Grad_dy);
    if (Grad_Norm< 1e-8)
        break;
    end
    % адаптивный выбор шага d
    tempStep1=step;
    tempStep2=step/w;
    tempStep3=step*w;
    % определяем положение следующей точки
    x1=x0-tempStep1*Grad_dx/Grad_Norm;
    x2=x0-tempStep2*Grad_dx/Grad_Norm;
    x3=x0-tempStep3*Grad_dx/Grad_Norm;
    y1=y0-tempStep1*Grad_dy/Grad_Norm;
    y2=y0-tempStep2*Grad_dy/Grad_Norm;
    y3=y0-tempStep3*Grad_dy/Grad_Norm;
    Func1=Func(x1,y1);
    Func2=Func(x2,y2);
    Func3=Func(x3,y3);
    F=[Func1;Func2;Func3];
    min_Func=min(min(F));
    if (min_Func==Func1)
        step=tempStep1;
    else
        if (min_Func==Func2)
            step=tempStep2;
        else
            if (min_Func==Func3)
                step=tempStep3;
            end
        end
    end
    x0=x0-step*Grad_dx/Grad_Norm;
    y0=y0-step*Grad_dy/Grad_Norm;
    
    new_dr=sqrt(x0*x0+y0*y0);
    diff=abs(new_dr-dr);
    disp(x0);
    Q(i)=diff;
    
end
 
plot( Q, 'g', 'LineWidth', 1);
xlabel('i') ;
ylabel('\DeltaF') ;
grid on


Имитация отжига:
clc;
 
xr=0; % нахождение глобального минимума функции
yr=0;
dr=sqrt(xr*xr+yr*yr);
Z=Func(xr,yr);% значение функции в этой точке
 
k=100; % выбираем начальную точку из диапазона (-k,k)
x0=-k+rand(1,1)*(k-(-k));
y0 = k;
x00=x0;
y00=y0;
Z0=Func(x00,y00);
 
T0=100; % задаем начальную температуру системы
 
for i=1:1:250 % по изменению температуры
    T=T0/(1+i); % на каждой итерации понижаем температуру
    for j=1:100
        dx=-T+rand(1,1)*(T-(-T));% генерация след точки по равномерному распределению
        dy=-T+rand(1,1)*(T-(-T));
        dE=Func(x0+dx,y0+dy)-Func(x0,y0); % расчет приращения энергии при переходе в новое состояние
        h=1/(1+exp(dE/T));  %расчет вероятности перехода 
        buf=rand(1);
        % проверка на переход в новое состояние
        % если условие выполняется то точка принимается, если нет то заново
        % генерация 
        if(buf <=h)
            x0=x0+dx;
            y0=y0+dy;
            break;
        end
    end
   new_dr=sqrt(x0*x0+y0*y0);
    diff=abs(new_dr-dr);
    disp(x0);
    Q(i)=diff;
end
 
p = plot( Q, 'r', 'LineWidth', 1);
xlabel('i') ;
ylabel('\DeltaF') ;
set(p, 'Color', 'g');
axis([0 250 0 100 ]);
grid on
hold on


По словам преподавателя, в методе градиентного спуска используется неточный метод оценки частных производных, а в методе имитации отжига просто ошибка (какая именно - не сказал). Как можно исправить данные ошибки (и как понять, какая ошибка в методе имитации отжига) ?
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 50 000 руб.
АО «НИИМЭ» Зеленоград
от 100 000 до 170 000 руб.
O.Vision Санкт-Петербург
от 200 000 до 280 000 руб.