遗传算法求解带有AGV的FJSP

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
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值