## 版本提交记录(只记录重要更新)
如果想要运行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脑的实际编程。