基于改进粒子群的柔性作业车间调度问题优化研究(Python代码实现)

💥💥💞💞 欢迎来到本博客❤️❤️💥💥

🏆博主优势: 🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️ 座右铭:行百里者,半于九十。

目录
💥1 概述
📚2 运行结果
🎉3 参考文献
👨‍💻4 Python代码

💥1 概述

作业车间调度问题(job-shop scheduling problem,JSP)是指一个加工系统有m台机器,要求加工n项组装元件,不同的作业包含不同的操作数,假设L为任务集的总操作数.在JSP问题中,每项组装元件的操作时间已经确定,对于元件中的每项操作,其存在相应的先后顺序,每项操作需要按照对应的先后顺序进行加工。对于作业车间调度问题而言,是指将所有组装元件的所有操作进行加工排序,使之满足约束,并且达到目标最优.

柔性作业车间调度问题(flexible job-shop scheduling problem,FJSP)与传统的JSP问题相比,其主要特点是工件的操作可以选择一台或者几台机器进行加工,不存在资源唯一性约束的相关问题.与之相比,由于机器的选择不同,其问题的复杂程度也呈指数级增长.

📚2 运行结果

基于改进粒子群的柔性作业车间调度问题优化研究(Python代码实现)

部分代码:

import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import *

mpl.rcParams['font.sans-serif'] = ['SimHei']  #黑体换成SimHei
mpl.rcParams['axes.unicode_minus'] = False

'''
改变问题规模时需要改动的参数:工件参数workpiece,工序数目process,机器数目machine,
机器选择部分的范围上限,迭代次数(规模小的时候可能降低迭代次数)
'''

#读取原始数据
contents = []
with open("data_first.txt") as f:
    string = f.readlines()
    for item in string:
        contents.append(item.strip().split(" "))

#对工序部分进行处理
def handle(x):
    #输入:粒子的位置,输出:对工序部分处理后的列表
    piece_mark = np.zeros(workpiece) #统计工序的标志
    array = [] #经过处理后的工序列表
    for i in range(total_process):
        piece_mark[int(x[i]-1)] += 1
        array.append((int(x[i]), int(piece_mark[int(x[i]-1)])))
    return array

def initpopvfit():
    pop = np.zeros((popsize,total_process*2))
    v = np.zeros((popsize,total_process*2))
    fitness = np.zeros(popsize)

    for i in range(popsize):
        #初始化工序部分
        for j in range(workpiece):
            for p in range(process):
                pop[i][j*process + p] = j+1
        np.random.shuffle(pop[i][:total_process])

        #初始化机器部分
        for j in range(total_process):
            index = np.random.randint(0, machine)
            while contents[j][index] == "-":
                index = np.random.randint(0, machine)
            pop[i][j+total_process] = index+1

        #计算各粒子初始的适应度
        fitness[i] = calculate(pop[i])
    return pop,v,fitness

def calculate(x):
    # 输入:粒子位置,输出:粒子适应度值
    Tm = np.zeros(machine) #每个机器上的完工时间
    Te = np.zeros((workpiece, process)) #每个工序的完成时间
    array = handle(x) #经过处理后的工序部分

    for i in range(total_process):
        machine_index = int(x[total_process+(array[i][0]-1)*process+(array[i][1]-1)])-1 #contents数组中的纵坐标
        process_index = (array[i][0]-1)*process + (array[i][1]-1) #contents数组中的横坐标
        process_time = int(contents[process_index][machine_index])
        if array[i][1] == 1:
            Tm[machine_index] += process_time
            Te[array[i][0]-1][array[i][1]-1] = Tm[machine_index]
        else:
            Tm[machine_index] = max(Te[array[i][0]-1][array[i][1]-2], Tm[machine_index]) + process_time
            Te[array[i][0]-1][array[i][1]-1] = Tm[machine_index]
    return max(Tm)

def getinitbest(fitness,pop):
    # 群体最优的粒子位置及其适应度值
    gbestpop,gbestfitness = pop[fitness.argmin()].copy(),fitness.min()
    #个体最优的粒子位置及其适应度值,使用copy()使得对pop的改变不影响pbestpop,pbestfitness类似
    pbestpop,pbestfitness = pop.copy(),fitness.copy()
    return gbestpop,gbestfitness,pbestpop,pbestfitness

🎉3 参考文献

[1]吴晓雯,郑巧仙.基于改进粒子群的柔性作业车间调度问题优化研究[J].湖北大学学报(自然科学版),2022,44(05):501-507.

[2]蔡劲草. 基于改进遗传算法的柔性作业车间调度问题研究[D].安徽工程大学,2018.

👨‍💻4 Python代码

Original: https://blog.csdn.net/weixin_46039719/article/details/127556512
Author: 荔枝科研社
Title: 基于改进粒子群的柔性作业车间调度问题优化研究(Python代码实现)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/758024/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球