遗传算法个体构造和可行解校验的流程

遗传算法个体构造和可行解校验的流程我们来梳理一下。01个个体,这个架构中把基因与性状分层设计。这个个体可不是简单的数字串,它是一种可以自我繁殖、变异,然后被环境筛选的解决方案模板。这个模板的核心分成两部分:基因还有性状。基因是原始信息的载体,负责记录初始顺序和旋转状态;性状是最终的布局,必须要满足算法给出的所有约束。 对于12家店铺这个问题,我们把它映射成可操作的基因。具体方法是用“随机重排”还有“随机旋转”,前一个是打乱店铺顺序,后一个是决定店铺是否要180度翻转。完成这两步之后,再借助BL算法,把乱序的基因翻译成无重叠、无出界还有入口通畅的可行布局。这样就是性状。所以一个完整的个体对象至少得保存三样东西:一个是店铺坐标列表List的性状区域尺寸,还有宽度Width、高度Height这两个维度。最后一个是基因片段包括顺序编码int[] gene_order和旋转标记bool[] gene_rotate。 把这三部分数据保存好以后就可以对布局进行约束校验了。首先是重叠检测:从后往前逆序比对即可。代码思路是倒序遍历,把重叠区域逐一对比。如果发现任意一个店和前面的店有重叠现象,就直接判定整个布局不可行。 接下来是出界和出口检测。我们把整个区域抽象成一个布尔迷宫来解决这个问题。先创建一个二维数组表示区域内每个格子是否可走,默认情况下全部格子都是可走的(true)。然后使用栈来模拟深度优先搜索。从每个店的入口坐标开始遍历下去,如果弹出的坐标位置是可走的,那么就把上下左右四个新坐标入栈;如果碰到边界或者已经走过的格子(false),那么搜索就终止。只要存在一条路径能走到边界,这个布局就是可行的;如果有一家店无法走出迷宫,整条布局就被判定为不可行。 把这三部分数据整合到一起之后进行综合判断。如果发现某个店铺坐标超出了边界范围或者存在重叠情况或者无法走出迷宫的情况都会导致整个布局失效。只要满足以上所有条件,这个个体就能参与进化流程。 通过上述流程进行遗传算法操作就能够稳健地前进,不再会因为非法布局而陷入死胡同中。