遗传算法解混合流水车间调度问题(注释很多)JavaScript

题目描述: n 个工件要在 c 台机器上加工,每个工件需要经过 c 道工序,每道工序要求不同的机器,n 个工件在 c 台机器上的加工顺序相同。确定 n 个工件在每台机器上的最优加工顺序,使最大流程时间达到最小。

测试问题参数取值:工件数量n=6,工序数量c=3,每道工序并行机器数量m=2。

在这里插入图片描述

目录


1、遗传算法一般流程

在这里插入图片描述

编码 指将最终结果抽象成为可以进行优化处理的序列,例如这道题最终要找到合理的工序,那么我们就可以设置一个工序的数组,如果有3个工件,那么工序对应为[1,2,3], [1,3,2], [2,1,3], [2,3,1],[3,1,2],[3,2,1] 六种。他们之间是可以通过改变序列顺序进行优化的。

初始化种群 定义初始时刻的结果集合,他们一般是随机生成的,程序会根据这些初始的结果集合进行演变。最终趋向于某个最优解。在初始化过程种,最重要的是初始化总群大小,过大的总群会增加内存负担,而过小的总群很容易进入局部最优解。

评估个体适应度 这一步用于计算一个个体是否符合需求,适应度高的个体会在遗传算法中得到保留和发展。

选择 挑选最满足条件的优秀个体,而抛弃偏离条件的个体

交叉 优秀的个体序列进行交换数据(或者取平均,具体的问题具体分析),模拟自然届中的基因重组。

变异 个体序列发生变异,模拟自然界中的变异,可以有效的防止程序进入局部最优值。


2、编码

根据表述,我们先择顺序列表作为编码。本题中有六个工件,所以我们可以开辟一个6格大小的数组进行数据的存储。例如

var arr = [2,3,0,1,5,4];
3、初始化种群

初始化种群的重要参数是种群中最多容纳个体的数目,个体又是一个一个序列的集合,所以在这个过程中,我们要生成一个m * n的二维矩阵,m为个体总数,n为每个个体的对应的数列,如上文所言,这里的数列会随机产生。

var WORKPIECE_NUM = 6; // 总共要完成的零件数目 var POOR_SIZE = 25; // 每一波存在的组数 var poor = new Array(POOR_SIZE); // 初始化自然空间个体数目的容纳数组 (总群数) poorInit(POOR_SIZE, WORKPIECE_NUM, poor); /** 初始化自然空间 * @param {*} poor_size 自然空间的种群数目的容纳量 * @param {*} workpiece_num 工件的数目,即每个个体的大小 * @param {*} poor 自然空间种群数目的容纳数组 */ function poorInit(poor_size, workpiece_num, poor){ for(var i=0; i<poor_size; i++){ // 随机生成流程数目 poor[i] = new Array(workpiece_num); // 对于每一个个体,随机生成其基因序列 randomList(workpiece_num,poor[i]); } } /** 生成一个随机不重复的数列 * @param {Int} len 数组的长度 * @param {Int16Array} arr 结果存储数组 */ function randomList(len, arr){ // 生成顺序排列的字符串 for(var i=0; i< len; i++){ arr[i] = i; } // 打乱 for(var i=len-1; i>0; i--){ var j = random(i); // 生成一个随机数 var tem = arr[j]; // 让最后一位和随机数对应的数字进行交换,然后i--,最后一位向前移动一格 arr[j] = arr[i]; arr[i] = tem; } } /** 产生[0, n)范围内的随机整数 * @param {Int} n 随机数上线 */ function random (n){ return Math.floor(Math.random()*n); }
4、评估个体适应度

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyssg.html