Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2011, 13:07   #1
drzod
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 22
По умолчанию Метод Хука-Дживса

Надо было написать метод хука-дживса. При разных начальных точках, у меня получаются различные минимумы. Помогите пожалуйста найти ошибку.
Код:
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Math;
 
label 0,1,2,3,4,5,6,7;
 
var k,h,z,ps,bs,fb,fi :real;
i,j,n,fe :integer;
x,y,b,p :array[1..10] of real;
 
procedure calculate;
begin
z:=exp(-(x[1]-3)*(x[1]-3)-((x[2]-1)/3))*exp(-(x[1]-3)*(x[1]-3)-((x[2]-1)/3))+exp(-((x[1]-2)/2)*((x[1]-2)/2)-(x[2]-2));
fe:=fe+1; (*** chetchik ***)
end;
 
begin
write('Vvedite chislo peremenych:');
readln(n);
writeln;
writeln('Vvedite nachalnuy tochku x1,x2,…,xN');
for i:=1 to n do readln(x[i]);
writeln;
writeln('Vvedite dlinu chaga');
readln(h);
writeln;
k:=h;
fe:=0;
for i:=1 to n do
    begin
    y[i]:=x[i];
    p[i]:=x[i];
    b[i]:=x[i];
    end;
calculate;
fi:=z;
writeln('Nachalnoe znacenie function', z:2:6);
for i:=1 to n do writeln(x[i]:2:6);
ps:=0;
bs:=1;
(*** Isledovanie vokrug basisnoi tochki ***)
j:=1;
fb:=fi;
0: x[j]:=y[j]+k;
calculate;
if z<fi then goto 1;
x[j]:=y[j]-k;
calculate;
if z<fi then goto 1;
x[j]:=y[j];
goto 2;
1: y[j]:=x[j];
2: calculate;
fi:=z;
if j=n then goto 3;
j:=j+1;
goto 0;
3: if fi<fb then goto 6;
goto 5;
5: k:=k/5;
{writeln('Ymencit dlinu shaga');}
if k<1e-08 then goto 7;
(*** Если поиск незакончен,то произвести новое ***)
(*** исследование вокруг новой базисной точки ***)
j:=1;
goto 0;
(*** Поиск по образцу ***)
6: for i:=1 to n do
   begin
   p[i]:=2*y[i]-b[i];
   b[i]:=y[i];
   x[i]:=p[i];
   y[i]:=x[i];
   end;
calculate;
fb:=fi;
ps:=1;
bs:=0;
fi:=z;
{writeln('Poisk po obrazsu',' ','f = ',z:2:6);
for i:=1 to n do writeln(x[i]:2:6);}
(*** После этого произвести исследование вокруг ***)
(*** последней точки образца ***)
j:=1;
goto 0;
7: writeln('Min naiden');
for i:=1 to n do
writeln('x(',i,')=',p[i]:2:6);
writeln;
writeln('Min f(x) = ',' ',fb:2:6);
writeln('kolichesvo vyichilenii function',' ',fe);
readln(n);
end.
Задание звучит так: Реализовать метод Хука-Дживса для функции:
f(x,y)=exp{-((x-3)/1)^2 - ((y-1)/3)}^2+exp{-((x-2)/2)^2+((y-2)/1)}^2
drzod вне форума Ответить с цитированием
Старый 11.09.2011, 13:28   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ваша фатальная ошибка в том, что вы используете label и goto.
Человек_Борща вне форума Ответить с цитированием
Старый 11.09.2011, 13:43   #3
drzod
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 22
По умолчанию

Помогите пожалуйста переделать этот метод.
drzod вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с установкой хука DeFace Win Api 0 07.09.2011 08:06
Неактивное окно не реагирует на сообщения хука. askarchic Общие вопросы Delphi 4 07.02.2011 00:33
Метод Хука-Дживса Энжи Помощь студентам 0 21.04.2010 23:41
правильное снятие хука majestic Win Api 1 11.01.2010 02:52
Функция-фильтр глобального хука. Katka Win Api 3 30.03.2009 10:57