python实现各种最优化算法


本文摘自php中文网,作者coldplay.xixi,侵删。

python视频教程栏目介绍各种最优化算法

相关免费学习推荐:python视频教程

二分法

函数详见rres,此代码使该算法运行了两次

def asdf(x):

    rres=8*x**3-2*x**2-7*x+3

    returnrres

 

i=2

left=0

right=1

whilei>0 :

    i = i-1

    ans = 0.1

    mid1 = (left + right + ans) / 2

    mid2 = (left + right - ans) / 2

    a=asdf(mid1)

    c=asdf(mid2)

    ifa > 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的优酷),“循环体”和“if条件语句”的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)“数学符号”(详见mofan的优酷),以及print的使用

1.def是python中指定义,一般用来定义函数,如果需要深度学习搭建网络可用来定义网络。值得注意的一点是

return必须要加在函数后面另起一行。

我不清楚为什么,但是如果没有加的话,那个函数公式就是一个花瓶,就像一个结果输不出去。

2.最坑的就是逻辑。一开始逻辑没理清楚,或者说在代码上有疏漏,导致我将left和right放在了循环体里,结果可想而知。不过也是因为这个错误,我知道pycharm中的debug怎么用,挺简单的,百度一下就出来了。

3.不知道什么原因,看的莫烦视频中的print多个变量一起输出是没有办法在我的pycharm中使用的,出来的结果很奇怪。可能是因为我是win10不是ios吧。print如果多个变量一起输出必须是print("名字:%s,名字2:%s"%(a,b))结果输出就是名字:a ,名字2:b

问题:1.为什么要加return?

return的意思是输出这个def里面任意一个变量值作为结果显示。一般情况而言,是输出函数的关系式的命名,这样当你调用这个函数的时候,变量对应的函数值才能显示出来,否则只运行没有结果,不会有效果。

格点法——三点等分法

import numpyasnp

def qwer(x):

    third = np.exp(x) - 5*x

    returnthird

 

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

whilei > 0:

    i=i-1

    ifa > b:

        ifc > 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

            ifa > 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中数据变量。第一遍运行结果出现很明显不对,于是我采用了debug。结果发现,mid1处一直为1而不是1.5,于是就开始了解数据变量。起初我猜测python默认所有变量为整型,但是根据二分法的结果我意识到此猜测不对,所以要改整个file的变量格式没有必要。所以我就在mid1式子前面加了一个float,结果就显示为1.5了。但是如果我将整个式子用()括起来,前面加float,结果还是1。我不太理解为什么。不过我知道了python的数据格式是根据输入量决定的,也就是说你的输入量如果是整型,那么与其直接相关的计算输出结果一定是整型,而且还是不采用进位的整型。在我没有采用+float/+.0这两种方法之前,mid1~3全部是整型。

left = 1.0

right = 2.0

mid1 =(left+right) / 2

或者不再mid1前面加float,直接将输入量后面点个点就行
真的很想吐槽一下print,好麻烦啊啊啊啊每次都得弄个%s,而且有时候还不能放一起!!!!

Fibonacci法

def fibonacci(n):

    i=0

    a = 0

    b = 1

    fori in range(n):

        i=i+1

        c = a+b

        a = b

        b = c

    returnc

def bn(x):

    ert = x**2 - 6*x + 2

    returnert

z = 2

p = 0

left = 0.00000

right = 10.00000

L1 = right - left

whilez < 100:

    m = fibonacci(z)

    l = L1/m

    k = 1.000/m

    ifk < 0.03:

        print("n=%s,Fn=%s"%(z,m))

        L2 = l*fibonacci(z-1)

        t = left + L2

        r = right -L2

        whilep < 3:

            p = p + 1

            l3 = t - r

            e= bn(t)

            o = bn(r)

            ife>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
fibonacci函数定义,每次debug后我的手都是抖的O(∩_∩)O~

黄金分割法

def gold(x):

    gg= x**2 - 6*x + 9

    returngg

 

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

whilei < 7:

    print("i=%s"% i)

    print("left=%s,right=%s"% (left, right))

    print("x左=%s,x右=%s"%

相关阅读 >>

Python怎么遍历列表进行操作

Python中关于str与repr的使用详解

Python中的条件语句怎么写02:同时判断与简单的语句组

Python自带numpy吗

Python怎么将列表转为字符串

Python的调试:logging和pdb(实例解析二)

Python在普通工作中的应用有那些

Python如何逆序输出数组

Python面向对象之访问限制

Python函数中的可变参数定义方法以及参数的传递方法解析

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...