You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
frog/版本提交记录.md

85 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## 版本提交记录(只记录重要更新)
如果想要运行Frog项目的以前版本可以结合gitk命令和参考本提交记录对每个更新的简介用git reset命令回复到以前任一个版本例如用:
git reset --hard ae34b07e 可以转回到2019-08-04提交的分组测试的找食版本。
### 2018-1-3
项目启动,主要是文字方面的一些构想。
### 2019-3-11 1.0.0版, Commit:Go frog go!
开发环境完成演示第一个人工生命诞生。但是所有Frog脑部为空因为运动神经元被短路只能固定向一个方向运动。
这是第一个发布版,演示了生命的随机进化和优胜劣汰。
![result1](https://gitee.com/drinkjava2/frog/raw/master/result1.gif)
### 2019-3-18, Commit:Brain picture!
添加了脑结构图形用于调试用可以显示第一个胜出的Frog的脑结构但是运动神经元依然被短路只能固定向一个方向运动。
有了脑结构图就可以防止所有Frog都被淘汰掉还不知道问题发生在哪里。可以有针对性地改进进化算法、环境的参数改进。
### 2019-03-20, 1.0.1版, Commit:Add a button
添加了一个按钮可以显示、隐藏第一个胜出的Frog的脑结构图但是运动神经元依然被短路
### 2019-03-21, 1.0.2版, Commit:I'm hungry
在脑区添加Hungry删除随机运动的硬编码改成由Hungry区来驱动一旦frog能量小于10000,hungry区的所有脑神经元的input区激活如果这些神经元的输出区位于move区则作相应的移动。这是一个更随机一点的运动不再总是固定向一个方向。
### 2019-03-27, 1.0.3版, Commit:Shrink & Sperm
添加了"卵+精子->受精卵"的模拟,这是为了实现生物多样性。添加了每次添加一批随机神经元,但是只保留激活过的,如果某组神经元从没被用到(激活过),则有很大的可能不会将这组神经元添加到蛋中(用进废退规则)。
### 2019-03-29, Commit:Rainbow
更正一个小Bug,BrainStructure的zone显示的半径是实际的一半用彩虹色而不是随机数来表示CellGroup的细胞数量色彩越靠后表示细胞数越多。
### 2019-04-01, Commit:Cleanup
做一些debug清理,每个Frog不再保留egg的副本“卵+精子->受精卵”算法改进一下不能简单两两相加而是随机取一个精子的cellgroup。
### 2019-04-06, Commit:Windows align
还是做一些清理, 可以自由调整虚拟环境、脑图的显示大小。下面的打算是将mouth、leg、hungry等区移到蛋里去允许进化而不是作为Frog的硬编码存在。
### 2019-04-07, Commit:Organ
引入Organ类将mouth、leg、hungry等作为Organ器官移到蛋里去而不是作为Frog的硬编码存在这样架构更清晰而且便于以后将Organ参与遗传、变异、进化。
### 2019-04-08, Commit:Eye shortcut
添加眼睛,能够看到四个正方向的食物,但是自然选择的结果是眼睛和移动区短路了,眼睛起的作用并不大,因为如果有两个方向同时出现食物,目前青蛙是不能判断的。
下面要考虑逻辑了,也就是思考判断能力(后天条件反射的建立)。
### 2019-04-12, Commit:Random frog
没做大改动,只是将青蛙改成按整个地图随机分布,看起来眼睛的作用就比较明显了,比起随机运动,明显食物被吃掉更多。
![resut2](https://gitee.com/drinkjava2/frog/raw/master/result2.gif)
### 2019-05-23, Commit:2 eyes no helps
没做大改动只是演示添加两个眼睛后对它的进化没有帮助到此为此逐渐看出问题了没有记忆能力和模式识别能力。目前存在两个比较大的硬编码导致它不能进一步进化1.用CellGroup这种硬编码方式导致在Frog的生存期不能产生记忆功能而需要多次淘汰这不符合现实中青蛙从小学到大这样的实际过程它不需要死很多次。另一个问题是眼睛部分存在硬编码因此只能起到感光作用但是不具备根据外在图像进行模式识别能力。所以下面要开始进行非常大的结构改进。将把CellGroup作为器官引入但是它的内部细胞是动态生成的而且不是随机生成的而是任两个细胞在它的区内活跃就生成新的细胞(将来也可以参与新建细胞)。CellGroup的数量、大小、网格密度直接影响到神经元生成多少和算法快慢)会参与遗传和进化快乐和痛苦器官会对新细胞生成的类型有影响。fat参数用来指示它的肥胖度。Fat高的遗传时会保留并可能变大、变小、内部允行连接数更多、分化成更多CellGroup但是它的内部连接(新建的细胞)不会参与遗传这样每个个体都出生时都是一张白纸虽然也许CellGroup已经进化得很多层很复杂。同一个位置可以存在多个CellGroup,这样由多层大小、位置不同的Layer就同时具备了模式识别和记忆功能而且这个算法比较简单很好理解。大范围的Cellgroup可以解释条件反射的形成两件不相干的事之间形成联系)小范围的Cellgroup可以解释模式识别相邻感光细胞同时激活经过层层处理后汇总到最上层的某个Cellgroup的激活)。而所有这些CellGroup的形成(结构和层级)都可以用非常简单的"用进废退"规则(Fat值控制遗传、随机变异和适者生存来探索最优解)来最终进化出来。
### 2019-06-13, Commit: Happy & Pain
主要做了一些清理,将所有器官移到单独的类里删除OrganDesc类。将一些类(如Applicaton移到根包下)移到不同的包下。这个版本是比较大的一个重构,最大的进步是将算法当成一个器官引入,当然,这个版本只存在一个随机连接两端的算法,以后会扩充。
另外顺手加上了Happy和Pain两个器官分别对应进食愉快感和痛苦感后者在靠近边界时激发。观查它的表现果然不出所料痛苦感立即生效有一些Frog移动到边界后就不再前进而是顺着边界溜下去了不傻但是Happy器官没有生效这也很显然因为Happy属于进食反射链的一部分在没有记忆器官算法引入之前是没有途径使用上进食奖励信号的。
![resut3](https://gitee.com/drinkjava2/frog/raw/master/result3.gif)
### 2019-06-26, Commit: Back to many connections
找食效率太低又改回到4.12的用连接数量代替权值这个逻辑权值这种人为设计的算法居然比不过随机试错失败。先暂时去掉Pain器官Pain的加入并没有提高找食效率必须与感光细胞合用才能知道是哪个方向的边界下个版本急需引入记忆功能也就是说要将感光细胞的活跃和痛苦器官的活跃关联起来。
### 2019-06-28, Commit: New eye & dynamic show brain
为了更方便青蛙看到边界又加了个新的眼睛它是一个可自进化的nxn点阵的眼睛将来会取代只有四个象素点(但能看得远)的老眼睛。到目前为止,依然还没有进行模式识别和记忆功能的开发。另外脑图可以动态显示了,用一个红圈标记出被动态跟踪显示的青蛙。另外每次运行前打印往生咒,以示对生命的尊重。
### 2019-07-28, Commit: Trap & Active & Chance
这还是一个常规版本,建立在随机连接、优胜劣汰基础上。主要有以下改动:
1. 在Env区中间加了一个陷阱区Trap以增加趣味性青蛙如果走到陷阱区就死掉结果自然选择的结果是青蛙会绕开陷阱区。
2. 青蛙增加一个Active器官它的作用是一直保持激活如果有神经元触突位于这个区就会驱动神经元兴奋这个器官经实践证明比Hungry器官驱动更能提高找食效率。
3. 青蛙增加一个Chance器官,它的作用是引入随机扰动,打破青蛙有时候围着一个食物打转就是吃不着的死循环。
从当前这个版本可以看出,实际上青蛙是有一定的记忆能力的,连接就=记忆只不过没有模式识别能力以后的工作将以模式识别为重点基本原理是见note中提到的仿照全息存储原理在思维区逆向成像。因为逆向成像的限制以后的版本所有的器官会被移到脑图的同一侧不再是随意分布在脑图上了这将是一个比较明显的改动。当然随机连接这个算法看起来比较有用以后还是可能保留的。
以下为运行图像:
![resut4](https://gitee.com/drinkjava2/frog/raw/master/result4.gif)
### 2019-08-04, Commit: Screen group test
引入分屏测试功能如果青蛙数量多可以分屏来测试每屏青蛙的数量可以少到只有1只。
### 2019-08-05 commit: Seesaw
有了分屏测试功能后,顺便随手加上了一个青蛙走跷跷板自动平衡的演示,它每次只出场一个青蛙, 每轮包括100场测试大约跑90多轮半个小时(电脑慢)后,出现了下面的画面:
![result5](https://gitee.com/drinkjava2/frog/raw/master/result5_seesaw.gif)
这个版本的目的是为了增加一点趣味性,显得青蛙还是有点"用处"的,省得让人以为这个项目不务正业,只会让青蛙找食。这个版本青蛙的脑结构和找食版的青蛙基本相同,区别只是在于环境不同,也就是说它的表现随着环境而变化,这符合"通用人工智能"的概念,即信号感受器官是统一的(通常是眼睛)但能根据不同的环境完成不同的任务。走跷跷板演示是最后一个2维脑的版本今后这个项目将沉寂一段较长时间今后将致力于将青蛙脑重构为3D金字塔形脑结构(见上文)因为这个项目的缺点已经很明显它不具备对2维图像的模式识别能力用随机试错的方式只能处理非常简单的、信号在视网膜的固定区域出现的图像信号。
青蛙的找食效率以及走跷跷板平衡的能力都没有优化到顶点,一些构想中的复杂的器官如“与门”、“或门”(不要怀疑大自然能否进化出这些复杂器官)等都没加上但我认为这不重要目前最高优先级是先进行3D脑结构建模让青蛙能具备2维图形的模式识别(和回忆)功能,这个大的架构重构是它能处理复杂图像信息的立足之本,它的图像识别能力和通常的用上千张图片来训练识别一个图片这种工作模式不同,它是一种通用的,可自动分类识别所有图像的模式,更符合动物脑的工作模式,记住并回忆出某个图像(或任意输入信号场景的组合),可能只需要这种场景重复出现过几次即可,它是一种无外界信号判定,自动分类的识别模式。
### 2019-09-09 commit: start work on 3d
开始进行3D脑的实际编程。
### 2019-9-09 到 2019-10-06 之间的6次提交
主要进行脑框架的显示和字母试别测试环境的搭建还没开始进行利用器官进行脑细胞播种的工作。这一阶段基本思路是在每一轮的测试过程前半段随机显示ABCD其中的一个字母(即激活视网膜所在的脑区),并同时激活一个任意脑区。在下半段则只激活这个字母的点阵,然后检测对应的这个脑区是否也会激活,如果激活的话,将会增加青蛙的能量值,让它在生存竟争中胜出,这一步是要完成基本的模式识别功能,框架已搭好,但器官的随机生成还没进行,这一步比较复杂,除了器官的大小位置等参数外,神经元的参数也多,比方说输入、输出光子的方向、正负、数量,能量吸收、释放比例,输入输出阀值、疲劳值、疲劳阀值等,这么多参数要利用随机生成器官的方式来筛选,需要的样本数量多,运行时间会比较长。早期是视网膜和识别区在脑长方体的同一侧,后来的提交改为将视网膜移到左侧,也就是说视觉与识别区(对应耳朵的语音区)在物理上呈90度正交以方便观察和编程。