前言
提示:今天我们主要对遗传算法进行复盘学习。
提示:以下是本篇文章正文内容,下面案例可供参考
一、遗传算法是什么?
示例:遗传算法就是模拟大自然中的种群变异的一种算法,其特点就是对全局进行搜索,找到最优解。遗传算法的一个缺点就是很容易陷入局部最优解。所以为了改进遗传算法,人们也花了不少心思。划重点:遗传算法需要经过编码、选择、交叉、变异、进化。这里的每一步都很重要,缺少一步都会对结果产生很大的影响。
二、使用步骤
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.进化
这一步很关键,就是经过了以上几步后的种群是发生了变化,要保存这个变化。没经过一代种群就进化一点,多经过几代后,种群就靠近最优解了。
总结
主要对遗传算法进行了阐述,具体的一些步骤。如果需要源码的话,可以进入我的主页,就可以下载啦。