Pythonのさまざまな最適化アルゴリズムを実装する

Pythonビデオチュートリアルセクションでは、さまざまな最適化アルゴリズムを紹介しています

関連する無料学習の推奨事項:Pythonビデオチュートリアル

二分
関数はrresを参照してください。このコードにより、アルゴリズムが2回実行されます。

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

収穫:
これは私が実装した最初のコードです。アルゴリズムを学習した後、論理フレームワークは基本的にそこにあり、明確に残っているのは対応するPython言語です。そこで、「関数の定義方法」(mofanのYoukuを参照)、「ループ本体」、「if条件文」の形式(https://blog.csdn.net/qq_39407518/article/details/79822498)「数学」を探し始めました。シンボル」(詳細はmofanのYoukuを参照)、および印刷の使用

1. Defは、Pythonの中指の定義であり、一般に関数を定義するために使用されます。ネットワークを構築するためにディープラーニングが必要な場合は、それを使用してネットワークを定義できます。注目に値する

新しい行を開始するには、関数の後にリターンを追加する必要があります。

理由はわかりませんが、追加しないと結果が入力できないのと同じように関数式は花瓶になります。

2.最悪のことは論理です。当初、ロジックが明確でなかったり、コードが抜けていたりして、ループ本体に左右を入れてしまい、結果が想像できます。しかし、このエラーのために、私はpycharmでデバッグを使用する方法を知っています。それは非常に簡単です。Baiduはワンクリックで出てきました。

3.理由がわかりません。Mofanビデオのprintの複数の変数は、私のpycharmでは使用できません。結果は非常に奇妙です。多分それは私がiOSではなくwin10だからです。print複数の変数が一緒に出力される場合は、print( "name:%s、name 2:%s"%(a、b))である必要があります。結果の出力はname:a、name 2:bです。

質問:1。なぜリターンを追加するのですか?
Returnは、このdefの変数値を結果表示として出力することを意味します。一般的には、出力関数のリレーショナル式の名前であるため、この関数を呼び出すと、変数に対応する関数値を表示できます。それ以外の場合は、結果なしでのみ実行され、効果はありません。

グリッドポイント法-3点等分割法

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

Pythonのデータ変数について。最初の実行の結果は明らかに間違っていたので、デバッグを使用しました。mid1は常に1.5ではなく1であることがわかったので、データ変数を理解し始めました。最初は、Pythonはデフォルトですべての変数を整数として設定していると思いましたが、二分法の結果によると、この推測が間違っていることに気付いたので、ファイル全体の変数形式を変更する必要はありません。そこで、mid1式の前にフロートを追加すると、結果は1.5になりました。しかし、数式全体を()で囲み、その前にfloatを追加すると、結果は1のままになります。理由がよくわかりません。しかし、Pythonデータ形式は入力によって決定されることを知っています。つまり、入力が整数の場合、直接関連する計算出力は整数でなければならず、整数はまだ使用されません。+ float /+。0の2つの方法を使用しなかった前は、mid1〜3はすべて整数でした。

left = 1.0

right = 2.0

mid1 =(left+right) / 2

または、mid1の前にfloatを追加しなくなり、入力量の後ろのドットをクリックするだけです。
本当にプリントを吐き出したいのですが、%sを取得する必要があるたびに、とても面倒です。それらをまとめてください!

フィボナッチ法

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)

私が習得したことを聞かないで、今このコードを書いた後、Pythonの精度がどれだけ好きか尋ねてください:-)私が書いている限り、入力量の小さな数学的なポイントの後に多くの0
フィボナッチを追加することにしました将来の数式のコード関数定義、O(∩_∩)O〜をデバッグした後、毎回手が震えています

黄金分割

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
            left = b

            b = a

            a = left + 0.618 * (right - left)

            ggb = gga

            gga = gold(a)

    else:

        break

いつ強迫性障害になるのかわかりません。コードの下に「〜」がある限り、それを排除する必要があります。笑って泣きます。これは非常に単純です。最初の4つは、フィボナッチを除いて非常に単純です。

間接法-二次補間

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
        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("******************")

この式は非常に面倒なようですので、書くときは注意してください。前回はセミコロンの下に2を入れましたが、結果が非​​常に大きいので、0.5に変換することをお勧めします(PS:0の長い川を忘れないでください)。
コードは非常に長いですが、主に印刷が多すぎることが原因です。最初に印刷する予定でしたが、最終的には最後の部分が抜けてしまいます。私は他の方法を考えるのが面倒です、ただそれをしてください

間接法-ニュートン法

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

当初、「書き込み」があったためにランが出ませんでした。そうすると、デバッグは役に立たなくなります。オンラインで確認したところ、「インターネット接続がありません」+「ブレークポイントが選択されていません」でした。最後に、elseにコンテンツを出力してみたかったのですが、実行後に画面がスワイプされていました。それで、i <7に変更した後もまだ機能しないので、ループから飛び出すためにブレークを追加することを考えました、そしてそれは機能しました。
次に、デバッグを取得したところ、+ 1を実行する方法がないため、i + 1が含まれていることがわかりました。したがって、i = 6は常に存在し、ループし続けます。breakまたはi + 1を追加してもかまいません。

ちょうど1時間半前、私は6つの主要なコード、純粋な手、外力なしの最適化を無事に完了しました。Happy!
これは私が自分で実装した最初のPythonコードのセットであり、Python言語で数式を組み立てることです。最初は、言語に何を反映する必要があるかを知っていましたが、はっきりしていませんでした。それで、インターネット上でいくつかの二分法を見つけました。それらはすべて異なりますが、フレームワークは似ていますが、式を使用する場合は、大幅に変更する必要があります。次に、問題の分析を開始しました。大まかに2つの部分、1つの部分の関数定義、および1つのループ本体が必要であることがわかりました。しかし、関数の定義方法、数式の書き方、変数の作り方がわからないので、小さな点があまり良くないので、Baiduを直接選びます。私は読書が得意であることを知っているので、ビデオから要素を抽出するよりも、読書を通じて要点を理解するのが得意です。意図的に知識のポイントを見つけ、よりしっかりと把握します。
それで私は最初のものを始めました-二分法。私は多くの間違いを犯し、それらの多くは非常に基本的なものであることがわかりました。しかし、私はまだビデオを選びませんでしたが、ビデオの後であなたがポイントを見つけることができないかもしれないので、Baiduでこれらの質問を直接探しました。もちろん、これは単にプログラムを立ち上げて少しずつ変更するのではなく、段階的に行われます。
最初の2つが成功したことで、私はこれらのコードに自信を持ち、彼らの変装を見抜いて本質を把握しているように見えました。また、8月からは学習能力が大幅に向上しているようで、より効果的な学習方法があることも実感しています。すべての面で特定の目覚めがあります。最初のコードを除いて、いくつかの間違ったコードを見つけましたが、他のコードは自分のロジックに従って書かれています。ロジックが渡された後、対応する言語の特定の部分を翻訳して百度に行く方法がわかりません。 、これらのルーチンは同じであるか、数式変換のルーチンは同じであると言われています。
また、組み立てが実際に最も難しい言語であることに気づきました。これまでに学んだことは、それらの多くは自分で定義する必要があり、多くの指示を覚える必要があり、柔軟ではないということです。しかし、他の人のために、いくつかの対応するものを書き留めてください。Pythonは本当にシンプルです。また、今日は新しい世界への扉を開いたようで、厳格な美しさと未知の変化に満ちたこの精神的なものに恋をし、コードに恋をしているように見えました。それはPythonに限定されないかもしれません、これらの言語は挑戦でいっぱいです。疑問がある場合は、直感を信頼する必要があると思います。少なくとも、正確であることがわかりました。
この記事は、php中国語のWebサイトからのものです:pythonビデオチュートリアルセクションhttps://www.php.cn/course/list/ 30.html

おすすめ

転載: blog.csdn.net/Anna_xuan/article/details/110878491