镜子文明 镜子文明
语言是一种力量,唯清醒方能沉醉,对峙本体和深渊,锚定此在的涨落。
关注数: 29 粉丝数: 71 发帖数: 2,338 关注贴吧数: 84
【2.0】用程序模拟进化:文字进化 主要是试图传递一些思想,程序感兴趣的可以看看(使用在上篇帖子),其实算法还是比较简陋的。 【2.0】用程序模拟进化:文字进化 2017-02-09镜子文明(然兮)南京大学科幻爱好者协会 笔者闲来无事调教文字进化的小程序,想着能不能搞个大新闻,进化出一个比较长的语句(之前选择life作为样例纯属偷懒)“dimentionalattack”(维度打击)。在换了十几组突变率和选择率的参数都宣告失败后,我不禁陷入了沉思,这程序到底怎么了,难道笔者或成最大输家?猛然间,我一拍大腿,发现了问题所在。 问题在于选择模式出了偏差。由于字母是随机突变成剩余的25个字母,因此lize肯定比mhgf更容易突变成life——然而前者的距离s(计算方法是∑差的平方)是400,后者是4。前者只需要一个字母完成特定突变就可以了,而后者要好死不死等4个字母完成特定突变,带上4次方的概率向你的进化发出了善意的微笑。 这个现象让我重新认识了进化过程。原先我以为进化只需要设定好突变率、选择率和进化终点,就可以沏壶茶坐等了——但是我没想到,原来选择模式这么重要。说选择模式有点不专业,装个13的话应该叫适应度评价(自然选择—生物适应是等价的过程,角度不同罢了,都是在反映生物环境之间的相互作用)。在遗传学上,适应度用来度量生物生存下来并把基因遗传给下一代的能力,在计算机模拟中,就是一个完成对数据筛选的适应度函数数值。 为了使计算机模拟的进化更接近生物进化,我更换了原来的选择模式(计算序列与目标序列的距离,取最优者),变成计算序列与目标序列的相似度、取最优者。为什么更符合呢?对于RNA的三联子密码,一般第一个字母决定氨基酸的前体(比如U决定了氨基酸以丙酮酸做前体),第二个字母决定氨基酸的疏水性,第三位具有简并性(同一个氨基酸可以对应多个字母)。对于这样的序列而言,有更大的相似度肯定比更小的距离更能达到目标功能,也就是有着更好的适应度。 但是前一种选择模式我毕竟研究了这么久,尽管成本已经沉没,但就是舍不得啊。于是我琢磨着,它还可不可以抢救一下。又是一拍大腿(哎哟,腿断了),我可以换变异模式啊。随机突变为剩余的25种字母非常不利于距离选择进化成目标序列,那随机变成相邻的字母呢?这样的话,进化成目标序列,距离选择就比相似度选择更优越了,这回轮到lize绝望地看着到life的距离了。 以上程序统一打包在下面的链接: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fpan.baidu.com%2Fs%2F1jIjvb2Q&urlrefer=65025a4318e2149884e370b6aae73e87(点击阅读原文,这次亲测有效#滑稽) Originalmode是最开始发布的版本,距离选择,随机突变。 Anotherselectingmode是更改了选择模式的版本,相似度选择,随机突变。 Anothervariancemode是更改了变异模式的版本,距离选择,随机变化为相邻的字母。 Genemode就是在模仿基因的突变模式了,字母表换成了ATCG,相似度选择,随机突变,基本结构和Anotherselectingmode一致。为什么要做这个呢?姑且挖个坑吧,管挖不管填。 可直接运行的程序都放在对应文件夹下的staticlibrary(静态链接库)文件夹下,不关心源代码的就直接戳它就可以了。 另外个人发现了一些使用体验差的地方,比如输字母很麻烦,输错了要重来,输多了要赋给下个数组数值,不过我也没办法,将就吧,有大神愿意的话请指教一下怎么修改。 ————————————我是分割线———————————— 到这里就结束了吗? 的确关于小程序的部分结束了,但关于这个程序的思想乃至进化原理的部分才刚刚开始。 进化的模式可以简单地概括为变异、选择和复制三个过程的循环,但这是定性的、粗糙的。三个过程不是孤立的,而是一个统一的完整的系统,相互影响、相互作用,任意一者的改变,都会极大地影响最后的结果。 首先是变异,可以从两个方面考虑:变异率和变异模式。如果把生物进化比作走路的话,那它们决定了走路的步幅和方式。 然后是选择,也可以从选择率和选择模式考虑。选择模式的核心是适应度的评价(而不是最后的选择结果)。在同样的比喻中,它们决定了路两边悬崖出现的频率和位置的分布,使得变异只走特定集合中的一些路径组合,不过这种组合好不好走就不一定了,好的时候山珍海味热切糕,唱着歌儿走大道;不好的时候这顿不知下顿饱,偶尔一个悬崖跳。 最后是复制。我想到的是字母表的考虑。(英文)文字进化的字母表有26个,生物进化的字母表是4个。不同的字母表使得变异的结果具有更大的多样性,相当于决定了可供选择的路径。 我所面对的进化只是计算机程序的模拟,虽然对我来说用数学工具来刻画很困难,但私以为对于数据工程师们而言,应该不算太困难。 然而自然就不会这么友善了。变异模式极其复杂,仅说基因的点突变:物理因素、化学因素、外在生物因素、内在生物因素都会导致点突变,尽管表象上只是碱基对变了一下(颠换:比如A—T/C—G;置换:A/T—C/G;增添;缺失),但这种变化有着复杂的权重计算,而且很可能变异一次权重还变了。更不要说大片段变异、染色体变异以及有性生殖涉及的交叉重组。选择模式极其复杂。环境太复杂了,生物体集合的可选择特征也太多了,不同特征之间的相互作用,又可以构成新的二次特征。很多变异是中性的,有些不中性的变异也很难衡量它的优劣。人类目前连写出一个通用的精确的适应度函数(哪怕是最简单的细菌)的理论基础甚至是研究基础都不具备。 更不要说生命起源时期充满不确定、不稳定和不平衡的状态,各类分子的碰撞组合,变异模式和选择模式想来多少来多少。 这复杂的壁垒太恐怖,看来对于复杂的认识我还是太年轻太简单,姿势水平太低,必须得学习一个。 但是我想说的是,这不正是生物的迷人之处吗?科学追求的不是特例,而是宇宙中亘古不变的规律,对于这复杂也是一样的。在极端复杂的混沌背后,我们期待的是主掌生物的简洁的、优美的、数学的自然规律。而再走远一步,就是意识的起源——这也是我最欣赏生物的地方:科学起源于观察的革命(比如牛顿物理学)、进步于观察者的革命(相对论、量子力学),而下一步我预见的升华是观察者之观察的革命,也就是意识的革命。这似乎太过遥远,也许生物的确不属于二十一世纪,但未来总将由生物带来一场超越。 最后的最后,想起《小窗幽记》的一句话:花繁柳密时,拨得开,方见手段;风狂雨急时,立得定,方见脚跟。
【20170207 科學科普】用程序模拟进化过程:文字进化 进化可以说是生命的本质之一,进化思想也是生命科学的一大基石,但一直以来, 进化论都只是通过对大量事实观察归纳和合理外推得到的理论。笔者认为唯有由物理化学原理和数学推理建立的模型才有可能精确刻画进化的本质——然而那太过遥遥无期。不过现在我们可以通过一个小程序从感性的层面体验进化的威力。该程序由visual c++编写,源文件和可直接运行的程序(advanced edition文件夹下的text.exe,不用安装VC++)可通过文尾的链接下载: 程序的内容是由一段任意长度任意排序的字母进化成你想要的字母序列。比如说我脸滚键盘打了个“dkfjskjfskn”,通过充分的进化,就可以得到一条真理序列“iamhandsome”(啪)。 这个过程其实是在模拟生物的进化,每代生物会发生随机变异,然后被自然自然淘汰只剩下最优秀的一部分,再由这部分生出下一代(我设定的字母组有1000个,相当于一个有1000个个体的种群)。 下面由我介绍程序正确的打开姿势: 打开程序,首先需要输入的是序列长度。比如说想进化的单词是evolution,那就输入9回车;如果是life,就是4,回车。 然后需要输入的是初始变异序列,长度须与序列长度一致,多余的字母会被舍去。这里需要麻烦各位读者老爷的是,由于笔者水平有限,不会将字母转化为自然数序列(如果哪位大神愿意指教,请在评论区留言,感谢),因此各位需要先将字母转化为数字:a=0,b=1,c=2,......,y=24,z=25。以abcd为例,就是0(空格或回车)、1(空格或回车)、2(空格或回车)、3(回车)。之后程序会帮助确认序列(不过各位应该也是脸滚键盘选的序列)。 同样的道理,输入目标序列。以life为例,就是11(空格或回车)、8(空格或回车)、5(空格或回车)、4(空格或回车)。 最后需要输入的是两个重要参数:突变率和选择率,单位都是千分之一,输入数据是正整数(当然你输0也是可以的,看代码跳也很有意思的#(滑稽))。之后程序会告诉你初始差异的大小。调节突变率和现实率是成功的关键。 所有参数输入完成后界面类似下方由于程序模拟了突变的随机性,因此即使是完全相同的参数,两次运行的结果也会有差异,进化的代数和过程都很可能不相同。 注意:需要仔细调节突变率和选择率。突变率太高选择率太低,优秀的变异结果很难保留;突变率太低选择率太高,进化的速度又十分缓慢——二者都会导致难以进化到想要的序列。下面是三次运行上图参数的结果,可以看出差异还是很明显的。接下来就看各位读者的探索了。
1 下一页