Español
Fuente/ Codesnippets

Nichtlineare Optimierung en N Dimensionen: Nelder-Mead-Algorithmus

 

p.specht

Das Verfahren de Nelder & Mead es una relativ einfache, por lo tanto robuste Búsqueda después de Minima o. Maxima en uno zwei- oder mehrdimensionalen Fehler-, Kosten- oder Gewinnfunktion (Im Gegensatz a otro Verfahren kommt lo sin partielle Ableitungen de!).

Como todos solche Verfahren besteht auch hier el Gefahr, en bloß lokalen Optimalpunkten hängenzubleiben. Daher debería uno stets mehrere Duchläufe con geänderten Anfangs-Eckpunkten des "wandernden Dreiecks" (2D) o. wandernden Tetraeders (3D) o. Simplexes (>3D) durchspielen.

Der Algorithmus incluso stammt de el Jahre 1965 y fue de HP-BASIC después de XProfan 11 transkribiert. Daher todavía el alte "Spagetti-Programmierung" con vielen "GOTO". Versuche verliefen en me sin große Fehler. Hier mi Umsetzung después de XProfan 11 - aber como siempre sin jede Gewähr:
Título de la ventana "Nelder-Mead Downhillsimplex a Optimierung en n-dimensional-nichtlinearen Funktionen"
' (Tr) 2012-07 traducido de HP-Basic después de XProfan 11.2a by P. Pájaro carpintero, Wien
' Umsetzung sin jegliche Gewähr!
REM  Rechtsvermerke el Originalvorlage:
REM  Copyright  1987
REM  John H. Mathews
REM  Dept. of Mathematics
REM  California State University, Fullerton
REM  Nelder-Mead Method for N-Dimensions
Ventana 0,0 - %maxx,%maxy-44
CLS:Font 2
Declarar N&,K&,J&,FUN$,L$,R$,A$,ANS$
Declarar Epsilon!,x!,y!,z!,u!,v!,w!,F!,S!,Norm!,YR!,YE!,YC!
Declarar LO&,HO&,HI&,LI&,Max&,Min&,Count&
Goto "L100"

Proc S10' FUNCTION

    X! = P![1] : Y! = P![2] : Z! = P![3]
    U! = P![4] : V! = P![5] : W!=P![6]
    '====================================
    F! = X!*X! - 4*X! + Y!*Y! - Y! - X!*Y!
    '====================================
    'Weitere Testfunktionen:
    '   Rosenbrock-„Bananenfunktion“
    'f(x,y)=(1-x)^2+100*(y-x^2)^2
    'min en 1,1 con f(x,y)=0
    '  Himmelblau-Función
    'f(x,y)=(x^2+y-11)^2+(x+y^2-7)^2
    'max en x=-0.270845, y=-0.923039 con f(x,y)=181.617
    '4*min: f(3.0,2.0)=0.0   f(-2.8051118,3.131312)=0.0
    'f(-3.779310,-3.283186)=0.0   f(3.584428, -1.848126)=0.0
    '====================================

ENDPROC

' Proc PRINT

Proc S20

    N&=2
    FUN$ ="X*X - 4*X + Y*Y - Y - X*Y"
    C$[1] = "[X' : C$[2] = ",Y" : C$[3] = ",Z"
    C$[4] = ",U" : C$[5] = ",V" : C$[6] = ",W,"
    L$ ="     F" : R$ ="] = "
    Imprimir  L$;C$[1];

    WhileLoop 2,N&: K&=&Loop

        Imprimir C$[K&];

    EndWhile

    Imprimir R$;FUN$
    Volver

ENDPROC

'{ Hauptteil PROGRAM NELDER MEAD
L100:
Epsilon! = +1*10^-5
Declarar C$[6],C![6],E![6],M![6],P![6],R![6],V![6,6],Y![6],Z![6]
L120:
REM SUBROUTINE INPUTS
S1000
REM SUBROUTINE NELDER MEAD
Gosub "S200"
REM SUBROUTINE OUTPUT
S2000
Imprimir "\n WANT TO TRY NEW STARTING VERTICES ? ";
Entrada ANS$
Case (ANS$ = "Y") Or (ANS$ = "y")  : Goto "L120"
Goto "L9999"
'}
S200:
REM SUBROUTINE NELDER MEAD
MIN&=10
MAX&=200
COUNT&=0
REM  Order the vertices.
LO&=0 : HI& =0

WhileLoop N& : J&=&Loop

    caso  Y![J&] < Y![LO&] : LO&=J&
    caso  Y![J&] > Y![HI&]  :  HI&=J&

EndWhile

LI&=HI& : HO&=LO&

WhileLoop 0,n&:J&=&Loop

    caso  (J& <> LO&)  AND  (Y![J&] < Y![LI&]) : LI&=J&
    caso  (J& <> HI&)  AND  (Y![J&] > Y![HO&]): HO&=J&

EndWhile

' =======================================================================

Mientras que (Y![HI&] > (Y![LO&] + EPSILON!)) And ( (COUNT&<MAX&) Or (COUNT&<MIN&) )

    REM  The main bucle
    REM  Form new vertices M and R

    WhileLoop N&:K&=&Loop

        S!=0

        WhileLoop 0,N& : J& = &Loop

            S!=S!+V![J&,K&]

        EndWhile

        M![K&]=(S!-V![HI&,K&]) / N&

    EndWhile

    WhileLoop N&: K&=&Loop

        R![K&]=2*M![K&]-V![HI&,K&]
        P![K&]=R![K&]

    EndWhile

    REM SUBROUTINE FUNCTION
    S10
    YR!=F!
    REM Improve the simplex.

    If  YR! < Y![HO&] : Goto "L375" : Más : Goto "L525" : EndIf

        L375:

        IF  Y![LI&] < YR! : Goto "L380" : Más : Goto "L410" : EndIf

            L380:
            REM  Replace a vertex

            WhileLoop N&:K&=&Loop

                V![HI&,K&]=R![K&]

            EndWhile

            Y![HI&]=YR!
            Goto "L515"
            L410:
            REM  Construct vertex E.

            WhileLoop N&: K&=&Loop

                E![K&]=2*R![K&]-M![K&]
                P![K&]=E![K&]

            EndWhile

            REM DO SUBROUTINE FUNCTION
            S10
            YE!=F!

            IF  YE! < Y![LI&] : GOTO "L455" : ELSE : GOTO "L480" : ENDIF

                L455:

                WhileLoop N&: K&=&Loop

                    V![HI&,K&]=E![K&]

                EndWhile

                Y![HI&]=YE!
                Goto "L510"
                REM ELSE
                L480:
                REM  Replace a vertex.

                WhileLoop N&: K&=&Loop

                    V![HI&,K&]=R![K&]

                EndWhile

                Y![HI&]=YR!
                L510:
                REM ENDIF
                L515:
                REM ENDIF
                Goto "L700"
                L525:

                If  YR! < Y![HI&]  : Goto "L535" : Más : Goto "L560" : EndIf

                    L535:
                    REM  Replace a vertex

                    WhileLoop N& : K&=&Loop

                        V![HI&,K&]=R![K&]

                    EndWhile

                    Y![HI&]=YR!
                    L560:
                    REM CONTINUE
                    REM  Construct vertex C

                    WhileLoop N& : K& = &Loop

                        C![K&]=(V![HI&,K&]+M![K&])/2
                        P![K&]=C![K&]

                    EndWhile

                    S10
                    ' REM SUBROUTINE FUNCTION
                    YC!=F!

                    If  YC! < Y![HI&] : Goto "L605" : Más : Goto "L630" : EndIf

                        L605:

                        WhileLoop N&: K&=&Loop

                            V![HI&,K&]=C![K&]

                        EndWhile

                        Y![HI&]=YC!
                        Goto "L695"
                        L630:
                        REM ELSE
                        REM  Shrink the simplex

                        WhileLoop 0,N& : J&=&Loop

                            If  J& <> LO& : Goto "L650" : Más : Goto "L685" : EndIf

                                L650:

                                WhileLoop N& : K& = &Loop

                                    V![J&,K&]=(V![J&,K&]+V![LO&,K&])/2
                                    Z![K&]=V![J&,K&]
                                    P![K&] = Z![K&]

                                EndWhile

                                S10
                                ' REM SUBROUTINE FUNCTION
                                Y![J&]=F!
                                L685:
                                REM CONTINUE

                            EndWhile

                            L695:
                            REM ENDIF
                            L700:
                            REM ENDIF
                            COUNT&=COUNT&+1
                            REM  Order the vertices.
                            LO&=0
                            HI&=0

                            WhileLoop N& : J&=&Loop

                                caso  Y![J&] < Y![LO&] : LO&=J&
                                caso  Y![J&] > Y![HI&]  : HI& =J&

                            EndWhile

                            LI&=HI&
                            HO&=LO&

                            WhileLoop 0,N&:J&=&Loop

                                caso  (J& <> LO&)  AND  (Y![J&] < Y![LI&]) : LI&=J&
                                caso  (J& <> HI&)  AND  (Y![J&] > Y![HO&]): HO&=J&

                            EndWhile

                        WEND

                        ' =======================================================================
                        REM  Determine the size of the simplex
                        NORM!=0

                        WhileLoop 0,N&:J&=&Loop

                            S!=0

                            WhileLoop N&: K&=&Loop

                                S!=S! + ( V![LO&,K&] - V![J&,K&] ) * ( V![LO&,K&] - V![J&,K&] )

                            EndWhile

                            caso  S! > NORM! : NORM!=S!

                        EndWhile

                        NORM!=SQRT(NORM!)
                        Volver
                        REM SUBROUTINE INPUTS

                        Proc S1000

                            CLS
                            Imprimir " THE NELDER-MEAD SIMPLEX METHOD O 'POLYTOPE METHOD' IS"
                            Imprimir "\n USED FOR FINDING THE MINIMUM OF THE FUNCTION  F(V)"
                            Imprimir "\n FOR CONVENIENCE, THE FUNCTION F(V) CAN BE EXPRESSED USING"
                            Imprimir "\n THE VARIABLES X = v , Y = v , Z = v , U = v , V = v , W = v ."
                            Imprimir "                    1       2       3       4       5       6 "
                            Imprimir
                            ' REM DO SUBROUTINE PRINT FUNCTION
                            S20
                            Imprimir "\n YOU MUST SUPPLY",int(N&+1)," LINEARLY INDEPENDENT"
                            Imprimir

                            If  N& = 2 : Goto "L1160" : Más : Goto "L1190" : EndIf

                                L1160:
                                Imprimir " STARTING POINTS   V = ( v    ,  v      )   FOR  J=0,1,3"
                                Imprimir "                     J    J,1  J,2"
                                Goto "L1280"
                                L1190:
                                REM ELSE

                                If  N& = 3  : Goto "L1210" : Más : Goto "L1240" : EndIf

                                    L1210:
                                    Imprimir " STARTING POINTS   V = (v,v,v)   FOR  J=0,1,3,4"
                                    Imprimir "                    J    J,1  J,2  J,3"
                                    Goto "L1280"
                                    L1240:
                                    REM ELSE
                                    PRINT " STARTING POINTS   V = (v,v,...,v)   FOR  J=0,1,...,N"
                                    PRINT "                    J    J,1  J,2      J,N"
                                    PRINT " WHERE N =",N&
                                    L1280:
                                    REM ENDIF

                                    WhileLoop 0,N& : J&=&Loop

                                        PRINT
                                        PRINT " GIVE COORDINATES OF POINT  V"
                                        PRINT "                  ",J&

                                        WhileLoop N& : K&=&Loop

                                            PRINT " V(";J&;",";K&;") = ";
                                            INPUT A$
                                            V![J&,K&]=val(A$)
                                            Z![K&]=V![J&,K&]

                                        EndWhile

                                        WhileLoop N& : K&=&Loop

                                            P![K&] = Z![K&]

                                        EndWhile

                                        ' REM DO SUBROUTINE FUNCTION
                                        S10
                                        Y![J&]=F!

                                    EndWhile' NEXT J&

                                    Volver

                                ENDPROC

                                ' SUBROUTINE OUTPUT

                                Proc S2000

                                    CLS
                                    Imprimir
                                    Imprimir " THE NELDER-MEAD METHOD WAS USED TO FIND THE MINIMUM OF THE FUNCTION"
                                    Imprimir
                                    ' REM DO SUBROUTINE PRINT FUNCTION
                                    S20
                                    Imprimir
                                    Imprimir " IT TOOK ";COUNT&;" ITERATIONS TO FIND AN APPROXIMATION FOR"
                                    Imprimir

                                    IF  N& = 2 : Goto "L2100" : Más : Goto "L2130" : EndIf

                                        L2100:
                                        Imprimir " THE COORDINATES OF THE LOCAL MINIMUM  P = (p ,p )"
                                        Imprimir "                                            1  2"
                                        Goto "L2220"
                                        L2130:
                                        REM ELSE

                                        If  N& = 3 : Goto "L2150" : Más : Goto "L2180" : EndIf

                                            L2150:
                                            Imprimir " THE COORDINATES OF THE LOCAL MINIMUM  P = (p ,p ,p )"
                                            Imprimir "                                             1  2  3"
                                            Goto "L2220"
                                            L2180:
                                            REM ELSE
                                            Imprimir " THE COORDINATES OF THE LOCAL MINIMUM  P = (p ,p ,...,p )"
                                            Imprimir "                                             1  2      N"
                                            Imprimir " WHERE N = ";N&
                                            L2220:
                                            REM ENDIF

                                            WhileLoop N& : K&=&Loop

                                                Imprimir "P(";K&;")  = ";V![LO&,K&]

                                            EndWhile

                                            Imprimir "\n THE MAXIMUM DISTANCE TO THE OTHER VERTICES OF THE SIMPLEX IS"
                                            Imprimir "\n            DP  = ";Norm!
                                            Imprimir "\n THE FUNCTION VALUE AT THE MINIMUM POINT IS"
                                            Imprimir "\n F(P)  = ";Y![LO&]
                                            Imprimir "\n   DF  = ";Y![HI&]-Y![LO&];"  IS AN ESTIMATE FOR THE ACCURACY."
                                            Volver

                                        ENDPROC

                                        L9999:
                                        End
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
27.04.2021  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

548 Views

Untitledvor 0 min.
N.Art21.07.2022
Ernst21.07.2021
Uwe ''Pascal'' Niemeier13.06.2021
R.Schneider28.05.2021
Más...

Themeninformationen

Dieses Thema ha 1 subscriber:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie