蚁群算法求解作业车间调度问题及Python代码实现

作者简介:本人擅长运筹优化建模及算法设计,包括各类车辆路径问题、生产车间调度、二三维装箱问题,熟悉CPLEX和gurobi求解器
微信公众号:运筹优化与学习

若有运筹优化建模及算法定制需求,欢迎联系我们私聊沟通

前言

前篇推文开启了作业车间调度问题的学习,介绍了遗传算法求解作业车间调度问题,本篇将介绍另一种经典的启发式算法-蚁群优化算法(Ant Colony Optimization,ACO)用以求解作业车间调度问题。

感兴趣的可以先去阅读一下前一篇推文,了解作业车间调度问题以及遗传算法求解思路:

优化算法|遗传算法求解作业车间调度问题(Python代码)

本次代码还是求解上篇推文提到的作业车间调度问题,故不再重复介绍问题背景,如有不熟悉的可通过上文链接进行了解学习。

蚁群算法原理

(1)状态转移函数

初始状态下,每条路径上的信息素数量是相同的。同时,初始状态下,每只蚂蚁会通过随机寻找路径的方式前行,信息素释放的数量与搜索路径的目标函数值成反比。随后,搜索过程中,每只蚂蚁根据路径上残留的信息素,计算蚂蚁前往每一个节点的概率,并基于概率选择下一个访问的节点。其中,第 t t t次迭代蚂蚁 k k k从节点 i i i前往节点 j j j的概率 P i j k ( t ) P_{ij}^k(t) Pijk(t)的计算表达式如下:

表达式中, τ i j ( t ) \tau_{ij}(t) τij(t)表示第 t t t次迭代从节点 i i i前往节点 j j j残留的信息素数量, η i j ( t ) \eta_{ij}(t) ηij(t)表示节点 i i i前往节点 j j j的距离长度的倒数, J k J_k Jk表示蚂蚁 k k k还没有访问过的节点的集合。同时, a a a表示信息素因子, b b b表示启发函数因子,这两个参数为蚁群优化算法的关键参数。

(2)更新信息素

在初始状态下,每条路径的信息素数量均设置为0。在搜索过程中,部分信息素会随着时间流逝而挥发,信息素挥发快慢通过参数信息素挥发因子 c c c进行控制。信息素的更新计算表达式如下:

表达式中, Δ τ i j k \Delta \tau_{ij}^k Δτijk蚂蚁 k k k遍历过的路径总长度的倒数, τ i j ( t ) \tau_{ij}(t) τij(t)表示第 t t t次迭代从节点 i i i前往节点 j j j残留的信息素数量。

代码说明

编码方式同样采用基于工序编码全排列的编码方式进行编码,染色体的长度等于所有工件的工序之和。编码顺序代表工序被加工的优先级。

读取数据类

读取算例数据

class Information():

    def __init__(self, file_name, init_pheromone, min_pheromone):
        self.min_pheromone = min_pheromone
        #Read Data
        self.data = self.__readData(file_name)
        self.num_jobs = len(self.data)
        self.num_machines = len(self.data[0])
        #Create Graph 
        self.G, self.node_names = self.__buildGraph(init_pheromone)


    def __readData(self, file_name):    
        jobs = []
        with open("../test_instances/" + file_name,'r') as file: 
            for line in file: 
                machines = {}
                this_machine = None
                for j,value in enumerate(line.split()):
                    if j%2 != 0:
                        machines.update({this_machine : value})
                    else:
                        this_machine = value
                jobs.append(machines)

        return jobs 

蚂蚁类

构造蚂蚁的搜索路径

class Ant():
    def __init__(self, Graph, node_names, ALPHA, BETA, seed, extended_seed):
        self.seed = seed + extended_seed
        self.ALPHA = ALPHA
        self.BETA = BETA
        self.G = Graph 
        self.not_visited = node_names.copy()
        self.ant_path = []


    def evolve(self):
        np.random.seed(self.seed)
        current_node = (-1,-1)
        while self.not_visited:
            if len(self.not_visited) == 1:
                next_node = self.not_visited[0]
            else:
                next_node = self.__chooseNextNode(current_node)
            self.ant_path.append((current_node, next_node))
            current_node = next_node
            self.not_visited.remove(next_node)
        return self.ant_path


    def __chooseNextNode(self, current_node):

        node_probabilities = self.__calculateNodeProbabilityChoices(current_node)
        nodes = list(node_probabilities.keys()) 
        normalized_probabilities = self.__normalizeProbabilities(node_probabilities.values())
        indexs = [ i for i in range(len(normalized_probabilities))]
        next_node_index = np.random.choice(
                                indexs, 
                                p=normalized_probabilities)
        return nodes[next_node_index]

若有运筹优化建模及算法定制需求,欢迎联系我们私聊沟通

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
作业车间调度问题是一个经典的组合优化问题,其目标是将一组作业分配到一组可用的机器上,以最小化完成所有作业所需的总时间。粒子群算法是一种优化算法,通过模拟鸟群的行为来搜索最优解。 以下是使用粒子群算法求解作业车间调度问题的步骤: 1. 确定问题的目标函数。在作业车间调度问题中,目标函数通常是最小化完成所有作业所需的总时间。 2. 确定问题的约束条件。在作业车间调度问题中,约束条件包括每个作业只能分配到一个机器上,每个机器同时只能处理一个作业,以及每个作业的处理时间不能超过机器的可用时间。 3. 初始化粒子群。将每个粒子表示为一个作业分配方案,其中每个作业分配到一个机器上。初始时,每个粒子的位置是随机生成的。 4. 计算每个粒子的适应度。根据目标函数计算每个粒子的适应度,即完成所有作业所需的总时间。 5. 更新粒子的速度和位置。根据粒子群算法的公式,更新每个粒子的速度和位置。 6. 重复步骤4和步骤5,直到达到预设的停止条件。 7. 输出最优解。将具有最小适应度的粒子的作业分配方案作为最优解输出。 需要注意的是,粒子群算法求解作业车间调度问题的效果取决于问题的规模和复杂度,以及算法的参数设置。可以通过调整参数和使用其他优化算法来进一步提高算法的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eternal1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值