FJSP-GA/Encode.py

121 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random
import numpy as np
class Encode:
def __init__(self, Matrix, Pop_size, J, J_num, M_num):
"""
:param Matrix: 机器加工时间矩阵
:param Pop_size: 种群数量
:param J: 各工件对应的工序数字典
:param J_num: 工件数
:param M_num: 机器数
"""
self.Matrix = Matrix
self.J = J
self.J_num = J_num
self.M_num = M_num
self.CHS = []
# 调整初始化比例增加随机选择比例到50%
self.GS_num = int(0.3 * Pop_size) # 全局选择初始化
self.LS_num = int(0.2 * Pop_size) # 局部选择初始化
self.RS_num = int(0.5 * Pop_size) # 随机选择初始化(提高比例)
self.Len_Chromo = 0
for i in J.values():
self.Len_Chromo += i # 遍历字典J的所有值并求和即工序数之和
# 生成工序准备的部分(工件排列,天然满足工序顺序约束)
def OS_List(self):
OS_list = []
for k, v in self.J.items(): # 遍历字典J的所有键值对初始化工序矩阵
OS_add = [k - 1 for j in range(v)] # 工件索引从0开始
OS_list.extend(OS_add)
return OS_list
# 生成初始化矩阵
def CHS_Matrix(self, C_num):
return np.zeros([C_num, self.Len_Chromo * 2], dtype=int) # 工件排列+机器索引
# 定位每个工件的每道工序的位置Job第几个工件Operation第几道工序
def Site(self, Job, Operation):
O_num = 0
for i in range(len(self.J)):
if i == Job:
return O_num + Operation
else:
O_num = O_num + self.J[i + 1]
return O_num
# 全局初始化
def Global_initial(self):
CHS = self.CHS_Matrix(self.GS_num)
OS_list = self.OS_List()
for i in range(self.GS_num):
random.shuffle(OS_list)
OS = OS_list.copy()
MS = [0] * self.Len_Chromo
Machine_time = np.zeros(self.M_num, dtype=int)
GJ_list = [i_1 for i_1 in range(self.J_num)]
random.shuffle(GJ_list)
for g in GJ_list:
h = self.Matrix[g]
for j in range(len(h)):
D = h[j]
List_Machine_weizhi = [k for k, val in enumerate(D) if val != 9999]
Machine_Select = [Machine_time[m] + D[m] for m in List_Machine_weizhi]
Min_time = min(Machine_Select)
K = Machine_Select.index(Min_time)
MS[self.Site(g, j)] = K
Machine_time[List_Machine_weizhi[K]] += D[List_Machine_weizhi[K]]
CHS[i] = np.hstack((OS, MS)) # 工件排列 + 机器索引(紧凑编码)
return CHS
# 局部初始化
def Local_initial(self):
CHS = self.CHS_Matrix(self.LS_num)
OS_list = self.OS_List()
for i in range(self.LS_num):
random.shuffle(OS_list)
OS = OS_list.copy()
MS = [0] * self.Len_Chromo
GJ_List = [i_1 for i_1 in range(self.J_num)]
for g in GJ_List:
Machine_time = np.zeros(self.M_num, dtype=int)
h = self.Matrix[g]
for j in range(len(h)):
D = h[j]
List_Machine_weizhi = [k for k, val in enumerate(D) if val != 9999]
Machine_Select = [Machine_time[m] + D[m] for m in List_Machine_weizhi]
Min_time = min(Machine_Select)
K = Machine_Select.index(Min_time)
MS[self.Site(g, j)] = K
Machine_time[List_Machine_weizhi[K]] += D[List_Machine_weizhi[K]]
CHS[i] = np.hstack((OS, MS))
return CHS
# 随机初始化提高比例到50%
def Random_initial(self):
CHS = self.CHS_Matrix(self.RS_num)
OS_list = self.OS_List()
for i in range(self.RS_num):
random.shuffle(OS_list)
OS = OS_list.copy()
MS = [0] * self.Len_Chromo
for g in range(self.J_num):
h = self.Matrix[g]
for j in range(len(h)):
D = h[j]
List_Machine_weizhi = [k for k, val in enumerate(D) if val != 9999]
# 随机选择可用机器
selected = random.choice(List_Machine_weizhi)
K = List_Machine_weizhi.index(selected)
MS[self.Site(g, j)] = K
CHS[i] = np.hstack((OS, MS))
return CHS