最近有人问我,说,L老师,发生了肾么事情?公 众号咋不更新了呢。
我一看,哦,原来都两个月过去了,确实没更。
没更的原因有很多,一个是最近工作上的变化。另一个就是最近做的单子少,多是可写可不写的。唯一一个描述载荷移动的疲劳分析,我把原先“以静代动”的方法,换成了“动静结合”,算是这两个月的得意之笔吧。
这段时间探索的新技术不多,但是笔杆子没少动。写了好些报告,做了好些ppt,还从其他途径参与到一些有意思的项目,出了很多好点子。嗯,没机会亲手做试验,躲在后面出谋划策的感觉也不错,回头可以考虑买个羽毛扇。
最近总体来说,睡眠也是不错的,敞开了睡,能睡10个小时,这是我这几年都不曾享受到的,朕的头发估计能保住了。
开始学Python,粗略翻了几本书,装上了软件,摸索起来。这是继ANSA之后,又一次开始0基础学新东西,算是给自己的知识库加装了一个新模块。
最近喝酒也不少,不过都不敢喝醉,醉一次太难受了,我这日渐老化的身体可扛不住,只能在醉酒的边缘疯狂试探。
好看的小说也遇到几本。《我的师兄实在太稳健了》、《大奉打更人》,前者轻松娱乐,主角稳如老狗,不稳个几十手,从不出手。后者通篇都是黄色笑话,我严重怀疑作者就是为了讲荤段子才写的这本书,淦。
年初的时候,打死我也想不到年尾的这两个月在自己发生的各类魔幻事件。或许,我离一个真正的工程师越来越近了吧。追求还是在的:上马做撸铁做试验,下马键盘写报告,左手网格做仿真,右手代码搞算法。
总而言之,俺更成熟了。希望明年越来越好!
最大的感受,还是源于和MATLAB的对比。首先一个感觉就是乱,列表、元组、字典,常常搞混。应该是我用的太少的原因了吧。
另一个感受就是,很明显,Python能搞的更花哨,与网页交互、与ABAQUS交互、游戏开发等等。干的事情更贴近大众了。
实际上,我学这个软件,应该还是为了更方便地跟ABAQUS交互。之所以第一个算例拿遗传算法练手,也是看后面能不能用到复合材料的优化分析上。
目前,我的要求并不高哈,入门就行。
老早就想研究下遗传算法,搞搞所谓的优化问题。实际上,这个理论上个世纪就已经很成熟了,随便下载几本老书,一个晚上也就看懂了。房间大灯一关,拉开床边的窗帘,打开床头的看书灯,大窗外月光皎洁,寒风呼啸,我躺在电热毯上,学着学着,嗯也就睡着了。

其实好多类似于遗传算法这种上个世纪的东西,在最近这些年被国内追捧的不行。动辄就吹爆的机器学习、人工智能、神经网络、3D打印,都是几十年前的。。。现在大家到处吹,课题里吹,项目里吹,会议里吹,实在搞不懂。也对,技术内卷嘛,口 活先行。
遗传算法是通过模拟自然界的进化过程,达到筛选优化的目的。比如你要求一个函数在某个区间的最大值,先给定一组初始值作为0代祖先,然后设置筛选标准,淘汰一些不好的个体,这些个体自身的值可以转换成二进制的DNA编码,然后随机两两配对,交换DNA片段,形成新的个体,如果再考虑基因变异,让二进制一些位置的0或者1,反置。这样就彻底完成新一代种群的产生。搞个几十代,嗯,最后发现整个种群趋同了,也就是收敛了。
哇,做的时候,可以享受到造物主般的感受。
从上面的过程也看到了,一个简单遗传算法的实现,需要搞出一下东西:
(1)订立编码和解码规则。比如二进制来存储信息;
(2)订立筛选(基因遗传)规则。比如可以用轮盘赌算法,干掉那些不合格的个体;
(3)建立基因交叉算子。随机配对算法、DNA片段交叉算法;
(4)建立基因变异算子。DNA片段随机变异算法。
网上讲这些东西的文章很多啦,我这就不说具体算法的实现了。展示下我的算例和结果吧!
算例:考虑y=x2在[0.31],区间上的最大值。经过30次迭代的均值结果如下:

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

因为程序里面用了很多随机数,所以是不能保证每次结果都一样的。而且遗传算法对初值的依赖性很强,并且十分“早熟”,很快就达到收敛状态,不管收敛的结果好不好。只负责赶紧生娃制造下一代,不考虑质量!
所以,真正实用的遗传算法还需要根据具体问题,做大量的训练积累经验数据,然后对各个关键算子,做出一定的改进。
果然啊,造物主不好当,上帝造人也不知废了多少劲,说不定也失败了无数次。当然,这一次是不是成功的呢?很难讲。
读者讨论功能目前被禁了,大家有自己好看的科研故事可以投稿给我!
算法附后
# -*- coding: utf-8 -*-"""SpyderEditorThisis 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=0fori 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+1iffpsum[ss] <= random_value and fpsum[sx] >= random_value:cind=sxbreakfxz[cind]=fxz[cind]+1xs=xs+1#根据复 制结果,更新一轮种群Sbb=[]xs=0whilexs <len(fxz):iffxz[xs] > 0:zhongqunfuzhi=[Sb[xs]]*fxz[xs]foryuansu in zhongqunfuzhi:Sbb.append(yuansu)xs=xs+1Sb=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)