Verfasst am: 07.11.2015, 18:21
Titel: Bergsteigeralgorithmus / hill climbing
Hallo,
ich sitze an einem Problem an dem ich mir jetzt schon seid längerem die Zähne ausbeiße.
Daher wende ich mich voller Hoffnung an euch!
Es kann sein, dass meine Fragen vielleicht total trivial erscheinen, aber ich bin MATLAB fremd und habe bisher noch keinen wirklichen Zugang und kein "Gespür" für das Programm.
Hinweis:
Das eigentliche Problem ist der letzte Codeblock ganz unten!!!
Ich benutze als Werte:
x=0, y=3, h=0.000001, epstol=0.000001, sw=0.01
fhandle=@meinefunktion.
Zu dem Problem als solches:
ich muss ein Minimum einer Funktion mittels des Bergsteigeralgorithmus und mittels des Gradienten Verfahrens bestimmen. Der gradient soll mit zentralen Differenzen approximiert werden.
Mein problem liegt jetzt bei dem Bergsteigeralgorithmus.
Genauer gesagt geht mein code nicht in die while schleife, also den eigentlichen Algorithmus ( ich weiß auch nicht ganz genau ob der überhaupt vollständig und/oder richtig ist). Er überspringt den Teil einfach.
So, ich hoffe ihr versteht mein problem und könnt mir weiterhelfen.
hier der code:
das ist die erste m.file, die die eigentliche Funktion die ich untersuchen muss enthält.
Code:
function[f]=meinefunktion(x,y) % Funktion, die die zu untersuchende Funktion f übergiebt.
f = x.*exp(-(x-3).^2-y.^2).*y+x.*exp(-(x+2).^2-(y-1).^2).*y+x.*exp(-(x).^2-y.^2).*y+0.5*sin(0.1.*y.*x);
das ist die zweite m.file die den Gradienten mittels zentraler Differenz approximiert.
(das scheint soweit zu funktionieren)
Code:
function[gradi]= buildgradient(x,y,fhandle,h)
%Funktion zur ausgabe des Gradienten der funktion f die als f handle
%übergeben wird. h stellt die schrittweite zur zentralen differenzenbildung dar.
%x und y sind funktionwerte.
das ist die dritte m.file , die mir das Minimum mit hilfe des gradientenverfahrens sucht und dann ausgibt.
( so weit ich das sagen kann klappt das auch)
Code:
function[xfin]= gradientenabstiegsverfahren (xstart,ystart,h,fhandle,m, epstol,sw) % Funktion zur bestimmung des Minimuns über das % gradientenabstiegsverfahren. Als startpunkt wird der Punkt(xstart,ystart) % gewählt. h wird in buildgradient.m verwendet, fhandle ist das % Funktionshandle der angegebenen Funktion f(x,y), m stellt die Maximale % Anzahl von Schritten dar, epstol ist das Abbruchkriterium für den % Gradienten und sw ist die Schrittweite mit der der algorithmus sich dem % Minimum nähert.
k=0;
xn=xstart;
yn=ystart;
g=buildgradient(xn,yn,fhandle,h);
% die while Schleife läuft solange bis die Abbruchbedingung aus der % Vorlesung erfüllt ist. Das heißt die Schleife läuft solange bis der % Gradient mit den Werten xn und yn <= epstol ( der Abbruchbedingung )ist. whilenorm(g)>=epstol
% Zusätzliche Abbruchbedingung, die die maximalen Schleifendurchläufe % bestimmt. if k<m
% Bilden des Gradienten an (xn,yn)
g=buildgradient(xn,yn,fhandle,h);
% aufspalten des Vektors g in x und y Komponente
gx=g(1:1);
gy=g(2:2);
% überschreiben der x und y Komponenten, die im nächsten % Schleifendurchlauf zur Gradientenbildung verwendet werden.
xn=xn-sw*gx;
yn=yn-sw*gy;
und nun zur vierten m.file und dem eigentlichen Problem, dem Bergsteigeralgorithmus.
In der Theorie müsste ich doch einen Startpunkt wählen und von diesem aus dann mit einer beliebigen Schrittweite sw einen neuen Punkt bestimmen, den ich dann in meine Funktion einsetze und dann prüfe ob dieser tiefer liegt oder nicht. Das mache ich dann für mehrere Richtungen der Funktion und wähle mir dann den tiefsten Punkt im Verhältnis zum Startpunkt aus und setze diesen errechneten Punkt als neuen Startpunkt und fange von vorn an.
Ich habe auch irgendwo gelesen, dass man diese Punkte auch in eine Liste packen kann und dann den tiefsten raussucht, weiß aber nicht wie das gehen soll.
Code:
function[xfin] = bergsteiger(xstart,ystart,fhandle,m,sw) % Funktion um das Minimum von fhandle zu bestimmen. Hier wird dazu der % Bergsteigeralgorithmus verwendet.
%Variablendeklaration
xn=xstart;
yn=ystart;
%Punkt in + Schrittweitenrichtung
xp=xn+sw;
yp=yn+sw;
%Punkt in - Schrittweitenrichtung
xm=xn-sw;
ym=yn-sw;
%Funktionswertbestimmung für die Abbruchbedingung
fxn=fhandle(xstart,ystart);
fxo=fhandle(xstart,ystart)-1;
%Funktionswertbestimmung in + Schrittweitenrichtung
fxp=fhandle(xp,yn);
fyp=fhandle(xn,yp);
%Funktionswertbestimmung in - Schrittweitenrichtung
fxm=fhandle(xm,yn);
fym=fhandle(xn,ym);
Am Ende soll ich dann noch die Funktion und die Näherung plotten mittels plot3.
Dazu hab ich auch noch keine Idee.
Ich möchte mich hier schonmal bei allen bedanken die sich das durchgelesen haben und sich mit dem Problem beschäftigen.
wie gesagt ich bin wirklich für jede hilfe dankbar da ich mich mit MATLAB garnicht auskenne.
Ich habe jetzt das problem mit der while schleife gelöst.
Ich Depp hab einfach die eingangsvariablen verkehrt herum deklariert.
Nur komme ich jetzt zwar in die schleife, trotzdem scheint mein Algorithmus nicht ganz richtig zu sein.
Ist da zufällig jemand fit drin?
Code:
function[xfin] = bergsteiger(xstart,ystart,fhandle,m,sw) % Funktion um das Minimum von fhandle zu bestimmen. Hier wird dazu der % Bergsteigeralgorithmus verwendet.
%Variablendeklaration
xn=xstart;
yn=ystart;
%Punkt in + Schrittweitenrichtung
xp=xn+sw;
yp=yn+sw;
%Punkt in - Schrittweitenrichtung
xm=xn-sw;
ym=yn-sw;
%Funktionswertbestimmung für die Abbruchbedingung
fxo=fhandle(xstart,ystart);
fxn=fhandle(xstart,ystart)-1;
%Funktionswertbestimmung in + Schrittweitenrichtung
fxp=fhandle(xp,yn);
fyp=fhandle(xn,yp);
%Funktionswertbestimmung in - Schrittweitenrichtung
fxm=fhandle(xm,yn);
fym=fhandle(xn,ym);
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.