import numpy as np
import random
import matplotlib.pyplot as plt
import math
from itertools import chain
agv_num = 2
####工件的加工信息表格(Fisher and Thompson 6x6 instance mt06)####
# job_info=np.array([[2,1,0,3,1,6,3,7,5,3,4,6],
# [1,8,2,5,4,10,5,10,0,10,3,4],
# [2,5,3,4,5,8,0,9,1,1,4,7],
# [1,5,0,5,2,5,3,3,4,8,5,9],
# [2,9,1,3,4,5,5,4,0,3,3,1],
# [1,3,3,3,5,9,0,10,4,4,2,1]])
####工件的加工信息表格(Fisher and Thompson 5x6 instance mt06)####
# job_info=np.array([[2,1,0,3,1,6,3,7,5,3,4,6],
# [1,8,2,5,4,10,5,10,0,10,3,4],
# [2,5,3,4,5,8,0,9,1,1,4,7],
# [1,5,0,5,2,5,3,3,4,8,5,9],
# [2,9,1,3,4,5,5,4,0,3,3,1]])
####工件的加工信息表格(Fisher and Thompson 7x6 instance mt06)####
job_info=np.array([[2,1,0,3,1,6,3,7,5,3,4,6],
[1,8,2,5,4,10,5,10,0,10,3,4],
[2,5,3,4,5,8,0,9,1,1,4,7],
[1,5,0,5,2,5,3,3,4,8,5,9],
[2,9,1,3,4,5,5,4,0,3,3,1],
[2,9,1,3,4,5,5,4,0,3,3,1],
[1,3,3,3,5,9,0,10,4,4,2,1]
])
job_num = job_info.shape[0] #工件数量 6
operation_num = int(job_info.shape[1]/2) #单个工件的工序数量 6
####工件的延迟信息表格 ####
# delay_info = np.array ([35,70,105,140,175,210])
####工件的延迟信息表格 ####
delay_info = np.array ([35,70,105,140,175,180,190])
####工件的利润信息表格 ####
# money_info = np.array([20,30,40,50,60,70])
####工件的利润信息表格 ####
money_info = np.array([20,30,40,50,60,70,80])
####AGV两点位运动时间表格####
agv_move_info=np.array([[0,4,6,8,14,12,10],
[10,0,3,5,11,9,7],
[12,15,0,3,9,7,9],
[14,17,15,0,7,9,11],
[8,11,9,7,0,3,5],
[6,9,7,9,15,0,3],
[4,7,9,11,17,15,0]])
mach_num = agv_move_info.shape[0]-1 # machine的数量 6
####调度方案生成####
def init(N_size):
p_list = []
pop = []
for i in range(0, job_num):
for q in range(operation_num):
p_list.append(i)
for j in range(0, N_size):
pop.append(random.sample(p_list, job_num * operation_num))
pop = np.array(pop)
return pop
####agv运输时间计算####
def time_compute(start,end):
return agv_move_info[start+1][end+1]
####完工时间计算####
# 最后呈现两张图
# 图1:machine的甘特图
# 图2:agv的甘特图 unloading / waiting / loading
def single_scheduling_time(scheduling_plan,show,count): # 传入某一个个体的scheduling plan
t = 0
agv_state = list()
makespan_list = job_num * [0]
makespan_list = job_num * [0]
delay_list = job_num * [0]
profit_list = job_num * [0]
# AGV初始状态标定
for i in range(agv_num):
agv_state.append(["waiting", -1]) # 第一个参数:区分AGV两种状态"loading"、"unloading"、"waiting"
# 第二个参数:区分AGV的目的地,-1表示“L/U”,0表示machine 1...
machine_timestamp = list() # 6xN maxtrix
for j in range(mach_num):
machine_timestamp.append([])
machine_timestamp[j].append(0) # 第一个时刻为0
agv_timestamp = list() # 2xN matrix
for j in range(agv_num):
agv_timestamp.append([])
agv_timestamp[j].append(0) # 第一个时刻为0
tag = np.zeros((job_num), dtype=int) # 记录某一个job的第几次步骤 #[0,0,0,0,0,0] 编号0代表第一个步骤,编号5代表最后一个步骤
for i in range(scheduling_plan.shape[0]):
mach_p = job_info[scheduling_plan[i]][tag[scheduling_plan[i]] * 2] # 该工序由mach_p号进行加工
# print("mach_p",mach_p)
time_p = job_info[scheduling_plan[i]][tag[scheduling_plan[i]] * 2 + 1] # 加工该工序所用的时间
# print("time_p",time_p)
order_executiving(mach_p, time_p, scheduling_plan[i], tag, agv_state, agv_timestamp, machine_timestamp,
makespan_list, delay_list)
tag[scheduling_plan[i]] += 1
# 计算优化函数1:makespan 记录最大的完工时间
# print("makespan_list",makespan_list)
makespan = max(makespan_list)
# 计算优化函数2:mean_tardiness 记录平均延迟时间
# print("delay_list",delay_list)
mean_tardiness = round(np.mean(np.array(delay_list)), 1)
# 计算优化函数3:profit 记录利润
profit_list = profit_cal(delay_list)
profit = round(np.sum(np.array(profit_list)), 1)
# 添加时间刻度,用于绘制甘特图
max_machine_list = list()
for j in range(len(machine_timestamp)):
max_machine_list.ap
NSGA-II 求解 JSP+AGV调度 三目标联合优化问题
最新推荐文章于 2024-09-29 22:20:53 发布