WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bergsteigeralgorithmus / hill climbing

 

electronpower
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2015, 18:21     Titel: Bergsteigeralgorithmus / hill climbing
  Antworten mit Zitat      
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);

%mesh (x,y,f);


%%colorbar
 

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.

%[x,y]=meshgrid([-10:0.1:10]);

%Gradienten bildund mittels zentraler Differenz. Der Gradient gradi wird
%sofort als vektor ausgegeben.
gradi = [(fhandle(x+h,y)-fhandle(x-h,y))/(2*h);(fhandle(x,y+h)-fhandle(x,y-h))/(2*h)];

 


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.
while norm(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;
       
        % hochzählen der Laufvariablen k
        k=k+1 ;
     end  
 
end

% Ausgabe des Punktes, der mit dem Gradientenabstiegsverfahren als Minimum
% gefunden wurde.
xfin= [xn,yn];
k


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);

%Laufvariable als Abbruchbedingung
k=0;
if k<m
   
    %Abbruchbedingung des Algorithmus
    while fxn<fxo
       
        %Bedingte Anweisung um zu überprüfen in welche richtung der Punkt
        %kleiner als der Startpunkt ist
        if fxm<fxp
            xn=xm;
        end
       
        if fym<fyp
            yn=ym;
        end
       
        fxo=fxn;
       
        % Überschreiben des ursprünglichen Startwerts mit dem neuen
        % Startwert
        fxn=fhandle(xn,yn)
       
        if fhandle (xn,ystart)<fhandle(xstart,yn)
            yn=0;
        else
            xn=0;
        end
       
        %hochzählen der Laufvariablen
        k=k+1;
   
   
    end
end
%Ausgabe
xfin=[xn,yn];
k


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.
Private Nachricht senden Benutzer-Profile anzeigen


electronpower
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2015, 19:42     Titel:
  Antworten mit Zitat      
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);

%Laufvariable als Abbruchbedingung
k=0;
if k<m
   
    %Abbruchbedingung des Algorithmus
    while fxn<fxo
       
        %Bedingte Anweisung um zu überprüfen in welche richtung der Punkt
        %kleiner als der Startpunkt ist
        if fxm<fxp
            xn=xm;
        end
       
        if fym<fyp
            yn=ym;
        end
       
        fxo=fxn;
       
        % Überschreiben des ursprünglichen Startwerts mit dem neuen
        % Startwert
        fxn=fhandle(xn,yn)
       
        if fhandle (xn,ystart)<fhandle(xstart,yn)
            yn=0;
        else
            xn=0;
        end
       
        %hochzählen der Laufvariablen
        k=k+1;
   
   
    end
end
%Ausgabe
xfin=[xn,yn];
k
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.