import random
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import copy
import numpy as np
import time
class FJSPwithAGV:
def __init__(self, job_machine_time, agv_number, traveltime_for_machine):
self.job_machine_time = job_machine_time # 工件在哪台机器上加工 加工时间
self.travel_time = traveltime_for_machine # 小车在机器之间的行走时间
# self.location_machine = location_machine # 暂时没用, 之后嵌入A*之后可以把时间从各机器之间改为位置之间
self.agv_number = agv_number # 小车数量
self.job_number = len(self.job_machine_time) # 工件数量
self.machine_number = len(self.job_machine_time[0][0]) # 机器数量
# 工件各工序可选加工机器
self.job_machien = [[[k for k in range(len(self.job_machine_time[i][j]))
if self.job_machine_time[i][j][k] != -1] for j in range(len(self.job_machine_time[i]))]
for i in range(len(self.job_machine_time))]
# 工件各工序在可选加工机器上的加工时间
self.job_time = [[[self.job_machine_time[i][j][k] for k in range(len(self.job_machine_time[i][j]))
if self.job_machine_time[i][j][k] != -1] for j in range(len(self.job_machine_time[i]))]
for i in range(len(self.job_machine_time))]
# 工件开始、结束时间
self.job_start_time = [[0 for j in range(len(self.job_machine_time[i]))] for i in range(self.job_number)]
self.job_end_time = [[0 for j in range(len(self.job_machine_time[i]))] for i in range(self.job_number)]
# 机器开始、结束时间
self.machine_start_time = [0 for i in range(self.machine_number)]
self.machine_end_time = [0 for i in range(self.machine_number)]
# 小车开始、结束时间和小车所在位置
self.agv_start_time = [0 for i in range(self.agv_number)]
self.agv_end_time = [0 for i in range(self.agv_number)]
self.agv_location = [i for i in range(self.agv_number)]
# 小车的搬运记录:开始、结束时间,开始、结束地点,工件工序; 工件加工记录:已加工的工序数; 工件在哪台机器上进行的加工
self.agv_process_record = [[] for i in range(self.agv_number)]
self.job_process_record = [0 for i in range(self.job_number)]
self.job_what_machine = [[0 for j in range(len(self.job_machine_time[i]))] for i in range(self.job_number)]
def reset(self):
# 算法重置,清除掉解码之后的数据以进行下一条染色体的解码
self.__init__(self.job_machine_time, self.agv_number, self.travel_time)
def create_machine_time(self):
# 创建机器之间的搬运时间
x = np.zeros((self.machine_number, self.machine_number))
for i in range(self.machine_number):
for j in range(i):
x[i][j] = np.random.randint(1, 7)
x += x.T
return x
def trible_code(self):
# 三层编码:[工件,机器,小车]
record = [0 for i in range(self.job_number)]
codes = []
for i in range(self.job_number):
for j in range(len(self.job_start_time[i])):
codes.append(i)
random.shuffle(codes) # 工件编码
machines = [] # 机器编码
for i in range(len(codes)):
# codes[i] 是工件 record[codes[i]]是工序
machines.append(random.choice(self.job_machien[codes[i]][record[codes[i]]])) # 随机从可选机器中选取一台
record[codes[i]] += 1
agv_code = [] # 小车编码
for i in range(len(codes)):
agv_code.append(random.randint(0, self.agv_number - 1)) # 随机从小车中选取一台
return [codes, machines, agv_code]
def decode(self, codes):
# 解码 整个算法的关键
for i in range(len(codes[0])):
# codes[0][i] 工件 codes[1][i] 下一机器 codes[2][i] 小车
job = codes[0][i]
next_machine = codes[1][i]
agv = codes[2][i]
process = self.job_process_record[codes[0][i
遗传算法求解带有AGV的FJSP
最新推荐文章于 2023-01-31 08:33:44 发布