首页/文章/ 详情

基于Python的遗传算法实现

17分钟前浏览17

1. 废话的一章(可跳过)

最近有人问我,说,L老师,发生了肾么事情?公 众号咋不更新了呢。


我一看,哦,原来都两个月过去了,确实没更。

 

没更的原因有很多,一个是最近工作上的变化。另一个就是最近做的单子少,多是可写可不写的。唯一一个描述载荷移动的疲劳分析,我把原先“以静代动”的方法,换成了“动静结合”,算是这两个月的得意之笔吧。

 

这段时间探索的新技术不多,但是笔杆子没少动。写了好些报告,做了好些ppt,还从其他途径参与到一些有意思的项目,出了很多好点子。嗯,没机会亲手做试验,躲在后面出谋划策的感觉也不错,回头可以考虑买个羽毛扇。

 

最近总体来说,睡眠也是不错的,敞开了睡,能睡10个小时,这是我这几年都不曾享受到的,朕的头发估计能保住了

 

开始学Python,粗略翻了几本书,装上了软件,摸索起来。这是继ANSA之后,又一次开始0基础学新东西,算是给自己的知识库加装了一个新模块。

 

最近喝酒也不少,不过都不敢喝醉,醉一次太难受了,我这日渐老化的身体可扛不住,只能在醉酒的边缘疯狂试探。

 

好看的小说也遇到几本。《我的师兄实在太稳健了》、《大奉打更人》,前者轻松娱乐,主角稳如老狗,不稳个几十手,从不出手。后者通篇都是黄色笑话,我严重怀疑作者就是为了讲荤段子才写的这本书,淦。

 

年初的时候,打死我也想不到年尾的这两个月在自己发生的各类魔幻事件。或许,我离一个真正的工程师越来越近了吧。追求还是在的:上马做撸铁做试验,下马键盘写报告,左手网格做仿真,右手代码搞算法。

 

总而言之,俺更成熟了。希望明年越来越好!

 

2. 接触Python的感受

 

最大的感受,还是源于和MATLAB的对比。首先一个感觉就是乱,列表、元组、字典,常常搞混。应该是我用的太少的原因了吧。

 

另一个感受就是,很明显,Python能搞的更花哨,与网页交互、与ABAQUS交互、游戏开发等等。干的事情更贴近大众了。

 

实际上,我学这个软件,应该还是为了更方便地跟ABAQUS交互。之所以第一个算例拿遗传算法练手,也是看后面能不能用到复合材料的优化分析上。

 

目前,我的要求并不高哈,入门就行。

 

3. 遗传算法的实现过程

老早就想研究下遗传算法,搞搞所谓的优化问题。实际上,这个理论上个世纪就已经很成熟了,随便下载几本老书,一个晚上也就看懂了。房间大灯一关,拉开床边的窗帘,打开床头的看书灯,大窗外月光皎洁,寒风呼啸,我躺在电热毯上,学着学着,嗯也就睡着了。

其实好多类似于遗传算法这种上个世纪的东西,在最近这些年被国内追捧的不行。动辄就吹爆的机器学习、人工智能、神经网络、3D打印,都是几十年前的。。。现在大家到处吹,课题里吹,项目里吹,会议里吹,实在搞不懂。也对,技术内卷嘛,口 活先行。

 

遗传算法是通过模拟自然界的进化过程,达到筛选优化的目的。比如你要求一个函数在某个区间的最大值,先给定一组初始值作为0代祖先,然后设置筛选标准,淘汰一些不好的个体,这些个体自身的值可以转换成二进制的DNA编码,然后随机两两配对,交换DNA片段,形成新的个体,如果再考虑基因变异,让二进制一些位置的0或者1,反置。这样就彻底完成新一代种群的产生。搞个几十代,嗯,最后发现整个种群趋同了,也就是收敛了。

 

哇,做的时候,可以享受到造物主般的感受。

 

从上面的过程也看到了,一个简单遗传算法的实现,需要搞出一下东西:

 

(1)订立编码和解码规则。比如二进制来存储信息;

(2)订立筛选(基因遗传)规则。比如可以用轮盘赌算法,干掉那些不合格的个体;

(3)建立基因交叉算子。随机配对算法、DNA片段交叉算法;

(4)建立基因变异算子。DNA片段随机变异算法。

 

网上讲这些东西的文章很多啦,我这就不说具体算法的实现了。展示下我的算例和结果吧!

算例:考虑y=x2在[0.31],区间上的最大值。经过30次迭代的均值结果如下:


基本上最后会在30左右浮动。不过这个是我给的比较好的结果。有的时候,它也会收敛在一个不太高的水平上。

因为程序里面用了很多随机数,所以是不能保证每次结果都一样的。而且遗传算法对初值的依赖性很强,并且十分“早熟”,很快就达到收敛状态,不管收敛的结果好不好。只负责赶紧生娃制造下一代,不考虑质量!

 

所以,真正实用的遗传算法还需要根据具体问题,做大量的训练积累经验数据,然后对各个关键算子,做出一定的改进。

 

果然啊,造物主不好当,上帝造人也不知废了多少劲,说不定也失败了无数次。当然,这一次是不是成功的呢?很难讲。

 

读者讨论功能目前被禁了,大家有自己好看的科研故事可以投稿给我!



算法附后













































































































# -*- coding: utf-8 -*-"""SpyderEditor
Thisis a temporary script file."""importrandomimportnumpy as npimportmathfromnumpy import *importmatplotlib.pyplot as pltn_group=6#群体大小n_gen=30#代数S=[31,0,15,random.randint(0, 31),random.randint(0, 31),random.randint(0, 31)]#初始化种群jnum=0print(S)junzhi=[]junzhi.append(mean(S))number_gen=[]number_gen.append(jnum)while jnum < n_gen:
#编码——采用二进制Sb=[]fori in S:zhuanhuanjinzhi = '{:05b}'.format(i)Sb.append(zhuanhuanjinzhi)#计算适应度f=[]fsum=0fzhi=[]fori in S:fs = i**2fsum=fsum+fsfzhi.append(fs)f.append(fs)fp=np.array(fzhi)/fsum #计算个体适应度#    print (fp)    fpsum=[] fpsumx=0         fori in fp:fpsumx=fpsumx+ifpsum.append(fpsumx)#计算个体累计概率#    print (fpsum)    fxz=np.zeros((len(fp)),dtype=np.int64)xs=0#---------------------------复 制 ---------------------------    whilexs <len(fxz):               #———轮盘赌算法random_value = random.random()#        print (random_value)forss in range(len(fxz)):ifss==len(fxz)-1:sx=0else:sx=ss+1   iffpsum[ss] <= random_value and fpsum[sx] >= random_value:cind=sxbreakfxz[cind]=fxz[cind]+1            xs=xs+1#根据复 制结果,更新一轮种群Sbb=[]xs=0    whilexs <len(fxz): iffxz[xs] > 0:zhongqunfuzhi=[Sb[xs]]*fxz[xs]foryuansu in zhongqunfuzhi:Sbb.append(yuansu)xs=xs+1    Sb=Sbb#---------------------------交叉---------------------------#随机两两配对——from https://www.jianshu.com/p/d29091e7e37a?from=groupmessage#    print(Sb)ifjnum%2 ==0:members = Sbrandom.shuffle(members)d= list(range(0,len(members),2))Sbb=[]jxweizhi=math.floor(len(Sb[1])/2)+1fori in d: Sbb.append(members[i][0:jxweizhi]+members[i+1][jxweizhi:])Sbb.append(members[i+1][0:jxweizhi]+members[i][jxweizhi:])Sb=Sbb#---------------------------变异---------------------------
jxweizhi=math.floor(len(Sb[1])/2)               ifjnum%10 ==0:ifint(Sb[bianyiw][0]) == 0:Sb[bianyiw] ='1'+Sb[bianyiw][1:]else:Sb[bianyiw] ='0'+Sb[bianyiw][1:]ifjnum%3 ==0: bianyiw=random.randint(0, len(S)-1)ifint(Sb[bianyiw][jxweizhi]) == 0:Sb[bianyiw] =Sb[bianyiw][0:jxweizhi]+'1'+Sb[bianyiw][jxweizhi+1:]else:Sb[bianyiw] =Sb[bianyiw][0:jxweizhi]+'0'+Sb[bianyiw][jxweizhi+1:]           #---------------------------解码---------------------------S=[]fori in Sb:zhuanhuanjinzhi = int(i,2)S.append(zhuanhuanjinzhi)junzhi.append(mean(S))jnum=jnum+1number_gen.append(jnum)print(S)#---------------------------画图---------------------------    plt.plot(number_gen,junzhi)


来源:静界有限元
Abaqus疲劳复合材料ANSAMATLABpythonUM理论材料游戏试验人工智能
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-11-23
最近编辑:17分钟前
静界有限元
博士 签名征集中
获赞 25粉丝 0文章 12课程 0
点赞
收藏
作者推荐

结构变形监测与三维实时渲染

以前做结构试验的时候我常常想,如果我们采集的数据能实时渲染成像有限元软件那样的云图就好了,这样我的仿真和试验对比起来更加直观方便。 限于当时的知识所限,我们拿到采集器和传感器只是学会了怎么用,具体怎么搞出实时三维可视化是完全没有概念的。 近年数字孪生的概念比较火,也烧到了我们传统的结构试验领域。我们能做仿真,也能做试验,可是怎么孪生呢?孪生的用途是什么呢?这么好的概念,我该怎么用起来呢? 本文就以机翼静力试验为例,对如何实现数据采集过程的三维渲染以及可能的数字孪生方向,做一个探讨。机翼2.5g静力试验。图来源:《Static Loads Testing of a High Aspect Ratio Tow-Steered Wingbox》机翼变形数据采集方法以位移为例,目前大家用的比较多的方法是将位移计接到采集器上,然后采集器和电脑连接,实时回传数据到电脑端的测控软件。流程如下:我们想自己完成三维实时渲染,就需要我们自己和采集器进行通信,从而掌握数据的实时控制权,而不是借助厂家封装好的软件。也就是说我们要自己编写一个上位机软件。采集器通信方法不同厂家的设备通信方式不同,用的比较多的有:(1)TCP(含Modbus TCP):设备和计算机通过网线连接,创建TCP连接后,用指定的指令或者“报文”实现“开始采集”、“停止采集”、“接收数据”等功能。(2)串口:设备和计算机通过USB连接,通过识别串口连接,通信方法与TCP类似。一般我们购买采集器的时候,厂家都会提供通信指令,这个不复杂。比如东华测试的采集器,我们用的比较多,也比较稳定。东华测试的多通道采集器工作室自编的串口通信软件很多采集器是支持LABVIEW的,LABVIEW用起来也比较简单,但是考虑到我们要做三维渲染,还是要自己写通信模块。实际的通信基础代码也就几十行,数据采集软件编写的难点从来不在通信上。它的难点主要集中在:设计合理的配置信息,保证通道和测点的对应性;高频采集的数据快速处理;数据采集过程中,曲线以及其他可视化的同步渲染;设计合理的数据结构,保证物理量-通道-原始数据-处理后数据流转便捷通畅。数据融合方法 目前摄影测量、高精度陀螺仪等新的测量技术已经开始应用于结构试验,这些设备自身的测量坐标系与机翼坐标系不同,测量的位移结果就需要做坐标系转换。可以借助第三方测量设备(单相机、跟踪仪等)完成全局坐标系构建,将传感器和机翼坐标结果都统一到一个坐标系中。通过超过三个公共点就可以建立转换关系,为了提升精度,可以布置多个公共点,通过配准算法完成转换。插值方法实际测量中,布置的位移测点是有限的,我们不可能得到机翼上所有点的位移。这就存在如何用少量测点插值出整个翼面位移的问题。可以选用的插值方法也很多,比如径向基函数方法、梁模型方法等,集成到实时渲染模块即可。实时渲染在完成上述步骤后,此时已经得到了模型上各个节点的位移。我们采用VTK库实现机翼三维变形的刷新以及变形云图的渲染。工作室自研的多源数据采集平台 可能的数字孪生方向对于数字孪生,除了概念之外,我们首先要确定它应该用什么用途,可以为我们解决哪些现实问题。单就上述案例而言,尽管我们使用了插值手段得到了翼面的变形分布,但是和仿真相比,实测点毕竟还是少数。为此我第一个能想到的就是引入仿真结果,作为非实测点的补充,以提升插值精度。其次,实测的数据可以用于驱动仿真。此时我们可以同步接入有限元求解器,将实测数据作为边界条件加载到有限元求解器中,以更准确的评估结构受力。这样试验与仿真双方在分级加载推进过程中,互相融合,彼此促进。综合来看,未来一定是要有自己的采集模块、渲染模块、求解器模块,以提升结构试验的整体水平。 我们团队的技术基础本团队长期从事结构试验、复合材料力学、CAE仿真、人工智能、工业软件(含工业软件)开发,能够独立完成数据采集、数据库、有限元求解器、材料本构、图像识别、软件平台的开发。来源:静界有限元

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈