# 遗传算法解决矩形块排样问题——JS实现
遗传算法作为一种启发式算法,对于寻优问题是一种很好的解题思路,求解精度当然是不如数学建模好,但是也能解决矩形块的排布寻优问题。
## 问题描述
原料高度H=20,宽度W=30,需要下料以下零件{(hi, wi) : i ∈ {1, . . . , 5}} ={(5, 7), (5, 10), (7, 12), (10, 8), (12, 10)},各自的需求量为b={4,3,5,3,5},要求最小化所需的原料块数。(单位:cm)
## 解决思路
按照遗传算法,其流程如下:
下面一个一个流程来解释。
1. **编码**:遗传算法的编码规则有二进制和十进制等,按照算例中的所给出的要求,可按十进制编码规则来进行编码。
如:13,7,12,19,18,4,6,16,8,15,17,0,9,11,3,10,14,1,2,5。这样编码是根据算例中小矩形块的需求总量为20,因此将每一块小矩形块由0到19以次编号,该数字顺序代表小矩形块排放的先后顺序,该数字顺序的值代表小矩形块的编号。
2. **初始化种群**:按照编码规则生成的一个数字顺序代表一条染色体,即一个个体,由totalNum个个体组合而形成一个种群,种群大小可自行设定 。
3. **适应度函数** :适应度函数就相当于生物在遗传进化中的物竞天择、优胜劣汰。适应度越高表示有更大的机率存活下来。根据本题的实际情况,在计算适应度函数之前,首先要规定小矩形块在毛坯件内的排布规则。
(水平为X轴,竖直为Y轴)如图小矩形块在毛坯件内一行一行地往下排,直到余料不足以满足任何一块小矩形块的尺寸时,则再拿一块毛坯进行排列。在排一行的时候,按照染色体的排布顺序,从左往右排。当排到该行的剩余X尺寸不足以满足下一个即将排入的小矩形块的尺寸时,这时会在染色体的未进行排布的小矩形块里按顺序去搜寻其长或宽满足该行剩余X尺寸的小矩形块,如有满足该条件的小矩形块,则将该矩形块的编号在染色体的提前到当前排布顺序位置,其他所有矩形块的顺序不变;若找不到,则另起一行进行排列。
在排完一行时,需要找到该行排列的小矩形块的最大Y值。在排完所有小矩形块后,将每行的最大Y值累计,即作为该条染色体的适应度的值,并求适应度的最小值。
因为适应度值是累计得来的,因此可以根据适应度的值来计算所需要的毛坯数量neededNum。本题求需求量最小,因此在传入neededNum时需要传入其倒数,作为最终的适应度值。
5. **选择**:适应度函数值越高,则有更大的概率被选中而传入下一代。可以采用轮盘赌策略。
7. **交叉** :在一定的概率内会发生交叉现象,即染色体的某个基因片段进行互换。由于采用十进制编码,在交叉发生后,要判断该条染色体中是否存在重复基因,若重复,要将其找出来并加以修正。
从第6位基因发生交叉,如图会产生违规染色体,要将基因修正。![在这里插入图片描述](https://img-