MATLAB实现禁忌搜索算法优化柔性车间调度fjsp

embedded/2024/10/18 8:29:01/

禁忌搜索算法的流程可以归纳为以下几个步骤:

  1. 初始化
    • 利用贪婪算法或其他局部搜索算法生成一个初始解。
    • 清空禁忌表。
    • 设置禁忌长度(即禁忌表中禁止操作的期限)。
  2. 邻域搜索产生候选解
    • 通过特定的搜索算子(如relocation、exchange、2-opt等)对当前解进行变换,产生一系列候选解。
    • 计算每个候选解的评价函数值(通常是目标函数值),以此衡量解的优劣。
  3. 选择最好的候选解
    • 从所有候选解中选出评价函数值最好的解。
    • 如果这个最好的候选解优于当前最好解,则无视其是否在禁忌表中,直接将其作为新的当前解,并更新历史最好解。
    • 如果最好的候选解并不优于当前最好解,则从非禁忌的候选解中选择最好的一个作为新的当前解。
    • 将导致当前解发生变化的操作加入到禁忌表中,避免在近期内重复这一操作。
  4. 判断终止条件
    • 检查是否满足算法终止的条件,如达到最大迭代次数、运行时间超过预设限制或解的质量在连续多次迭代中没有显著提升等。
    • 如果满足终止条件,则停止搜索并输出当前最好解;否则,返回步骤2继续搜索。
  5. 破禁准则与渴望水平
    • 在某些情况下,即使某个操作在禁忌表中,但如果该操作能导致一个非常好的解(满足渴望水平或破禁准则),那么这个操作也可以被执行,并更新当前解。
    • 渴望水平和破禁准则是为了保证搜索的多样性和全局寻优能力。
  6. 更新禁忌表
    • 随着迭代的进行,不断更新禁忌表,将最近执行的操作加入表中。
    • 经过一定的迭代次数后,早期加入禁忌表的操作会被解禁,重新成为可选的搜索方向。

柔性车间调度的模型如下:


1.目标函数:
柔性车间调度的目标函数通常包括多个方面,如最大完工时间最小、总完工时间最小、最大负荷的机器负荷最小等。这些目标可以根据实际需求进行选择或组合。一般采用最大完工时间最小:
f_1 = \min(C_{\max})
其中,C_{\max} 表示所有工件中的最晚完工时间。

其中,C_i 表示第i个工件的完工时间,n是工件的总数。

2.约束条件:
柔性车间调度的约束条件通常包括以下几点:

(1)同一台机器同一时刻只能加工一个工件。
(2)同一工件的同一道工序在同一时刻被加工的机器数是一。即,一个工序不能同时在多台机器上进行。
(3)任意工序开始加工后不能中断。这意味着一旦一个工序开始,就必须连续进行直到完成。
(4)各个工件之间不存在优先级的差别。除非特别指定,否则所有工件都被视为具有相同的优先级。
(5)同一工件的工序之间存在先后约束。即,一个工件的一个工序必须在它之前的工序完成后才能开始。
(6)所有工件在零时刻都可以被加工。这意味着没有工件在开始时就有延迟。
这些约束条件确保了调度方案的可行性和实际性。在实际应用中,可能还需要考虑其他特定的约束条件,如机器的可用性、工件的交货期等。

完整代码见:https://download.csdn.net/download/corn1949/89173140

算例数据如下:

初始加工明细表
工件号工序M1M2M3M4M5M6
11346-1-1-1
12-1-110-1-1-1
13-11298-15
14-17-123-1
21-111-167-1
22-18-1-1-16
23-1-1511-113
24788-1-1-1
31-1-13-1-1-1
32233-1-1-1
33-1-11045-1
3410-111-13-1
41-1-112-1-17
42899-112-1
43-1-12-1-1-1
44-1-1-11112-1
51-1-158-19
52-1-1-113128
53356-1-1-1
54-1-1-156-1
61579-1-1-1
62-1-1115-110
63-1-1-1439
64-1-1-1510-1

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]

>> 

 完整代码见:https://download.csdn.net/download/corn1949/89173140


http://www.ppmy.cn/embedded/4023.html

相关文章

Sonatype Nexus 服务器迁移

因为服务器的升级和调整,有时候会对安装 Sonatype Nexus 的服务器进行迁移到新服务器上。 从技术架构上来说,Sonatype Nexus 我们使用的是 AWS 的存储,所以我们并不需要拷贝大量的数据。 文件夹结构 在备份和恢复之前,我们需要…

分类网络总结

欢迎大家订阅我的专栏一起学习共同进步,主要针对25届应届毕业生 祝大家早日拿到offer! lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

.Net ajax 接收参数

后端部分代码 一般处理程序 public void ProcessRequest(HttpContext context){context.Response.ContentType "text/plain";string str_index context.Request.Form.AllKeys.Contains("index") ? context.Request.Form["index"].ToString(…

JavaScript 高性能编程 —— Data Access 数据访问

经典计算机科学的一个问题是确定数据应当存放在什么地方,以实现最佳的读写效率。数据存储在哪里, 关系到代码运行期间数据被检索到的速度。在 JavaScript 中,此问题相对简单,因为数据存储只有少量方 式可供选择。正如其他语言那样,数据存储位置关系到访问速度。 在 JavaS…

华为配置静态ARP示例

华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…

RabbitMQ - Spring boot 整合 RabbitMQ

一、RabbitMQ 1、RabbitMQ 使用场景 1.1、服务解耦 假设有这样一个场景, 服务A产生数据, 而服务B,C,D需要这些数据, 那么我们可以在A服务中直接调用B,C,D服务,把数据传递到下游服务即可 但是,随着我们的应用规模不断扩大,会有更多的服务需要A的数据,如果有几十甚至几百个下…

Webrtc 信令服务器实现

webrtc建联流程图 由上图可知,所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了,目前普遍的方式HTTP/HTTPS,WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS&…

Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云

一、前言 记录时间 [2024-4-13] 系列文章简摘: Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备 Docker 学习笔记(七)&#x…