hashbangcode / webolution
Webolution,一个进化引擎。
Requires
- php: >=7.1
- fakerphp/faker: ^1.17
- ramsey/uuid: ^4.0
Requires (Dev)
- phpspec/prophecy: ^1.15
- phpunit/phpunit: ^9.5
README
一组实验性的类,旨在构建一个将网页进化的应用程序。这是一个测试应用程序,让我学习遗传算法涉及的技术以及如何使用composer构建现代PHP应用程序。因此,事物可能会在不经意间发生显著变化。
我对了解是否有人看过这段代码或对改进有建议感兴趣。请通过问题队列联系我,并告诉我。
需求
- PHP(最好7.2+)。
- Composer。
结构
该应用程序被构建为不同类型的对象,以确保关注点的分离。
类型
类型类负责进化过程核心的数据类型。在核心中,一个类型类只关心它包含的数据。类型类没有执行突变或计算适应度度量的功能,这是个体类的领域。
个体
个体类为类型类提供突变和适应度功能。它们不是扩展类型,而是将它们作为参数包装起来。个体类可以被视为类型类的装饰器。每个类型类映射到一个个体类。
种群
种群类提供了一个个体集合。
进化
进化类用于控制进化过程。这连接了种群、个体和类型类,并控制每代种群对象。已创建了一个进化存储类,以允许一次使用数据库作为存储引擎进化更多的个体。
类型详情
以下详细说明了每个类型及其与其他类型的任何交互。
数字
定义了一个包含数字的类。NumberType类可以向此数字添加或减去。它被创建为一个非常简单的初始类型,以便测试进化过程的功能。
文本
定义了一个包含字符串的类。该类具有获取或设置字符串的函数。
颜色
定义了一个包含关于颜色的信息的类。这是通过颜色的RGB值内部存储的。
图像
这定义了一个二维数组,该数组渲染为图像。该数组由“开启”或“关闭”值组成,然后用于在图像中创建网格框。
元素
这代表了一个HTML元素。核心属性是元素类型(div、p、strong等)和一个或多个属性。属性可用于给元素添加类或id,尽管任何属性都是允许的。一个元素对象还可以包含一个或多个子元素对象,从而创建元素的层次结构。
单位
单位是一个包含CSS中测量信息的对象。这由一个数字和一个测量单位表示。因此,可以存在像10px、10em、10%这样的值。特殊值“auto”也可以表示。
样式
这定义了一个包含关于单个元素针对CSS规则集的信息的对象。该类包含一个选择器属性和一个属性属性,它们结合在一起形成一个CSS块。
页面
页面将样式和元素类组合成一个页面结构。使用页面类可以使页面的基本HTML结构保持静态,而页面内的元素和样式可以改变。
进化过程
以下描述了每一代的进化过程。
淘汰
要开始进化过程,需要淘汰一定数量的种群。个体被淘汰的概率取决于个体的适应性。适应性高的个体不太可能被淘汰。
复制
然后将种群中的现有个体复制,使种群数量恢复到指定的最小值。这意味着当前种群将包含适应性最强的个体。
变异
随后对种群进行随机变异。种群如何变异取决于所使用的对象类型。种群经过变异周期后,可以进入交叉周期。这是个体混合在一起,并交换其属性的过程。
生成统计数据
然后计算种群的相关统计数据。
存储
此操作将种群克隆到数组中,以便以后检索。这在查看种群历史时非常重要。
下一步
需要发生的一些事情。
- 查看性能。创建大量对象可能会消耗大量内存,也许可以考虑只存储种群中排名前(或后)的个体,而不是所有个体。
- TextIndividual计算其适应性的方式基于外部因素。因此,最好将此功能抽象出来,以便不仅仅是这个类具有此功能。
未来计划
- 添加依赖注入容器,以简化在其他应用程序中使用应用程序的方式。
- 生成个体的家谱。
- 性能测试和改进。