小言_互联网的博客

改进差分进化算法及其求解柔性作业车间调度问题(Python代码实现)

331人阅读  评论(0)

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

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

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

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

👨‍💻4 Python代码实现

💥1 概述

       优化问题广泛存在于科研和工程领域中,需要高效并且通用的算法进行求解。通过模拟自然界中优胜劣汰的进化机制来获得问题可行解的启发式算法成为了国内外学者的研究热点。差分进化算法(Differential Evolution,DE)作为启发式算法的一种,由于其结构简单、鲁棒性强,目前被广泛应用于求解各种优化问题。柔性作业车间调度问题(Flexible job shop scheduling problem,FJSP)作为一种典型的优化问题,通过启发式算法求解,可以在资源有限的前提下,得到完工时间更小的调度方案。围绕对DE的改进和求解FJSP。

📚2 运行结果

按照基于全局与局部初始化策略的DE算法求得的最好的最大完工时间: 29.0按照基于全局与局部初始化策略的DE算法求得的最好的工艺方案: [ 7. 10.  9.  4.  7.  5.  1.  9.  2.  8.  5.  7. 10.  6.  6.  3.  3.  2.  4.  5.  9.  8.  3.  2.  3. 10.  7.  6.  1.  1.  9.  9.  7.  1.  6. 10.  8.  2.  2.  5.  4.  3.  8. 10.  4.  1.  4.  5.  6.  8.  5.  6.  6.  5.  4.  2.  2.  4.  3.  6.  2.  3.  5.  1.  6.  5.  6.  2.  5.  1.  4.  6.  4.  3.  2.  2.  5.  6.  3.  3.  6.  5.  1.  4.  6.  4.  5.  2.  1.  2.  3.  6.  4.  6.  4.  5.  3.  5.  5.  4.]整个迭代过程所用时间:14.20s

部分代码实现:

if __name__ == "__main__":
    workpiece = 10 #工件数目
    process = 5 #每个工件的工序数目
    total_process = workpiece * process #工序的总数
    machine = 6 #机器数目
    popsize = 50 #种群规模
    global_size = popsize//2 #全局初始化的数目
    local_size = popsize - global_size #局部初始化的数目
    maxgen = 500 #最大迭代次数
    rangepop = (1,6) #粒子编码中机器选择部分的范围
    F = 0.1 #变异率
    Cr = 0.1 #交叉率
    clean_contents = []
    for i in range(total_process):
        clean_contents.append([[int(contents[i][j]), j+1] for j in range(machine) if contents[i][j] != "-"])
        temp_sum = 0
        for j in range(len(clean_contents[i])):
            temp_sum += 1/clean_contents[i][j][0]
        for j in range(len(clean_contents[i])):
            clean_contents[i][j][0] = (1/clean_contents[i][j][0])/temp_sum
        clean_contents[i].sort()
        cumulation = 0
        for j in range(len(clean_contents[i])):
            cumulation += clean_contents[i][j][0]
            clean_contents[i][j][0] = cumulation
    
    pop,v,fitness = initpopulation()
    gbestpop,gbestfitness,pbestpop,pbestfitness = getinitbest(fitness,pop)
    
    DE_base = []
    iter_process = []
    begin = time.time()
    for i in range(maxgen):
        mid_population = mutation()
        cross_and_select(mid_population)
        
        iter_process.append(fitness.min())
        DE_base.append(gbestfitness)
        for j in range(popsize):
            fitness[j] = calculate(pop[j])
            if fitness[j] < pbestfitness[j]:
                pbestfitness[j] = fitness[j]
                pbestpop[j] = pop[j].copy()
            
        if fitness.min() < gbestfitness:
            gbestfitness = fitness.min()
            gbestpop = pop[fitness.argmin()].copy()

    print("按照基于全局与局部初始化策略的DE算法求得的最好的最大完工时间:",min(DE_base))
    print("按照基于全局与局部初始化策略的DE算法求得的最好的工艺方案:",gbestpop)
    end = time.time()
    print("整个迭代过程所用时间:{:.2f}s".format(end-begin))
    fig = plt.figure(figsize=(10,5))
    ax1 = fig.add_subplot(121)
    ax1.set_xlabel('迭代次数')
    ax1.set_ylabel('最优解')
    ax1.set_title("全局最优解的变化情况")
    ax1.plot(DE_base,color='r')
    ax2 = fig.add_subplot(122)
    ax2.set_xlabel('迭代次数')
    ax2.set_ylabel('最优解')
    ax2.set_title("每次迭代后种群适应度最小值的变化情况")
    ax2.plot(iter_process,color='y')
    plt.show()
 

🎉3 参考文献

[1]陈恩茂. 改进差分进化算法及其求解柔性作业车间调度问题[D].东北大学,2020.DOI:10.27007/d.cnki.gdbeu.2020.000783.

👨‍💻4 Python代码实现


转载:https://blog.csdn.net/weixin_46039719/article/details/127564495
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场