import numpy as np
import random
from Decode_for_JSP import Decode
from Encode_for_JSP import Encode
import itertools
class JSPGAInput:
def __init__(self, dict) -> None:
self.ProcessingTime = []
self.ProcessingGroup = []
self.MachineStartTime = []
self.TimeEfficent = []
self.MachineBuffer = []
self.Itertion = 10
self.__dict__.update(dict)
class JSPGAResult:
def __init__(self, decode: Decode, best_fit: list, worst_fit: list, avg_fit: list) -> None:
self.Decode = decode
self.BestFit = best_fit
self.WorstFit = worst_fit
self.AvgFit = avg_fit
class GA:
def __init__(self):
self.Pop_size=300 #种群数量
self.P_c=0.8 #交叉概率
self.P_m=0.1 #变异概率
self.P_v=0.1 #选择何种方式进行交叉
self.P_w=0.0 #采用何种方式进行变异
self.Max_Itertions=10 #最大迭代次数
#适应度
def fitness(self,CHS,J,Processing_time,M_num,Len, Machine_start_time, Time_efficent, Machine_buffer):
Fit=[]
for i in range(len(CHS)):
d = Decode(J, Processing_time, M_num, Machine_start_time, Time_efficent, Machine_buffer)
Fit.append(d.Decode_1(CHS[i],Len))
return Fit
#机器部分交叉
def Crossover_Machine(self,CHS1,CHS2,T0):
T_r=[j for j in range(T0)]
r = random.randint(1, 10) # 在区间[1,T0]内产生一个整数r
random.shuffle(T_r)
R = T_r[0:r] # 按照随机数r产生r个互不相等的整数
# 将父代的染色体复制到子代中去,保持他们的顺序和位置
OS_1=CHS1[T0:2*T0]
OS_2 = CHS2[T0:2 * T0]
C_1 = CHS2[0:T0]
C_2 = CHS1[0:T0]
for i in R:
K,K_2 = C_1[i],C_2[i]
C_1[i],C_2[i] = K_2,K
CHS1=np.hstack((C_1,OS_1))
CHS2 = np.hstack((C_2, OS_2))
return CHS1,CHS2
#工序交叉部分
def Crossover_Operation(self,CHS1, CHS2, T0, J_num, Processing_group):
OS_1 = CHS1[T0:2 * T0]
OS_2 = CHS2[T0:2 * T0]
MS_1 =CHS1[0:T0]
MS_2 = CHS2[0:T0]
Set1 = []
Set2 = []
if (Processing_group is not None and len(Processing_group) > 0):
#工件组合(加工顺序必须固定)
Job_list = [i for i in range(J_num)]
random.shuffle(Job_list)
tmp_group = []
for group in Processing_group:
if (len(group) > 0):
tmp_group.append(group)
for i in group:
Job_list.remove(i)
for i in Job_list:
tmp_group.append([i])
random.shuffle(tmp_group)
r = random.randint(1, len(tmp_group) - 1)
for group in tmp_group[0:r]:
for i in group:
Set1.append(i)
for group in tmp_group[r:len(tmp_group)]:
for i in group:
Set2.append(i)
else:
Job_list = [i for i in range(J_num)]
random.shuffle(Job_list)
r = random.randint(1, J_num - 1)
Set1 = Job_list[0:r]
Set2 = Job_list[r:J_num]
new_os1 = []
new_os2 = []
for i in OS_1:
if i in Set1:
new_os1.append(i)
if i in Set2:
new_os2.append(i)
for i in OS_2:
if i not in Set1:
new_os1.append(i)
if i not in Set2:
new_os2.append(i)
CHS1=np.hstack((MS_1,new_os1))
CHS2 = np.hstack((MS_2, new_os2))
return CHS1,CHS2
def reduction(self,num,J,T0):
T0=[j for j in range(T0)]
K=[]
Site=0
for k,v in J.items():
K.append(T0[Site:Site+v])
Site+=v
for i in range(len(K)):
if num in K[i]:
Job=i
O_num=K[i].index(num)
break
return Job,O_num
#机器变异部分
def Variation_Machine(self,CHS,O,T0,J):
Tr=[i_num for i_num in range(T0)]
MS=CHS[0:T0]
OS=CHS[T0:2*T0]
# 机器选择部分
r = random.randint(1, T0 - 1) # 在变异染色体中选择r个位置
random.shuffle(Tr)
T_r = Tr[0:r]
for i in T_r:
Job=self.reduction(i,J,T0)
O_i=Job[0]
O_j =Job[1]
Machine_using = O[O_i][O_j]
Machine_time = []
for j in Machine_using:
if j is not None and len(j) > 0:
Machine_time.append(j)
Min_index = Machine_time.index(min(min(Machine_time)))
MS[i] = Min_index
CHS=np.hstack((MS,OS))
return CHS
#工序变异部分
def Variation_Operation(self, CHS,T0,J_num,J,Processing_time,M_num):
return CHS #暂不进行工序变异
MS=CHS[0:T0]
OS=list(CHS[T0:2*T0])
r=random.randint(1,J_num-1)
Tr=[i for i in range(J_num)]
random.shuffle(Tr)
Tr=Tr[0:r]
J_os=dict(enumerate(OS)) #随机选择r个不同的基因
J_os = sorted(J_os.items(), key=lambda d: d[1])
Site=[]
for i in range(r):
Site.append(OS.index(Tr[i]))
A=list(itertools.permutations(Tr, r))
A_CHS=[]
for i in range(len(A)):
for j in range(len(A[i])):
OS[Site[j]]=A[i][j]
C_I=np.hstack((MS,OS))
A_CHS.append(C_I)
Fit = []
for i in range(len(A_CHS)):
d = Decode(J, Processing_time, M_num)
Fit.append(d.Decode_1(CHS, T0))
return A_CHS[Fit.index(min(Fit))]
def Select(self,Fit_value):
Fit=[]
for i in range(len(Fit_value)):
fit=1/Fit_value[i]
Fit.append(fit)
Fit=np.array(Fit)
idx = np.random.choice(np.arange(len(Fit_value)), size=len(Fit_value), replace=True, p=(Fit) / (Fit.sum()))
return idx
def start(self, inputParam: JSPGAInput) -> JSPGAResult:
self.Max_Itertions = inputParam.Itertion
J = {}
J_num = 0
M_num = 0
for a in inputParam.ProcessingTime:
J_num += 1
J[J_num] = len(a)
M_num = len(a[0])
e = Encode(inputParam.ProcessingTime, self.Pop_size, J, J_num, M_num, inputParam.ProcessingGroup)
OS_List=e.OS_List()
Len_Chromo=e.Len_Chromo
CHS1=e.Global_initial()
CHS2 = e.Random_initial()
CHS3 = e.Local_initial()
C=np.vstack((CHS1,CHS2,CHS3))
Optimal_fit=9999
Optimal_CHS=0
Best_fit=[]
Worst_fit = []
Avg_fit = []
for i in range(self.Max_Itertions):
Fit = self.fitness(C, J, inputParam.ProcessingTime, M_num, Len_Chromo, inputParam.MachineStartTime, inputParam.TimeEfficent, inputParam.MachineBuffer)
Best = C[Fit.index(min(Fit))]
best_fitness = min(Fit)
worst_fit = max(Fit)
avg_fit = np.average(Fit)
Worst_fit.append(worst_fit)
Avg_fit.append(avg_fit)
# d = Decode(J, Processing_time, M_num)
# Optimal_CHS = C[Fit.index(max(Fit))]
# Fit.append(d.Decode_1(Optimal_CHS, Len_Chromo))
# d.Gantt(d.Machines)
if best_fitness < Optimal_fit:
Optimal_fit = best_fitness
Optimal_CHS = Best
Best_fit.append(Optimal_fit)
print('best_fitness', best_fitness)
else:
Best_fit.append(Optimal_fit)
Select = self.Select(Fit)
for j in range(len(C)):
offspring = []
if random.random()<self.P_c:
N_i = random.choice(np.arange(len(C)))
if random.random()<self.P_v:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
GA(遗传算法)求解JSP(车间调度问题)python项目源码+项目说明.zip GA(遗传算法)求解JSP(车间调度问题) 工件在机器间流转:本机器上加工的工件要流转到下一个机器,本机器才能开始加工下一个工件。(与原作的时间窗计算方式不同) 某些机器设有buffer:如果一个工件下一道工序在设有buffer的机器上加工,本道工序完成后可直接流转,不需要等待下一个机器空闲 工件组合:一组工件的加工顺序必须固定 机器开工时间:由于部分机器需要完成上一批次加工的工件,排产时需要考虑机器参与本次排产的开工时间 不同时间段对应不同生产能力:由于不同班次的生产能力不同,所以同一物料同一工序在同一工作中心的耗时也会不同 【两种使用方法】 运行JSPGAGraphPainter.py文件,其中的main函数可加载test1-3中的测试用例,并使用GA进行求解,最终输出最优解的甘特图,以及迭代过程中种群最大、最小、平均适应度曲线。 运行JSPGAHttpServer.py文件,将提供HTTP服务,并使用GA进行求解,最终返回各机器上各工件的加工起始、结束时间。
资源推荐
资源详情
资源评论
收起资源包目录
GA(遗传算法)求解JSP(车间调度问题)python项目源码+项目说明.zip (13个子文件)
JSPGA.py 9KB
项目说明.md 1KB
test1.py 2KB
Encode_for_JSP.py 7KB
test3.py 601B
LICENSE 1KB
Decode_for_JSP.py 7KB
test2.py 2KB
Machines.py 2KB
Jobs.py 701B
JSPGAGraphPainter.py 2KB
JSPGAHttpServer.py 2KB
.gitignore 47B
共 13 条
- 1
资源评论
- m0_751371552023-05-25资源内容详实,描述详尽,解决了我的问题,受益匪浅,学到了。
- fengkai9912023-05-13怎么能有这么好的资源!只能用感激涕零来形容TAT...onnx2023-05-18感謝支持~
- DENNISS_2023-04-12资源简直太好了,完美解决了当下遇到的难题,这样的资源很难不支持~onnx2023-05-06谢谢支持!
- 夜太美~2023-03-31资源内容详尽,对我有使用价值,谢谢资源主的分享。onnx2023-04-05感谢您对资源的认可和支持~互相学习
onnx
- 粉丝: 9973
- 资源: 5626
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 塑料检测23-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- Python圣诞节倒计时与节日活动管理系统
- 数据结构之哈希查找方法
- 系统DLL文件修复工具
- 塑料、玻璃、金属、纸张、木材检测36-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- Python新年庆典倒计时与节日活动智能管理助手
- Nosql期末复习资料
- 数据结构排序算法:插入排序、希尔排序、冒泡排序及快速排序算法
- 2011-2024年各省数字普惠金融指数数据.zip
- 计算机程序设计员三级(选择题)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功