热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线材下料优化python算法_python实现——最优化算法

二分法函数详见rres,此代码使该算法运行了两次defasdf(x):rres8*x**3-2*x**2-7*x3returnrresi2left0right1whi

二分法

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

7e1b6bb8b6e39c4795b9ae831b2db763.png

def asdf(x): rres=8*x**3-2*x**2-7*x+3 return rresi=2left=0right=1while 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 = mid2b=(left+right) / 2print("左极限=%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的使用

021b0e1b2aecb8c5f652bb59c8ffc597.png

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

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

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

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

d13b236641f908d158352d7bf5c615c9.png

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

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

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

格点法——三点等分法

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

c64d67852645a57e0b12b47e82cc1339.png

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

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

Fibonacci法

def fibonacci(n): i&#61;0 a &#61; 0 b &#61; 1 for i in range(n): i&#61;i&#43;1 c &#61; a&#43;b a &#61; b b &#61; c return cdef bn(x): ert &#61; x**2 - 6*x &#43; 2 return ertz &#61; 2p &#61; 0left &#61; 0.00000right &#61; 10.00000L1 &#61; right - leftwhile z <100: m &#61; fibonacci(z) l &#61; L1/m k &#61; 1.000/m if k <0.03: print("n&#61;%s,Fn&#61;%s"%(z,m)) L2 &#61; l*fibonacci(z-1) t &#61; left &#43; L2 r &#61; right -L2 while p <3: p &#61; p &#43; 1 l3 &#61; t - r e&#61; bn(t) o &#61; bn(r) if e>o : right &#61; t t &#61; r r &#61; left &#43; l3 else:#o>e left &#61; r r &#61; t t &#61; right - l3 break else: z &#61; z &#43; 1okk&#61;(left&#43;right)/2okky&#61;bn(okk)print(left)print(right)print("极小值x&#61;",okk)print("极小值y&#61;",okky)

不要问我掌握了什么&#xff0c;要问我现在写完这个代码后有多么的爱python的精度表示 :-)我决定以后只要再编写数学公式的代码都将输入量的小数学点后面补很多0fibonacci函数定义&#xff0c;每次debug后我的手都是抖的O(∩_∩)O~

1389f4ad3185348d1e4982bdebdb6129.png

黄金分割法

def gold(x): gg&#61; x**2 - 6*x &#43; 9 return ggleft &#61; 1right &#61; 7ans &#61; 0.4a &#61; left &#43; 0.618 * (right - left)b &#61; left &#43; 0.382*(right - left)gga &#61; gold(a)ggb &#61; gold(b)i &#61; 0while i <7: print("i&#61;%s" % i) print("left&#61;%s,right&#61;%s" % (left, right)) print("x左&#61;%s,x右&#61;%s" % (a, b)) print("y左&#61;%s,y右&#61;%s" % (ggb, gga)) c &#61; right - left if c > 0.4: i &#61; i &#43; 1 if gga > ggb: right &#61; a a &#61; b b &#61; left &#43; 0.382*(right - left) gga &#61; ggb ggb &#61; gold(b) else:#gga

不知道自己什么时候有的强迫症&#xff0c;只要是代码下面有“~”我就必须要消掉。笑哭。这个很简单&#xff0c;前四个除了费波纳茨&#xff0c;都很简单。

c2d6af8c9cd867af6258174ff24c2424.png

间接法——二次插值法

def yy(x): y&#61;x**4-4*x**3-6*x**2-16*x&#43;4 return ydef xing(xm1,xm2,xm3,fm1,fm2,fm3): yxxx&#61;0.5000*((xm2**2-xm3**2)*fm1&#43;(xm3**2-xm1**2)*fm2&#43;(xm1**2-xm2**2)*fm3)/((xm2-xm3)*fm1&#43;(xm3-xm1)*fm2&#43;(xm1-xm2)*fm3) return yxxxx1 &#61; -1.0000f1 &#61; yy(x1)x3 &#61; 6f3 &#61; yy(x3)x2 &#61; 0.50000*(x1&#43;x3)f2 &#61; yy(x2)xp &#61; xing(x1,x2,x3,f1,f2,f3)fp &#61; yy(xp)a &#61; abs(xp-x2)while abs(xp-x2) > 0.05000: a &#61; abs(xp - x2) if xp > x2: if fp > f2: x3&#61;xp f3&#61;fp xp &#61; xing(x1, x2, x3, f1, f2, f3) fp &#61; yy(xp) print("ans&#61;%s" % a) print("left&#61;%s,right&#61;%s" % (x1, x3)) print("x*&#61;%s,fp*&#61;%s" % (xp, fp)) print("x2&#61;%s,f2&#61;%s" % (x2, f2)) print("******************") else:#f2>fp x1 &#61; x2 f1 &#61; f2 x2 &#61; xp f2 &#61; fp xp &#61; xing(x1, x2, x3, f1, f2, f3) fp &#61; yy(xp) print("ans&#61;%s" % a) print("left&#61;%s,right&#61;%s" % (x1, x3)) print("x*&#61;%s,fp*&#61;%s" % (xp, fp)) print("x2&#61;%s,f2&#61;%s" % (x2, f2)) print("******************") else:#xp f2: x1 &#61; xp f1 &#61; fp xp &#61; xing(x1, x2, x3, f1, f2, f3) fp &#61; yy(xp) print("ans&#61;%s" % a) print("left&#61;%s,right&#61;%s" % (x1, x3)) print("x*&#61;%s,fp*&#61;%s" % (xp, fp)) print("x2&#61;%s,f2&#61;%s" % (x2, f2)) print("******************") else: x3 &#61; x2 f3 &#61; f2 x2 &#61; xp f2 &#61; fp xp &#61; xing(x1, x2, x3, f1, f2, f3) fp &#61; yy(xp) print("ans&#61;%s" % a) print("left&#61;%s,right&#61;%s" % (x1, x3)) print("x*&#61;%s,fp*&#61;%s" % (xp, fp)) print("x2&#61;%s,f2&#61;%s" % (x2, f2)) print("******************")

这个公式看起来很麻烦&#xff0c;编写的时候更要谨慎。我上回把那个2搁在了分号下面&#xff0c;结果很大&#xff0c;所以还是换算成0.5更好(PS&#xff1a;勿忘那长河般的0)。虽然代码很长&#xff0c;但是主要是因为print太多。本打算在开头print&#xff0c;最后结果会漏掉最后一部分。懒得想其他办法了&#xff0c;直接就这样吧

f280e06c12a4ac2e15ca4b4f98a4a066.png

间接法——牛顿法

def fd(x): y &#61; 4*x**3-12*x**2-12*x-16 return ydef fdd(x): ys &#61; 12*x**2-24*x-12 return ysi &#61; 1x0 &#61; 3.00000ans &#61; 0.001while i <7: fd0 &#61; fd(x0) fdd0 &#61; fdd(x0) if abs(fd0) > ans: x1 &#61; x0 - (fd0/fdd0) x0 &#61; x1 print("次数&#xff1a;%s,所得的值x:%s"%(i,x1)) i &#61; i &#43; 1 else:#fd0<0.001 print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$") print("Bingo!顺利通关&#xff01;祝您开学愉快&#xff01;") print("Boss X&#61;%s"%x0) break

一开始while里面,导致run不出来。继而&#xff0c;debug也没法用。在网上一查才知道 “没联网”&#43;“没选断点”。最后想尝试将else里面的内容输出来&#xff0c;结果发现run以后被刷屏了。于是改成i<7以后还是不行&#xff0c;于是想着加一个break跳出循环&#xff0c;结果成效了。然后刚刚由debug了一下&#xff0c;才知道原来是i&#43;1在if里面&#xff0c;因为没有办法&#43;1&#xff0c;所以i&#61;6一直存在&#xff0c;就不断循环。因为加break也好&#xff0c;i&#43;1也好&#xff0c;都可以。

ca8d4586c7b2d5dad9874d3d59d58c2b.png

之前&#xff0c;我成功搞完了最优化六大代码&#xff0c;纯手打&#xff0c;无外力。开心!

这是我第一组自己实现的python代码&#xff0c;就是数学公式用python语言组装起来。刚开始的时候知道大概需要在语言中体现什么&#xff0c;但不太清楚。于是我就在网上找了几个二分法的&#xff0c;他们都各有不同&#xff0c;但框架都差不多&#xff0c;不过如果要用到我们的那个公式里还需要改变很多。然后我就开始分析我们的题&#xff0c;我发现大题需要两部分&#xff0c;一部分函数定义&#xff0c;一部分循环题。但我不知道如何定义函数&#xff0c;如何写数学公式&#xff0c;如何弄变量&#xff0c;也就是说一些小点不太会&#xff0c;所以我选择直接百度。

26e1835a8d59aad12545db259e64e7a2.png

因为我知道自己阅读的能力不错&#xff0c;相比于从视频中提取要素&#xff0c;我更擅长通过阅读获得要点。有目的性地找知识点&#xff0c;掌握地更牢固。于是我就开始了第一个——二分法的编写。我发现&#xff0c;自己出现了很多错误而且有很多地方都很基础。但我依然没选择视频&#xff0c;而是将这些问题直接在百度上找&#xff0c;因为视频讲完或许你也没找到点。当然&#xff0c;这是一步一步走的&#xff0c;不是直接就将程序摆上去&#xff0c;一点一点改。随着前两个的成功&#xff0c;我发现自己对于这些代码有了自信&#xff0c;似乎看透了他们的伪装&#xff0c;抓住了本质。

fe5c155bc808ef1cf28dfc74d9c1b53f.png

除此之外&#xff0c;我还意识到自己自从8月份以后&#xff0c;学习能力似乎提高了不少&#xff0c;而且有了更为有效的学习方法。各方面都有了一定的觉醒。除了第一个找了几个牛头不对马嘴的代码&#xff0c;其他都是根据自己的逻辑写&#xff0c;逻辑通下来以后&#xff0c;对应语言中某一部分不知道如何翻译就去百度&#xff0c;其实这几个套路都一样或者说数学公式转化的套路都一样。

aef222434d218cdd6e818b339cbbedb5.png

我还意识到&#xff0c;汇编其实是最难的语言&#xff0c;目前为止所学到的&#xff0c;因为很多都需要自己去定义&#xff0c;去死抠&#xff0c;需要记住大量的指令且不能灵活变通。但是其他的却只需要将一些对应的记下来就好。python真的挺简单的。而且&#xff0c;我发现自己今天似乎打开了新世界的大门&#xff0c;我爱上了这种充满了灵性的东西&#xff0c;充满了严谨的美丽&#xff0c;还有那未知的变化&#xff0c;我发现我似乎爱上了代码。可能不仅仅局限于python&#xff0c;这些语言都充满了挑战性。我觉得当你疑惑的时候&#xff0c;就需要相信直觉&#xff0c;至少我发现它很准

有问题欢迎大家在评论区留言讨论&#xff0c;点关注支持一下&#xff01;



推荐阅读
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
author-avatar
antefigure850_495
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有