Maison  >  Article  >  développement back-end  >  Python implémente divers algorithmes d'optimisation

Python implémente divers algorithmes d'optimisation

coldplay.xixi
coldplay.xixiavant
2020-12-02 17:03:585988parcourir

Tutoriel vidéo PythonLa colonne présente divers algorithmes d'optimisation

Python implémente divers algorithmes d'optimisation

Recommandations d'apprentissage gratuites associées : Tutoriel vidéo Python

Dichotomie

Pour plus de détails sur la fonction, voir rres Ce code fait exécuter l'algorithme deux fois

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))
rrreeMatériel :

C'est le premier code que j'ai implémenté. Après avoir appris l'algorithme, le cadre logique est fondamentalement là, et la seule chose qui doit être clarifiée est le langage python correspondant. J'ai donc commencé à chercher "comment définir une fonction" (voir Youku de mofan pour plus de détails), le format du "corps de la boucle" et "l'instruction conditionnelle if" (https://blog.csdn.net/qq_39407518/article/details/ 79822498) "Symboles mathématiques" (voir Youku de mofan pour plus de détails), et l'utilisation de print

1.def est la définition du majeur de python. Il est généralement utilisé pour définir des fonctions si un apprentissage en profondeur est nécessaire. construire un réseau, il peut être utilisé pour définir le réseau. Une chose à noter est que

return doit être ajouté sur une nouvelle ligne après la fonction.

Je ne sais pas pourquoi, mais s'il n'y a pas d'addition, la formule de la fonction est comme un vase, comme un résultat qui ne peut pas être sorti.

2. La chose la plus déroutante est la logique. La logique n'était pas claire au début, ou il y avait des omissions dans le code, ce qui m'a amené à mettre gauche et droite dans le corps de la boucle. Le résultat est prévisible. Mais c'est aussi à cause de cette erreur que j'ai su comment utiliser le débogage dans pycharm. C'était assez simple et Baidu l'a trouvé instantanément.

3. Je ne sais pas pourquoi, mais la sortie d'impression de plusieurs variables dans la vidéo que j'ai regardée ne peut pas être utilisée dans mon pycharm, et le résultat est très étrange. C'est peut-être parce que je suis sur Win10 et non sur iOS. print Si plusieurs variables sont sorties ensemble, elles doivent être print("Name: %s, Name 2: %s" %(a, b)). > Question : 1. Pourquoi ajouter un retour ?

return signifie afficher n'importe quelle valeur de variable dans cette définition comme résultat. De manière générale, l'expression relationnelle de la fonction de sortie est nommée de telle sorte que lorsque vous appelez cette fonction, la valeur de la fonction correspondant à la variable puisse être affichée, sinon elle ne s'exécutera que sans résultat et n'aura aucun effet.

Méthode des points de grille - méthode de division égale en trois points

左极限=0.45,右极限=0.775,极小值x=0.6125
rrree
À propos des variables de données en python. Les résultats de la première exécution étaient évidemment erronés, j'ai donc utilisé le débogage. Il s'est avéré que mid1 était toujours égal à 1 au lieu de 1,5, nous avons donc commencé à comprendre les variables de données. Au début, j'ai deviné que toutes les variables en Python étaient de type entier par défaut, mais sur la base des résultats de la dichotomie, j'ai réalisé que cette supposition était fausse, il n'était donc pas nécessaire de changer le format des variables de l'ensemble du fichier. J'ai donc ajouté un flottant devant la formule mid1, et le résultat était affiché comme 1,5. Mais si j'entoure la formule entière avec () et que j'ajoute un float devant, le résultat est toujours 1. Je ne comprends pas très bien pourquoi. Cependant, je sais que le format des données de Python est déterminé en fonction du montant d'entrée, c'est-à-dire que si votre montant d'entrée est un entier, alors la sortie du calcul qui y est directement liée doit être un type entier, et c'est un entier. type qui n’utilise pas de transport. Avant d'utiliser les deux méthodes +float/+.0, mid1~3 étaient tous des nombres entiers.

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)

Ou au lieu d'ajouter un flotteur devant mid1, cliquez simplement sur un point après le montant saisi

Je veux vraiment me plaindre de l'impression, c'est tellement gênant que je dois obtenir un %s à chaque fois. . Et parfois, ils ne peuvent pas être assemblés ! ! ! !

Méthode de Fibonacci

最小值=1.609375
函数值=-3.047189552275773
Ne me demandez pas ce que je maîtrise, demandez-moi à quel point j'aime la représentation précise de python après avoir écrit ce code :-) J'ai décidé d'écrire simplement des formules mathématiques dans le futur Le code ajoutera beaucoup de définition de fonction 0

fibonacci après les petits points mathématiques de la quantité d'entrée. Mes mains tremblent à chaque fois après le débogage de O(∩_∩)O~

Golden Section<.>

left = 1.0
right = 2.0
mid1 =(left+right) / 2

Je ne sais pas quand j'ai eu un trouble obsessionnel-compulsif. Tant qu'il y a un "~" sous le code, je dois m'en débarrasser. Rire et pleurer. Celui-ci est très simple. Les quatre premiers sont tous simples à l’exception de Fibonacci.

Méthode indirecte - méthode d'interpolation quadratique

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)

Cette formule semble très gênante, vous devriez donc être plus prudent lorsque vous l'écrivez. La dernière fois j'ai mis le 2 sous le point-virgule, et le résultat était très gros, il vaut donc mieux le convertir en 0,5 (PS : N'oubliez pas le long fleuve de 0).

Bien que le code soit très long, c'est principalement parce qu'il y a trop d'impressions. J'avais prévu de l'imprimer au début, mais à la fin la dernière partie a été manquée. Je suis trop paresseux pour penser à d'autres méthodes, alors faisons ceci

Méthode indirecte - Méthode de Newton

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

Au début, < la course pour ne pas sortir. Ensuite, le débogage ne peut pas être utilisé. Après vérification en ligne, j'ai découvert qu'il n'était "pas connecté à Internet" + "aucun point d'arrêt sélectionné". Enfin, je voulais essayer d'afficher le contenu dans else, mais j'ai constaté que l'écran était actualisé après l'exécution. Donc, après l'avoir changé en i<7, cela ne fonctionnait toujours pas, alors j'ai pensé à ajouter un break pour sortir de la boucle, et cela a fonctionné. Ensuite, je viens de déboguer et j'ai découvert que i+1 est dans le if. Parce qu'il n'y a aucun moyen de +1, i=6 existe toujours et il continue de tourner en boucle. Parce que peu importe que vous ajoutiez break ou i+1.

Il y a à peine une heure et demie, j'ai terminé avec succès l'optimisation des six codes majeurs, le tout à la main, sans aucune force extérieure. Heureux !

Il s'agit du premier ensemble de codes Python que j'ai implémenté moi-même, qui consiste à assembler des formules mathématiques en utilisant le langage Python. Quand j’ai commencé, je savais à peu près ce qui devait être reflété dans le langage, mais ce n’était pas clair. J'ai donc trouvé quelques dichotomies sur Internet. Elles sont toutes différentes, mais le cadre est similaire. Cependant, si nous voulons utiliser notre formule, nous devons beaucoup changer. Ensuite, j'ai commencé à analyser notre problème et j'ai découvert qu'il nécessite généralement deux parties, une partie de définition de fonction et une partie de corps de boucle. Mais je ne sais pas comment définir des fonctions, comment écrire des formules mathématiques, comment créer des variables, ce qui veut dire que je ne sais pas comment faire certaines petites choses, alors j'ai choisi d'aller directement sur Baidu. Parce que je sais que je suis un bon lecteur et que je sais mieux comprendre les points clés en lisant qu’en les extrayant d’une vidéo. Trouvez des points de connaissance utiles et ayez une compréhension plus ferme.
J'ai donc commencé à écrire le premier - la dichotomie. J’ai découvert que j’avais fait beaucoup d’erreurs et que beaucoup d’entre elles étaient très basiques. Mais je n'ai toujours pas choisi la vidéo. Au lieu de cela, j'ai cherché ces questions directement sur Baidu, car vous n'auriez peut-être pas trouvé l'essentiel après la vidéo. Bien entendu, il s’agit d’un processus étape par étape, il ne s’agit pas simplement de mettre en place le programme et de le modifier petit à petit.
Avec le succès des deux premiers, j'ai constaté que j'avais pris confiance dans ces codes, et semblais voir à travers leurs déguisements et en saisir l'essence. De plus, j'ai également réalisé que ma capacité d'apprentissage semble s'être beaucoup améliorée depuis août et que j'ai des méthodes d'apprentissage plus efficaces. Il y a eu un certain réveil dans tous les aspects. À l'exception du premier où j'ai trouvé quelques codes erronés, les autres ont tous été écrits selon ma propre logique, une fois que la logique était claire, si je ne savais pas comment traduire une certaine partie de la langue, j'y allais. à Baidu En fait, ces routines sont toutes les mêmes ou Les routines de transformation des formules mathématiques sont les mêmes.
J'ai également réalisé que l'assemblage est en fait le langage le plus difficile d'après ce que j'ai appris jusqu'à présent, car beaucoup d'entre eux doivent être définis par moi-même, ils doivent se souvenir de beaucoup d'instructions et ne peuvent pas être flexibles. Mais pour d’autres, il suffit d’écrire quelques correspondants. python est vraiment simple. De plus, j'ai découvert qu'aujourd'hui j'avais ouvert la porte à un nouveau monde. Je suis tombé amoureux de cette chose pleine de spiritualité, pleine de beauté rigoureuse, et j'ai découvert que j'avais l'impression de tomber amoureux. avec code. Cela ne se limite peut-être pas à python, ces langages regorgent de défis. Je pense qu'en cas de doute, il faut faire confiance à son intuition, au moins je l'ai trouvée assez précise

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer