禁忌搜索算法的流程可以归纳为以下几个步骤:
- 初始化:
- 利用贪婪算法或其他局部搜索算法生成一个初始解。
- 清空禁忌表。
- 设置禁忌长度(即禁忌表中禁止操作的期限)。
- 邻域搜索产生候选解:
- 通过特定的搜索算子(如relocation、exchange、2-opt等)对当前解进行变换,产生一系列候选解。
- 计算每个候选解的评价函数值(通常是目标函数值),以此衡量解的优劣。
- 选择最好的候选解:
- 从所有候选解中选出评价函数值最好的解。
- 如果这个最好的候选解优于当前最好解,则无视其是否在禁忌表中,直接将其作为新的当前解,并更新历史最好解。
- 如果最好的候选解并不优于当前最好解,则从非禁忌的候选解中选择最好的一个作为新的当前解。
- 将导致当前解发生变化的操作加入到禁忌表中,避免在近期内重复这一操作。
- 判断终止条件:
- 检查是否满足算法终止的条件,如达到最大迭代次数、运行时间超过预设限制或解的质量在连续多次迭代中没有显著提升等。
- 如果满足终止条件,则停止搜索并输出当前最好解;否则,返回步骤2继续搜索。
- 破禁准则与渴望水平:
- 在某些情况下,即使某个操作在禁忌表中,但如果该操作能导致一个非常好的解(满足渴望水平或破禁准则),那么这个操作也可以被执行,并更新当前解。
- 渴望水平和破禁准则是为了保证搜索的多样性和全局寻优能力。
- 更新禁忌表:
- 随着迭代的进行,不断更新禁忌表,将最近执行的操作加入表中。
- 经过一定的迭代次数后,早期加入禁忌表的操作会被解禁,重新成为可选的搜索方向。
柔性车间调度的模型如下:
1.目标函数:
柔性车间调度的目标函数通常包括多个方面,如最大完工时间最小、总完工时间最小、最大负荷的机器负荷最小等。这些目标可以根据实际需求进行选择或组合。一般采用最大完工时间最小:
其中, 表示所有工件中的最晚完工时间。
其中, 表示第i个工件的完工时间,n是工件的总数。
2.约束条件:
柔性车间调度的约束条件通常包括以下几点:
(1)同一台机器同一时刻只能加工一个工件。
(2)同一工件的同一道工序在同一时刻被加工的机器数是一。即,一个工序不能同时在多台机器上进行。
(3)任意工序开始加工后不能中断。这意味着一旦一个工序开始,就必须连续进行直到完成。
(4)各个工件之间不存在优先级的差别。除非特别指定,否则所有工件都被视为具有相同的优先级。
(5)同一工件的工序之间存在先后约束。即,一个工件的一个工序必须在它之前的工序完成后才能开始。
(6)所有工件在零时刻都可以被加工。这意味着没有工件在开始时就有延迟。
这些约束条件确保了调度方案的可行性和实际性。在实际应用中,可能还需要考虑其他特定的约束条件,如机器的可用性、工件的交货期等。
完整代码见:https://download.csdn.net/download/corn1949/89173140
算例数据如下:
MATLAB主程序如下:
程序结果如下:
禁忌搜索优化得到的最优目标函数值
bestvalue =
35
禁忌搜索优化得到的最优编码
bestChrom =
1 至 28 列
12 20 5 2 24 13 7 15 19 8 17 10 22 16 6 11 3 4 21 23 9 14 18 1 2 1 4 3
29 至 48 列
2 1 3 1 1 3 2 3 2 1 1 1 1 2 2 2 1 2 1 1
G =
3 1 3 0 3
5 1 3 3 8
2 1 4 0 6
1 1 2 0 4
6 1 1 0 5
4 1 6 0 7
2 2 2 6 14
4 2 1 7 15
5 2 5 8 20
2 3 6 14 27
5 3 2 20 25
3 2 3 8 11
6 2 4 6 11
4 3 3 15 17
2 4 1 27 34
3 3 4 11 15
1 2 3 17 27
1 3 6 27 32
6 3 4 15 19
6 4 4 19 24
3 4 5 20 23
4 4 4 24 35
5 4 5 25 31
1 4 5 32 35
outcell =
'零件号' '工序号' '机器号' '开始时间' '结束时间'
[ 1] [ 1] [ 2] [ 0] [ 4]
[ 1] [ 2] [ 3] [ 17] [ 27]
[ 1] [ 3] [ 6] [ 27] [ 32]
[ 1] [ 4] [ 5] [ 32] [ 35]
[ 2] [ 1] [ 4] [ 0] [ 6]
[ 2] [ 2] [ 2] [ 6] [ 14]
[ 2] [ 3] [ 6] [ 14] [ 27]
[ 2] [ 4] [ 1] [ 27] [ 34]
[ 3] [ 1] [ 3] [ 0] [ 3]
[ 3] [ 2] [ 3] [ 8] [ 11]
[ 3] [ 3] [ 4] [ 11] [ 15]
[ 3] [ 4] [ 5] [ 20] [ 23]
[ 4] [ 1] [ 6] [ 0] [ 7]
[ 4] [ 2] [ 1] [ 7] [ 15]
[ 4] [ 3] [ 3] [ 15] [ 17]
[ 4] [ 4] [ 4] [ 24] [ 35]
[ 5] [ 1] [ 3] [ 3] [ 8]
[ 5] [ 2] [ 5] [ 8] [ 20]
[ 5] [ 3] [ 2] [ 20] [ 25]
[ 5] [ 4] [ 5] [ 25] [ 31]
[ 6] [ 1] [ 1] [ 0] [ 5]
[ 6] [ 2] [ 4] [ 6] [ 11]
[ 6] [ 3] [ 4] [ 15] [ 19]
[ 6] [ 4] [ 4] [ 19] [ 24]
>>