一个基于遗传算法的自动强化学习训练系统,使用 JavaFX 构建图形界面。
- 多种强化学习环境:支持 CartPole、LineWorld、MountainCar、LunarLander、Pong、Acrobot 等经典环境
- 遗传算法进化:通过选择、交叉、变异自动进化智能体程序
- 可视化训练:实时展示适应度、奖励、成功率的变化曲线
- 精英管理:保存和查看训练过程中产生的优秀基因组
- 演示模式:加载训练好的策略进行实时演示
- 自定义精英:支持导入和管理自定义的精英策略
- JDK 17 或更高版本
- Maven 3.6 或更高版本
mvn clean compilemvn javafx:run或者直接运行 Main 类:
mvn exec:java -Dexec.mainClass="org.lytharalab.automlevolve.Main"- 选择训练环境:在左侧面板选择要训练的环境
- 配置参数:调整种群大小、训练代数、精英数量、变异率、交叉率等参数
- 开始训练:点击"开始训练"按钮启动训练
- 观察进度:在中间面板查看训练进度图表
- 查看精英:在右侧面板查看和管理训练过程中产生的精英
- 演示策略:选择一个精英,点击"加载为演示策略",然后点击"切换演示"查看效果
在精英列表中右键选择 智能基因修剪。修剪器先扫描完整指令序列,分析所有可能的跳转、寄存器读写和跨帧依赖,再删除能够证明无用的指令:
- 不可达代码:包括被跳过的代码块、终止后的不可达代码;保留跳转能够到达的后半段指令。
- 无用计算链:结果被覆盖或不会影响动作、内存、分支及后续帧的计算和确定性输入读取。
- 安全保护:保留随机数读取、内存写入、所有动作输出、控制流及可能产生溢出/除零保护统计的运算。自动重算跳转地址,并检查修剪后的控制流。
虚拟机的寄存器和内存会跨环境步保留,因此本帧没有输出的计算也可能有用。遇到可达循环或可能超过当前指令预算的路径时,修剪器只删除不可达代码,保留可达指令,避免改变超时位置和行为。无法证明无用的指令也会保留。
智能基因修剪报告默认隐藏。只有程序启动参数包含 -debug 时,指令详情下方才会列出扫描数量、删除分类、原指令编号、删除原因及触发的保护规则,例如 mvn javafx:run "-Djavafx.args=-debug"。可以右键选择 撤销上次智能修剪 恢复原策略。修剪后仍通过 加载为演示策略 使用新序列。
保障针对相同输入、随机源、寄存器配置和指令预算下的策略行为、内存及数值统计;执行指令条数、调试地址和无用寄存器值可能变化。评估场景种子只由训练种子和回合编号决定,不再随基因长度变化。修剪后显示的分数仍是原策略历史成绩,不能当作修剪后的重新评估结果。
原有功能保留为 修剪指令序列(旧版-稳定),沿用原先的可达性修剪逻辑。
运行自动测试:
mvn test测试覆盖跨帧状态、分支、循环、预算、跳转重定位、随机源、内存和数值统计,并对随机程序逐帧比较修剪前后的行为。
本项目使用确定性的轻量二维刚体模拟,并非 Gymnasium / Box2D 的逐项复刻。每秒 50 个环境步,每步 5 个物理子步;脚部接触包含法向支撑、摩擦和角动量响应。
- 动作:
0关机、1左侧喷口(向右推、顺时针转)、2主引擎、3右侧喷口(向左推、逆时针转)。主推力沿机体上方。 - 8 维观测依次为:水平位置相对着陆台中心并除以半视口宽度、机体高度相对静止着陆高度并除以半视口高度、缩放水平速度
vx * 10 / 50、缩放竖直速度vy * (400/30/2) / 50、逆时针角度(弧度)、缩放角速度omega * 20 / 50、左脚接触、右脚接触。 - 奖励为归一化位置、速度、倾角和双脚接触势函数的差,再扣除燃料消耗;失败步奖励为
-100,成功步为+100。 - 必须双脚位于旗标之间,姿态和速度稳定连续 25 步才算成功。脚部撞击法向速度超过
2.5世界单位/秒、机身触地或飞出边界均为失败;失败不会同时判为成功。训练和演示均默认最多 1000 步。
旧版 LunarLander 策略需要重新训练:观测含义、推力方向、碰撞和奖励均已修正,旧成绩不再适合直接比较。
mvn test 包含轻触落地、硬着陆、单脚旋转、离地、着陆区限制、重置和超时,以及 100 组初始状态的反馈控制器对照。反馈控制器仅存在于测试中,用来验证环境可控;短程遗传算法测试只检查评估流程和复现性,不代表已经进化出可靠着陆策略。
6×6 局部观测探索任务,动作 0/1/2/3 分别为上/右/下/左。起点 (0,0)、终点 (5,5);每张图先生成连通生成树,再随机加入 0~8 条不同的通路,覆盖树形迷宫、死路和带环迷宫。训练和演示统一最多 100 步,成功或超时后结束。演示保留终局约 0.6 秒,再自动换新图;界面显示地图种子、真实距离、探索、撞墙、步数和回报。
旧版迷宫策略需要重新训练:地图分布、奖励、部分观测和评分均已调整,历史成绩不能直接比较。
观测共 20 维,全部有定义,范围 [-1,1]:
| 索引 | 含义 |
|---|---|
| 0~1 | 归一化当前位置 |
| 2~3 | 到固定终点的横纵偏移 |
| 4 | 曼哈顿接近度,仅为方向信息,不用于方向奖励 |
| 5 | 当前格访问新颖度 2 / visitCount - 1 |
| 6~9 | 上/右/下/左是否有通路:可通行 1,墙 -1 |
| 10~13 | 邻格新颖度 2 / (visitCount + 1) - 1,墙为 -1;不会在第 4 次访问后饱和 |
| 14~17 | 上次动作的四维指示;重置时全部为 -1 |
| 18 | 上次是否撞墙:是 1,否 -1 |
| 19 | 剩余步数比例映射到 [-1,1];重置为 1,用尽为 -1 |
奖励与部分进度:每步扣 0.02,撞墙额外扣 0.08,成功加 20,超时扣 2。探索势函数为 Φ = 2 × (已探索格数 - 1) / 35,每步加 Φ(next) - Φ(current),成功和超时终态的势均设为零。在本项目使用的无折扣回合累计回报下:
- 成功回报:
20 - 0.02 × 步数 - 0.08 × 撞墙数。 - 超时回报:
-2 - 0.02 × 步数 - 0.08 × 撞墙数。
因此同图中较长的无碰撞通关路线不会得到更高回报,探索和绕圈也不能刷最终回报;必要回溯只承担普通步数成本。为避免尚未通关的程序失去选择信号,迷宫适应度额外使用综合进度:80% × 历史最佳真实路径推进 + 20% × 探索覆盖,成功时为 1。该进度不是存活时长,真实距离与完整地图不输入策略;它们只用于训练评分和界面诊断。迷宫训练不扣正常分支跳转的分数,数值异常、无动作和 VM 超时仍会扣分。
随机地图评估:
- 每代用 16 张新训练图评估整个种群,所有程序面对相同场景;每次轮换都清除旧训练缓存,精英重新评估。
- 从训练排名前 3 个候选中,用 64 张固定验证图选出当代候选;历史最佳与默认演示策略也按该验证分选择。精英列表显示的是固定验证成绩,因此可以跨代比较。
- 历史最佳每代另跑 32 张新图检查,单独显示成功率。它不参与繁殖或策略选优;训练、验证、新图检查连续 12 代全成功,才允许提前结束。
- 正常结束后,历史最佳仅评估一次 256 张独立测试图。测试结果不参与选优、繁殖或提前停止;主动停止训练时不运行最终测试。
- 各分区和代数使用可复现、互不重叠的种子流;小迷宫仍可能由不同种子生成相同地图。策略不能通过回合编号或批次长度识别地图在评估集中的位置。
界面分别显示训练、候选验证、演示策略新图检查和最终独立测试成绩;图表中的迷宫适应度/奖励使用固定验证集,负分也会正常显示。可在“随机种子”中填写整数复现训练,留空则随机生成,实际种子记录于状态和精英详情。同配置、种子及代码版本可复现评估与进化结果。
迷宫初始种群约一半使用随机传感器条件/动作骨架,允许读取全部 20 维输入;条件、输入维度、阈值、默认动作和各规则动作都是随机初始化。规则级交叉与变异会重新编译跳转地址,支持规则增删,减少无意破坏输入/输出骨架;仍保留一部分任意指令变异以探索其他程序结构。没有内置 DFS、最短路或手写探索规则作为训练策略,另一半沿用通用初始化模板。完整的轮换评估和规则进化流程由界面所用的 RlTrainingService 提供;底层 GeneticAlgorithm 仍是通用的固定评估器算法。
验证:mvn test 覆盖生成连通性、双向通路、种子复现、观测与重置、奖励排序、探索结清、必要绕路、恰好在步数上限成功、训练/演示一致性、缓存换批、分区隔离、提前停止、最终测试隔离,以及真实短程遗传训练和策略重评估。1 万张地图上的局部观测探索与带记忆 DFS 仅是环境可控性对照,不能当作遗传算法的学习成绩。训练流程与实测边界见 迷宫验证记录。
MIT License © 2026 LytharaLab
这Readme是用AI写的🤔。