遗传算法 与 作业车间调度问题(C++实现)

之前我们算法老师留的一个大作业,即作业车间调度问题,属于NP-hard问题,有很多种解法,这里给出遗传算法的解法。算法使用C++实现,如果需要Java或Python代码,请看这篇文章:作业车间调度与遗传算法Python/Java实现及应用:BitMES,基于Electron的作业车间调度系统

问题描述

作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一。其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加工流水线等。

JSP问题描述:一个加工系统有M台机器,要求加工N个作业,其中,作业i包含工序数为Li。令 L = \sum_{i=1}^{N}L_i ,则L为任务集的总工序数。其中,各工序的加工时间已确定,并且每个作业必须按照工序的先后顺序加工。调度的任务是安排所有作业的加工调度排序,约束条件被满足的同时,使性能指标得到优化。

作业车间调度需要考虑如下约束:

约束1:每道工序在指定的机器上加工,且必须在其前一道工序加工完成后才能开始加工;

约束2:某一时刻1台机器只能加工1个作业;

约束3:每个作业只能在1台机器上加工1次;

约束4:各作业的工序顺序和加工时间已知,不随加工排序的改变而改变。

问题实例

下面给出作业车间调度问题的一个实例,其中每个工序上标注有一对数值(m,p),其中,m表示当前工序必须在第m台机器上进行加工,p表示第m台机器加工当前工序所需要的加工时间。(注:机器和作业的编号从0开始)

  1. Jop1=[(0,3),(1,2),(2,2)]
  2. Jop2=[(0,2),(2,1),(1,4)]
  3. Jop3=[(1,4),(2,3)]

在这个例子中,作业jop0有3道工序:它的第1道工序上标注有(0,3),其表示第1道工序必须在第0台机器上进行加工,且需要3个单位的加工时间;它的第2道工序上标注有(1,2),其表示第2道工序必须在第1台机器上进行加工,且需要2个单位的加工时间;余下的同理。总的来说,这个实例中共有8道工序。

该问题的一个可行解是L=8道工序开始时间的一个排列,且满足问题的约束。下图给出了一个可行解(注:该解不是最优解)的示例:

在上图中,我们能看到每个作业的工序按照问题给定的顺序进行了加工,且相互之间没有时间区间重叠。这个可行解的结果是12,即三个作业均被加工完成的时间。

遗传算法

简介:

遗传算法(genetic algorithm (GA))是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。

遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解(称为个体)可抽象表示为染色体,使种群向更好的解进化。传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。进化从完全随机个体的种群开始,之后一代一代发生。在每一代中评价整个种群的适应度,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。

算法机理:

在遗传算法里,优化问题的解被称为个体,它表示为一个变量序列,叫做染色体或者基因串。染色体一般被表达为简单的字符串或数字符串,不过也有其他的依赖于特殊问题的表示方法适用,这一过程称为编码。首先,算法随机生成一定数量的个体,有时候操作者也可以干预这个随机产生过程,以提高初始种群的质量。在每一代中,都会评价每一个体,并通过计算适应度函数得到适应度数值。按照适应度排序种群个体,适应度高的在前面。这里的“高”是相对于初始的种群的低适应度而言。

下一步是产生下一代个体并组成种群。这个过程是通过选择和繁殖完成,其中繁殖包括交配(crossover,在算法研究领域中我们称之为交叉操作)和突变(mutation)。选择则是根据新个体的适应度进行,但同时不意味着完全以适应度高低为导向,因为单纯选择适应度高的个体将可能导致算法快速收敛到局部最优解而非全局最优解,我们称之为早熟。作为折中,遗传算法依据原则:适应度越高,被选择的机会越高,而适应度低的,被选择的机会就低。初始的数据可以通过这样的选择过程组成一个相对优化的群体。之后,被选择的个体进入交配过程。一般的遗传算法都有一个交配概率(又称为交叉概率),范围一般是0.6~1,这个交配概率反映两个被选中的个体进行交配的概率。例如,交配概率为0.8,则80%的“夫妻”会生育后代。每两个个体通过交配产生两个新个体,代替原来的“老”个体,而不交配的个体则保持不变。交配父母的染色体相互交换,从而产生两个新的染色体,第一个个体前半段是父亲的染色体,后半段是母亲的,第二个个体则正好相反。不过这里的半段并不是真正的一半,这个位置叫做交配点,也是随机产生的,可以是染色体的任意位置。再下一步是突变,通过突变产生新的“子”个体。一般遗传算法都有一个固定的突变常数(又称为变异概率),通常是0.1或者更小,这代表变异发生的概率。根据这个概率,新个体的染色体随机的突变,通常就是改变染色体的一个字节(0变到1,或者1变到0)。

经过这一系列的过程(选择、交配和突变),产生的新一代个体不同于初始的一代,并一代一代向增加整体适应度的方向发展,因为总是更常选择最好的个体产生下一代,而适应度低的个体逐渐被淘汰掉。这样的过程不断的重复:评价每个个体,计算适应度,两两交配,然后突变,产生第三代。周而复始,直到终止条件满足为止。一般终止条件有以下几种:

1.进化次数限制。

2.计算耗费的资源限制(例如计算时间、计算占用的内存等)。

3.一个个体已经满足最优值的条件,即最优值已经找到。

4.适应度已经达到饱和,继续进化不会产生适应度更好的个体。

5.人为干预。

6.以及以上两种或更多种的组合。

7.本算法中使用进化次数来终止算法,得到解。

遗传算法基本步骤:

  • 52
    点赞
  • 398
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
遗传算法可以用来解决流水车间调度问题,也称为混合流水车间调度问题(Hybrid Flow Shop Scheduling Problem, HFSSP)。这个问题综合了经典流水车间和并行机两种调度的特点,具有很高的研究价值和应用背景。在遗传算法中,我们可以通过以下步骤来解决流水车间调度问题: 1. 编码:将流水车间调度问题转化为遗传算法可以处理的编码形式,例如使用二进制编码表示工件的排列顺序。 2. 初始化种群:随机生成一组初始解作为种群,每个个体代表一种调度方案。 3. 评估个体适应度:根据调度方案计算每个个体的适应度,可以使用目标函数来评估调度方案的好坏。 4. 选择:根据个体的适应度值,选择一部分个体作为父代,用于产生下一代的子代。 5. 交叉:对选出的父代个体进行交叉操作,生成新的子代个体。 6. 变异:对子代个体进行变异操作,引入一定的随机性,增加种群的多样性。 7. 重复步骤3至步骤6,直到达到停止条件(例如达到最大迭代次数或找到满意的解)。 通过以上步骤,遗传算法可以搜索到一个较优的调度方案,用于解决流水车间调度问题。具体的代码实现可以参考之前提到的干货文章中的示例代码。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)](https://blog.csdn.net/Rivalsx/article/details/91851559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [遗传算法解混合流水车间调度问题(注释很多)JavaScript](https://blog.csdn.net/weixin_49736959/article/details/108919486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sundial dreams

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

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

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

打赏作者

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

抵扣说明:

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

余额充值