Heim  >  Artikel  >  Backend-Entwicklung  >  Python implementiert verschiedene Optimierungsalgorithmen

Python implementiert verschiedene Optimierungsalgorithmen

coldplay.xixi
coldplay.xixinach vorne
2020-12-02 17:03:585995Durchsuche

Python-Video-TutorialIn der Spalte werden verschiedene Optimierungsalgorithmen vorgestellt macht Der Algorithmus: Führe es zweimal aus

def asdf(x):
    rres=8*x**3-2*x**2-7*x+3
    return rres

i=2
left=0
right=1
while i>0 :
    i = i-1
    ans = 0.1
    mid1 = (left + right + ans) / 2
    mid2 = (left + right - ans) / 2
    a=asdf(mid1)
    c=asdf(mid2)
    if a > c :
        right = mid1
    else :
        left = mid2
b=(left+right) / 2
print("左极限=%s,右极限=%s,极小值x=%s"%(left,right,b))
左极限=0.45,右极限=0.775,极小值x=0.6125

Reappointment:Python implementiert verschiedene OptimierungsalgorithmenDies ist der erste Code, den ich implementiert habe. Nach dem Erlernen des Algorithmus ist im Grunde das logische Gerüst vorhanden und das Einzige, was geklärt werden muss, ist die entsprechende Python-Sprache. Also fing ich an, nach „wie man eine Funktion definiert“ (siehe Mofans Youku für Details), dem Format von „Schleifenkörper“ und „if-Bedingungsanweisung“ (https://blog.csdn.net/qq_39407518/article/details/) zu suchen. 79822498) „Mathematische Symbole“ (Einzelheiten finden Sie in Mofans Youku) und die Verwendung von print

1.def ist die Mittelfingerdefinition von Python. Sie wird im Allgemeinen zum Definieren von Funktionen verwendet, wenn zum Aufbau eines Netzwerks erforderlich ist. Es kann zur Definition des Netzwerks verwendet werden. Beachtenswert ist, dass

return in einer neuen Zeile nach der Funktion hinzugefügt werden muss. Ich weiß nicht warum, aber wenn es keine Addition gibt, ist die Funktionsformel wie eine Vase, genau wie ein Ergebnis, das nicht ausgegeben werden kann.

2. Das Verwirrendste ist die Logik. Die Logik war zunächst nicht klar, oder es gab eine Auslassung im Code, was dazu führte, dass ich links und rechts in den Schleifenkörper einfügte. Das Ergebnis ist vorhersehbar. Aufgrund dieses Fehlers wusste ich jedoch, wie man Debug in Pycharm verwendet. Es war ganz einfach und Baidu hat es sofort erfunden.

3. Ich weiß nicht warum, aber die in dem Video, das ich gesehen habe, zusammen ausgegebenen Druckvariablen können nicht in meinem Pycharm verwendet werden, und das Ergebnis ist sehr seltsam. Vielleicht liegt es daran, dass ich Win10 und nicht iOS verwende. print Wenn mehrere Variablen zusammen ausgegeben werden, muss es sein print("Name: %s, Name 2: %s" % (a, b) Die Ergebnisausgabe ist name: a, Name 2: b

Frage: 1 . Warum müssen wir return hinzufügen?


return bedeutet, einen beliebigen Variablenwert in dieser Definition als Ergebnis auszugeben. Im Allgemeinen wird der relationale Ausdruck der Ausgabefunktion so benannt, dass beim Aufruf dieser Funktion der der Variablen entsprechende Funktionswert angezeigt werden kann. Andernfalls wird er nur ohne Ergebnisse ausgeführt und hat keine Auswirkungen.

Gitterpunktmethode – Dreipunkt-Gleichteilungsmethode
import numpy as np
def qwer(x):
    third = np.exp(x) - 5*x
    return third

left = 1
right = 2
mid1 =float(left+right) / 2
mid2 = (left+mid1) / 2
mid3 = (mid1+right) /2
a = qwer(mid1)
b = qwer(mid2)
c = qwer(mid3)
i = 5
while i > 0:
    i=i-1
    if a > b:
        if c > b :
            #b
            right = mid1
            mid1 = mid2
            a=b
            mid2 = (left + mid1) / 2
            mid3 = (mid1 + right) / 2
            b = qwer(mid2)
            c = qwer(mid3)
        else:#b>c
            #c
            left = mid1
            mid1 = mid3
            a = c
            mid2 = (left + mid1) / 2
            mid3 = (mid1 + right) / 2
            b = qwer(mid2)
            c = qwer(mid3)
    else:#b>a
            if a > c:
                #C
                left = mid1
                mid1 = mid3
                a = c
                mid2 = (left + mid1) / 2
                mid3 = (mid1 + right) / 2
                b = qwer(mid2)
                c = qwer(mid3)
            else:#b>a&c>a
                # a
                left = mid2
                right = mid3
                mid2 = (left + mid1) / 2
                mid3 = (mid1 + right) / 2
                b = qwer(mid2)
                c = qwer(mid3)

print("最小值=%s"%mid1)
print("函数值=%s"%a)
最小值=1.609375
函数值=-3.047189552275773

Über Datenvariablen in Python. Die Ergebnisse des ersten Durchlaufs waren offensichtlich falsch, daher habe ich das Debuggen verwendet. Es stellte sich heraus, dass mid1 immer 1 statt 1,5 war, also begannen wir, die Datenvariablen zu verstehen. Zuerst vermutete ich, dass alle Variablen in Python standardmäßig vom Typ Integer sind, aber aufgrund der Ergebnisse der Dichotomie wurde mir klar, dass diese Vermutung falsch war, sodass keine Notwendigkeit bestand, das Variablenformat der gesamten Datei zu ändern. Also habe ich vor der Formel „mid1“ einen Gleitkommawert eingefügt und das Ergebnis wurde als 1,5 angezeigt. Aber wenn ich die gesamte Formel mit () umgebe und float voranstelle, ist das Ergebnis immer noch 1. Ich verstehe nicht ganz warum. Ich weiß jedoch, dass das Datenformat von Python auf der Grundlage der Eingabemenge bestimmt wird. Das heißt, wenn Ihre Eingabemenge eine Ganzzahl ist, muss die direkt damit verbundene Berechnungsausgabe ein Ganzzahltyp sein, und es ist eine Ganzzahl Typ, der keinen Carry verwendet. Bevor ich die beiden Methoden +float/+.0 verwendet habe, waren mid1~3 alle ganze Zahlen.

left = 1.0
right = 2.0
mid1 =(left+right) / 2
Oder anstatt float vor mid1 einzufügen, setze einfach einen Punkt nach der Eingabemenge. Ich möchte mich wirklich über das Drucken beschweren, und manchmal kann ich es nicht Setzen Sie es zusammen! ! ! !

Fibonacci-Methode

def fibonacci(n):
    i=0
    a = 0
    b = 1
    for i in range(n):
        i=i+1
        c = a+b
        a = b
        b = c
    return c
def bn(x):
    ert = x**2 - 6*x + 2
    return ert
z = 2
p = 0
left = 0.00000
right = 10.00000
L1 = right - left
while z < 100:
    m = fibonacci(z)
    l = L1/m
    k = 1.000/m
    if k < 0.03:
        print("n=%s,Fn=%s"%(z,m))
        L2 = l*fibonacci(z-1)
        t = left + L2
        r = right -L2
        while p < 3:
            p = p + 1
            l3 = t - r
            e= bn(t)
            o = bn(r)
            if e>o :
                right = t
                t = r
                r = left + l3
            else:#o>e
                left = r
                r = t
                t = right - l3
        break
    else:
        z = z + 1

okk=(left+right)/2
okky=bn(okk)
print(left)
print(right)
print("极小值x=",okk)
print("极小值y=",okky)
Fragen Sie mich nicht, was ich beherrsche, sondern fragen Sie mich, wie sehr ich die Präzisionsdarstellung von Python liebe, nachdem ich diesen Code geschrieben habe :-) Ich habe beschlossen, dass ich die beibehalten werde, wenn ich in Zukunft mathematische Formeln codiere Eingabemenge klein Nach dem mathematischen Punkt füge ich eine Menge 0

Fibonacci-Funktionsdefinition hinzu. Jedes Mal nach dem Debuggen zittern meine Hände O(∩_∩)O~

Goldener Schnitt
def gold(x):
    gg= x**2 - 6*x + 9
    return gg

left = 1
right = 7
ans = 0.4
a = left + 0.618 * (right - left)
b = left + 0.382*(right - left)
gga = gold(a)
ggb = gold(b)
i = 0
while i < 7:
    print("i=%s" % i)
    print("left=%s,right=%s" % (left, right))
    print("x左=%s,x右=%s" % (a, b))
    print("y左=%s,y右=%s" % (ggb, gga))
    c = right - left
    if c > 0.4:
        i = i + 1
        if gga > ggb:
            right = a
            a = b
            b = left + 0.382*(right - left)
            gga = ggb
            ggb = gold(b)
        else:#gga<ggb
            left = b
            b = a
            a = left + 0.618 * (right - left)
            ggb = gga
            gga = gold(a)
    else:
        break
Ich weiß nicht, wann ich Ich habe eine Zwangsstörung, solange sie vorhanden ist. Wenn unter dem Code „~“ steht, muss ich sie beseitigen. Lache und weine. Dieses ist sehr einfach. Die ersten vier sind bis auf Fibonacci alle einfach.

Indirekte Methode – quadratische Interpolationsmethode
def yy(x):
    y=x**4-4*x**3-6*x**2-16*x+4
    return y

def xing(xm1,xm2,xm3,fm1,fm2,fm3):
    yxxx=0.5000*((xm2**2-xm3**2)*fm1+(xm3**2-xm1**2)*fm2+(xm1**2-xm2**2)*fm3)/((xm2-xm3)*fm1+(xm3-xm1)*fm2+(xm1-xm2)*fm3)
    return yxxx

x1 = -1.0000
f1 = yy(x1)
x3 = 6
f3 = yy(x3)
x2 = 0.50000*(x1+x3)
f2 = yy(x2)
xp = xing(x1,x2,x3,f1,f2,f3)
fp = yy(xp)
a = abs(xp-x2)
while abs(xp-x2) > 0.05000:
    a = abs(xp - x2)
    if xp > x2:
        if fp > f2:
            x3=xp
            f3=fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")
        else:#f2>fp
            x1 = x2
            f1 = f2
            x2 = xp
            f2 = fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")
    else:#xp<x2
        if fp > f2:
            x1 = xp
            f1 = fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")
        else:
            x3 = x2
            f3 = f2
            x2 = xp
            f2 = fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")

Diese Formel scheint sehr mühsam zu sein, daher sollten Sie beim Schreiben vorsichtiger sein. Das letzte Mal habe ich die 2 unter das Semikolon gesetzt und das Ergebnis war sehr groß, daher ist es besser, es in 0,5 umzuwandeln (PS: Vergessen Sie nicht den langen Fluss von 0).

Obwohl der Code sehr lang ist, liegt das hauptsächlich daran, dass zu viele Ausdrucke vorhanden sind. Ich hatte vor, es am Anfang auszudrucken, aber der letzte Teil würde fehlen. Ich bin zu faul, um an andere Methoden zu denken, also machen wir es einfach so

Indirekte Methode – Newtons Methode

def fd(x):
    y = 4*x**3-12*x**2-12*x-16
    return y
def fdd(x):
    ys = 12*x**2-24*x-12
    return ys

i = 1
x0 = 3.00000
ans = 0.001
while i < 7:
    fd0 = fd(x0)
    fdd0 = fdd(x0)
    if abs(fd0) > ans:
        x1 = x0 - (fd0/fdd0)
        x0 = x1
        print("次数:%s,所得的值x:%s"%(i,x1))
        i = i + 1
    else:#fd0<0.001
        print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
        print("Bingo!顺利通关!祝您开学愉快!")
        print("Boss  X=%s"%x0)
        break

Zuerst bedeutet „geschrieben“ in while „“, was dazu führt, dass es nicht ausgeführt wird. Dann kann Debug nicht verwendet werden. Nachdem ich online nachgesehen hatte, stellte ich fest, dass es „keine Verbindung zum Internet“ + „kein Haltepunkt ausgewählt“ hatte. Schließlich wollte ich versuchen, den Inhalt in else auszugeben, stellte jedoch fest, dass der Bildschirm nach dem Ausführen aktualisiert wurde. Nachdem ich es also auf i<7 geändert hatte, funktionierte es immer noch nicht, also dachte ich darüber nach, eine Pause einzufügen, um aus der Schleife zu springen, und es funktionierte. Dann habe ich gerade debuggt und herausgefunden, dass i+1 im if steht. Da es keine Möglichkeit gibt, +1 zu erhalten, existiert i=6 immer und es wird ständig wiederholt. Denn es spielt keine Rolle, ob man break oder i+1 hinzufügt.

Vor eineinhalb Stunden habe ich die Optimierung der sechs Hauptcodes erfolgreich abgeschlossen, alles von Hand und ohne äußere Gewalt. Glücklich!

Dies ist der erste Satz von Python-Codes, den ich selbst implementiert habe, um mathematische Formeln mithilfe der Python-Sprache zusammenzustellen. Als ich anfing, wusste ich ungefähr, was sich in der Sprache widerspiegeln sollte, aber es war nicht klar. Deshalb habe ich im Internet ein paar Dichotomien gefunden. Sie sind alle unterschiedlich, aber der Rahmen ist ähnlich. Wenn wir unsere Formel verwenden wollen, müssen wir jedoch viel ändern. Dann begann ich, unser Problem zu analysieren, und stellte fest, dass es im Allgemeinen zwei Teile erfordert, einen Teil der Funktionsdefinition und einen Teil des Schleifenkörpers. Aber ich weiß nicht, wie man Funktionen definiert, wie man mathematische Formeln schreibt, wie man Variablen erstellt, was bedeutet, dass ich nicht weiß, wie man einige kleine Dinge macht, also habe ich mich entschieden, direkt zu Baidu zu gehen. Weil ich weiß, dass ich ein guter Leser bin und die Hauptaussagen besser durch Lesen erfassen kann, als wenn ich sie aus einem Video extrahiere. Finden Sie gezielt Wissenspunkte und gewinnen Sie einen besseren Überblick.
Also fing ich an, das erste zu schreiben – Dichotomie. Ich habe festgestellt, dass ich viele Fehler gemacht habe und viele davon sehr grundlegend waren. Aber ich habe mich immer noch nicht für das Video entschieden, sondern habe diese Fragen direkt auf Baidu gesucht, weil Sie den Punkt nach dem Video möglicherweise nicht gefunden haben. Natürlich handelt es sich hierbei um einen Schritt-für-Schritt-Prozess, bei dem es nicht nur darum geht, das Programm einzurichten und es Stück für Stück zu ändern.
Mit dem Erfolg der ersten beiden habe ich festgestellt, dass ich Vertrauen in diese Codes gewonnen habe und ihre Tarnungen zu durchschauen und das Wesentliche zu erfassen schien. Darüber hinaus wurde mir auch klar, dass sich meine Lernfähigkeit seit August stark verbessert zu haben scheint und ich über effektivere Lernmethoden verfüge. Es hat in allen Aspekten ein gewisses Erwachen stattgefunden. Bis auf den ersten, bei dem ich ein paar fehlerhafte Codes fand, wurden die anderen alle nach meiner eigenen Logik geschrieben. Nachdem die Logik klar war, würde ich einfach gehen, wenn ich nicht wüsste, wie man einen bestimmten Teil der Sprache übersetzt Tatsächlich sind diese Routinen alle gleich oder die Routinen zum Transformieren mathematischer Formeln sind gleich.
Mir wurde auch klar, dass Assembler tatsächlich die schwierigste Sprache ist, weil viele von ihnen selbst definiert und bearbeitet werden müssen. Sie müssen sich viele Anweisungen merken und können nicht flexibel sein. Aber für andere müssen Sie nur einige entsprechende aufschreiben. Python ist wirklich einfach. Darüber hinaus schien es mir, als hätte ich heute die Tür zu einer neuen Welt geöffnet, in die ich mich in dieses Ding voller Spiritualität, voller strenger Schönheit und in die unbekannten Veränderungen verliebt habe mit Code. Es ist möglicherweise nicht auf Python beschränkt, diese Sprachen sind voller Herausforderungen. Ich denke, wenn man Zweifel hat, muss man seiner Intuition vertrauen, zumindest habe ich festgestellt, dass sie sehr genau ist

Das obige ist der detaillierte Inhalt vonPython implementiert verschiedene Optimierungsalgorithmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jianshu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen