遗传算法求解FJSP


前言

提示:今天我们主要对遗传算法进行复盘学习。


提示:以下是本篇文章正文内容,下面案例可供参考

一、遗传算法是什么?

示例:遗传算法就是模拟大自然中的种群变异的一种算法,其特点就是对全局进行搜索,找到最优解。遗传算法的一个缺点就是很容易陷入局部最优解。所以为了改进遗传算法,人们也花了不少心思。划重点:遗传算法需要经过编码、选择、交叉、变异、进化。这里的每一步都很重要,缺少一步都会对结果产生很大的影响。

二、使用步骤

1.进行编码

常用的编码有二进制编码、还有正整数编码,其实每一层编码都代表一个维度,立即推,编码越多,难度越大。编码采用的是101、102、103、201、202类似这种编码,101的含义表示第一件工件的第一道工序,以此类推。

代码如下(示例):

 S1 = S[0:self.WNumber]  # 取前面的加工工序
        M = S[self.WNumber:self.WNumber*2]  # 取机器编码
            # 根据基因,计算调度工序
        temp = np.zeros(self.PNumber, dtype=int)
        P = np.zeros(self.WNumber, dtype=int)  # 存储工序
        TM = np.zeros(self.JmNumber, dtype=int)  # 用来存储机器号的矩阵,有10台机器
        TP = np.zeros(self.PNumber, dtype=int)  # 存储加工时间

        for k in range(self.WNumber):
            v = S1[k] - 1
            temp[v] = temp[v] + 1
            P[k] = (v + 1) * 100 + temp[v]  # 形成每道工序编码,例如:501
            # print(P)#P是存储解码的例如501这样的-----------------------------------没有问题,下面要调试
            # 根据调度工序,计算出调度工序时间
            # 取机器号
        for l in range(self.WNumber):
            val = P[l]
            a, b = divmod(val, 100)  # 同时取余数和商,a代表工序,b代表工件
            Temp = Jm[b - 1][a - 1]
            if np.size(Temp) > 1:
                m = Temp[M[l] - 1]
            else:
                m = Temp

                # 取加工时间
            Temp_1 = T[b - 1][a - 1]
            if np.size(Temp_1) > 1:
                t = Temp_1[M[l] - 1]
            else:
                t = Temp_1
            #这里的t表示的是每道工序的对应的时间
            TMval = TM[m - 1]
            TPval = TP[b - 1]
            if TMval > TPval:
                val = TMval  # 取前面一道工序时间
            else:
                val = TPval
                # 计算时间
            PVal[0][l] = val
            PVal[1][l] = val + t
                # 记录本次工序的机器时间和工序时间
            TM[m - 1] = PVal[1][l]
            TP[b - 1] = PVal[1][l]

            # 取完成时间-----------------------------------没有问题,下面要调试
            MT = np.zeros(self.WNumber, dtype=int)

            for q in range(self.WNumber):

                if PVal[0][q] >= PVal[1][q]:
                    MT[q] = PVal[0][q]
                else:
                    MT[q] = PVal[1][q]

            Tval = max(MT)#表示取最大机器加工时间

2.选择

代码如下(示例):

主要有轮盘赌选择,或者竞标赛选择,我本次采用的是轮盘赌的形式

idx=np.random.choice(np.array(self.NIND),int(self.NIND*self.Gap),replace=False,p=fitness)
        a = self.chrom[idx]
        # print(np.shape(a))
        return self.chrom[idx]

3.交叉

可以看图,这里讲不清
在这里插入图片描述

4.变异

如上图所示:

5.进化

这一步很关键,就是经过了以上几步后的种群是发生了变化,要保存这个变化。没经过一代种群就进化一点,多经过几代后,种群就靠近最优解了。

总结

主要对遗传算法进行了阐述,具体的一些步骤。如果需要源码的话,可以进入我的主页,就可以下载啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self.键盘上的钢琴师.LX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值