NSGA-II 求解 JSP+AGV调度 三目标联合优化问题

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值