【RL】强化学习求解JSP(作业车间调度问题)

news2025/2/25 8:18:58

e9245ca9f28cb2a6e836ee36a88d9016.png

b54de2381b9550dd8e3e5c962237d18d.png

JSP(Job Shop Scheduling Problem)是一种经典的组合优化问题,它的目标是在一组机器上安排一组工件的加工顺序,使得完成所有工件所需的最短时间(Cmax)最小。JSP 是一个 NP-hard 问题,即没有已知的多项式时间的算法可以找到最优解,因此需要使用一些启发式或近似的方法来求解。

强化学习(Reinforcement Learning, RL)是一种模拟智能体与环境的交互过程的学习方法,它的基本思想是通过不断地尝试不同的动作,观察环境的反馈(奖励或惩罚),来更新智能体的策略(行为准则),从而逐渐提高智能体的性能(累积奖励),直到达到预设的目标。强化学习的优点是可以在不完全或不确定的环境中进行学习,不需要事先知道环境的模型,可以自适应地调整策略,缺点是需要大量的试错,可能陷入局部最优,需要设计合适的奖励函数,状态空间,动作空间等。

结合以上代码,强化学习求解 JSP 问题的流程如下:

  • 首先,定义强化学习的基本要素,如状态空间,动作空间,奖励函数,策略,值函数等。

    • 状态空间:表示智能体所处的环境的情况,可以用一个二维矩阵来表示,其中每个元素表示一个机器上的一个工件,每一行表示一个机器,每一列表示一个时间段,每个元素的值表示该工件的编号,如果该位置没有工件,则用 0 表示。例如,[[0, 0, 0, 0, 0], [1, 2, 0, 0, 0], [0, 0, 3, 4, 0]] 表示有三台机器,五个时间段,第一台机器没有工件,第二台机器有工件 1 和 2,第三台机器有工件 3 和 4。

    • 动作空间:表示智能体可以采取的行为的集合,可以用一个列表来表示,其中每个元素表示一个可行的动作,每个动作是一个元组,表示将一个工件从一个机器上移动到另一个机器上,例如,[(1, 2), (2, 3), (3, 1)] 表示可以将工件 1 从机器 2 移动到机器 1,将工件 2 从机器 3 移动到机器 2,将工件 3 从机器 1 移动到机器 3。

    • 奖励函数:表示智能体在每个状态下采取每个动作后,环境给予的反馈,可以用一个函数来表示,输入是一个状态和一个动作,输出是一个数值,表示奖励或惩罚的大小,例如,reward(s, a) = -Cmax(s, a) 表示奖励函数的值是负的 Cmax 值,即完成所有工件所需的最短时间,这样可以让智能体倾向于选择能够减少 Cmax 值的动作。

    • 策略:表示智能体在每个状态下选择每个动作的概率分布,可以用一个函数来表示,输入是一个状态和一个动作,输出是一个数值,表示选择该动作的概率,例如,policy(s, a) = softmax(Q(s, a)) 表示策略函数的值是 Q 函数的 softmax 归一化,即根据 Q 函数的值来分配概率,Q 函数的值越大,概率越高。

    • 值函数:表示智能体在每个状态下或者在每个状态下采取每个动作后,能够获得的期望累积奖励,可以用一个函数来表示,输入是一个状态或者一个状态和一个动作,输出是一个数值,表示期望累积奖励的大小,例如,V(s) = max_a Q(s, a) 表示值函数的值是 Q 函数的最大值,即在当前状态下,选择能够获得最大 Q 值的动作后,能够获得的期望累积奖励,Q(s, a) = r(s, a) + gamma * V(s') 表示 Q 函数的值是当前奖励加上折扣后的下一个状态的值函数的值,即在当前状态下,采取当前动作后,能够获得的期望累积奖励,其中 gamma 是一个常数,表示折扣因子,s' 是下一个状态。

  • 然后,初始化强化学习的参数,如初始状态,初始策略,初始值函数,学习率,折扣因子,探索率,终止条件等。

    • 初始状态:表示智能体开始时所处的环境的情况,可以用一个二维矩阵来表示,其中每个元素表示一个机器上的一个工件,每一行表示一个机器,每一列表示一个时间段,每个元素的值表示该工件的编号,如果该位置没有工件,则用 0 表示。例如,[[0, 0, 0, 0, 0], [1, 2, 0, 0, 0], [0, 0, 3, 4, 0]] 表示有三台机器,五个时间段,第一台机器没有工件,第二台机器有工件 1 和 2,第三台机器有工件 3 和 4。

    • 初始策略:表示智能体开始时在每个状态下选择每个动作的概率分布,可以用一个函数来表示,输入是一个状态和一个动作,输出是一个数值,表示选择该动作的概率,例如,policy(s, a) = 1 / len(A(s)) 表示初始策略是均匀分布,即在每个状态下,选择每个动作的概率都相等,其中 A(s) 表示在状态 s 下可行的动作集合。

    • 初始值函数:表示智能体开始时在每个状态下或者在每个状态下采取每个动作后,能够获得的期望累积奖励,可以用一个函数来表示,输入是一个状态或者一个状态和一个动作,输出是一个数值,表示期望累积奖励的大小,例如,V(s) = 0 表示初始值函数都为 0,即在每个状态下,能够获得的期望累积奖励都为 0,Q(s, a) = 0 表示初始 Q 函数都为 0,即在每个状态下,采取每个动作后,能够获得的期望累积奖励都为 0。

    • 学习率:表示智能体在更新值函数时,对新的信息的重视程度,可以用一个常数或者一个函数来表示,输入是一个状态或者一个状态和一个动作,输出是一个数值,表示学习率的大小,例如,alpha = 0.1 表示学习率是一个固定的常数,alpha(s, a) = 1 / N(s, a) 表示学习率是一个递减的函数,其中 N(s, a) 表示在状态 s 下采取动作 a 的次数,这样可以让智能体在初期更加探索,后期更加利用。

    • 折扣因子:表示智能体在计算累积奖励时,对未来的奖励的重视程度,可以用一个常数来表示,输入是一个状态或者一个状态和一个动作,输出是一个数值,表示折扣因子的大小,例如,gamma = 0.9 表示折扣因子是一个接近于 1 的常数,这样可以让智能体更加关注长期的收益,而不是短期的收益。

    • 探索率:表示智能体在选择动作时,以一定的概率随机选择一个动作,而不是根据策略选择一个动作,可以用一个常数或者一个函数来表示,输入是一个状态或者一个状态和一个动作,输出是一个数值,表示探索率的大小,例如,epsilon = 0.1 表示探索率是一个固定的常数,epsilon(s, a) = 1 / t 表示探索率是一个递减的函数,其中 t 表示当前的迭代次数,这样可以让智能体在初期更加探索,后期更加利用。

    • 终止条件:表示智能体在何时停止学习的判断标准,可以用一个布尔值或者一个函数来表示,输入是一个状态或者一个状态和一个动作,输出是一个布尔值,表示是否终止学习,例如,terminate = False 表示终止条件是一个固定的布尔值,terminate(s, a) = (Cmax(s, a) < threshold) 表示终止条件是一个函数,其中 threshold 是一个常数,表示 Cmax 值的阈值,如果在当前状态下,采取当前动作后,Cmax 值小于阈值,就终止学习,这样可以让智能体在达到一定的性能后,停止学习。

  • 然后,开始强化学习的过程,即智能体与环境的交互过程,可以用一个循环来表示,当终止条件为 False 时,继续循环。

    • 在循环中,首先根据当前状态和策略,选择一个动作,可以用一个函数来表示,输入是一个状态,输出是一个动作,例如,choose_action(s) = argmax_a policy(s, a) 表示选择一个能够使策略函数值最大的动作,即最有可能被选择的动作,或者 choose_action(s) = random.choice(A(s)) if random.random() < epsilon else argmax_a policy(s, a) 表示以一定的概率随机选择一个动作,否则选择一个能够使策略函数值最大的动作,即以探索率的概率探索,否则利用。

    • 然后,根据当前状态和选择的动作,执行该动作,观察环境的变化,得到下一个状态和奖励,可以用一个函数来表示,输入是一个状态和一个动作,输出是一个状态和一个数值,表示下一个状态和奖励,例如,take_action(s, a) = (s', r(s, a)) 表示执行动作 a 后,得到下一个状态 s' 和奖励 r(s, a)。

    • 然后,根据当前状态,选择的动作,下一个状态,和奖励,更新值函数,可以用一个函数来表示,输入是一个状态,一个动作,一个状态,和一个数值,输出是一个数值,表示更新后的值函数的值,例如,update_V(s, a, s', r) = V(s) + alpha * (r + gamma * V(s') - V(s)) 表示根据贝尔曼方程,用学习率,折扣因子,当前奖励,和下一个状态的值函数的值,来更新当前状态的值函数的值,update_Q(s, a, s', r) = Q(s, a) + alpha * (r + gamma * max_a' Q(s', a') - Q(s, a)) 表示根据贝尔曼方程,用学习率,折扣因子,当前奖励,和下一个状态的最大 Q 值,来更新当前状态和动作的 Q 值。

    • 然后,根据当前状态,选择的动作,下一个状态,和奖励,更新策略,可以用一个函数来表示,输入是一个状态,一个动作,一个状态,和一个数值,输出是一个数值,表示更新后的策略函数的值,例如,update_policy(s, a, s', r) = policy(s, a) + beta * (Q(s, a) - policy(s, a)) 表示用一个常数 beta 和 Q 函数的值,来更新策略函数的值,使其更接近于 Q 函数的值,或者 update_policy(s, a, s', r) = softmax(Q(s, a)) 表示用 softmax 函数,来更新策略函数的值,使其符合概率分布的要求。

    • 最后,将当前状态更新为下一个状态,继续循环,直到终止条件为 True,结束强化学习的过程。

RL求解JSP示例代码笔记

856222aa2ea992069997d793d24e5b50.png

示例代码思维导图

f10325f209f84c64a3c21c92d43026d8.png

机器调度情况(迭代20次),纵轴-设备号, 横轴-作业工序,

最佳完工时间1442

deec07a72d420fb6a0065b057b6c8da3.png

机器调度情况(迭代200次),最佳完工时间1405

……

关于优先级经验回放区:

8442a34ac0ada0199647df979e642289.jpeg

结 语

    强化学习算法变体很多,后面得深入学习。示例代码为作业车间调度问题提供了基于强化学习的解决框架,包括了环境的初始化、智能代理的决策过程、学习和评估机制以及结果的保存与可视化。对于一些代码的理解还不够透彻需要日后继续学习研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度解析Sora的核心技术

Sora要解决的核心问题 Sora面临的挑战是将不同类型的视觉信息&#xff0c;如视频、文本、图像和声音等&#xff0c;整合为一种共同的表征形式。这种转换是实现统一训练过程的关键&#xff0c;旨在将各类数据集中到一个训练框架中&#xff0c;以便于进行大规模的统一学习。简而…

机器学习 深度学习资料 资源machine learning

Kaggle入门&#xff0c;看这一篇就够了 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/25686876 day1-1.什么是机器学习_哔哩哔哩_bilibiliday1-1.什么是机器学习是10天学会机器学习从入门到深度学习的第1集视频&#xff0c;该合集共计62集&#xff0c;视频收藏或关注UP主&a…

3.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-游戏启动流程的分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目搭建 首先下图红框里是游戏启动的程序 游戏启动之后的名字&#xff08;fxgame.exe&#xff09; 一般游戏启动的架构&#xff1a; 第一种&#xff1a;登录器程序启动游戏主程序&#xff0c;然后游…

【快速搞定Webpack5】基本配置及开发模式介绍(二)

在开始使用webpack之前么&#xff0c;我们需要对Webpack的配置有一定的认识。 一、5大核心概念 1. enty&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2. output&#xff08;输出&#xff09; 指示webpack打包完的文件输出到哪里去&#xff0c;如何命名等 …

说一下 JVM 有哪些垃圾回收算法?

一、标记-清除算法 标记无用对象&#xff0c;然后进行清除回收。 标记-清除算法&#xff08;Mark-Sweep&#xff09;是一种常见的基础垃圾收集算法&#xff0c;它将垃圾收集分为两个阶段&#xff1a; 标记阶段&#xff1a;标记出可以回收的对象。清除阶段&#xff1a;回收被标…

【C++】C++11下线程库

C11下线程库 1. thread类的简单介绍2.线程函数参数3.原子性操作库(atomic)4.mutex的种类5. RAII风格加锁解锁5.1Lock_guard5.2unique_lock 6.condition_variable 1. thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如wi…

Nginx服务介绍与部署配置

目录 一、Nginx相关介绍 1. 概述 2. 优缺点 3. 零拷贝技术 4. I/O模型相关概念 5. 网络I/O模型 5.1 阻塞型I/O模型 5.2 非阻塞型I/O模型 5.3 多路复用I/O型 5.4 信号驱动式I/O模型 5.5 异步I/O模型 6. 事件驱动模型 7. Nginx与Apache区别 二、Nginx部署和使用 1…

网贷大数据查询多了对征信有影响吗?

网贷大数据在日常的金融借贷中起到很重要的风控作用&#xff0c;不少银行已经将大数据检测作为重要的风控环节。很多人在申贷之前都会提前了解自己的大数据信用情况&#xff0c;那网贷大数据查询多了对征信有影响吗?本文带你一起去看看。 首先要说结论&#xff1a;那就是查询网…

ubuntu 22.04 图文安装

ubuntu 22.04.3 live server图文安装 一、在Vmware里安装ubuntu 22.04.3 live server操作系统 选择第一个选项开始安装 选择English语言 选择中间选项不更新安装&#xff0c;这是因为后续通过更换源之后再更新会比较快 键盘设计继续选择英文&#xff0c;可以通过语言选择…

单链表(上)

1. 链表的概念 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 链表的结构也可以想像为一列火车&#xff0c;每节车厢都是一个成员&#xff0c;它们互补影响&#xff0c;但又通过一个装…

时间获取、文件属性获取 2月20日学习笔记

执行两次代码&#xff0c;打印出两次执行过程中新增的文件及删除的文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <dirent.h>#def…

Redis篇----第十一篇

系列文章目录 文章目录 系列文章目录前言一、Redis 如何做内存优化?二、Redis 回收进程如何工作的?三、都有哪些办法可以降低 Redis 的内存使用情况呢?四、Redis 的内存用完了会发生什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

LabVIEW风力机智能叶片控制系统

​LabVIEW风力机智能叶片控制系统 介绍了一种风力机智能叶片控制系统的开发。通过利用LabVIEW软件与CDS技术&#xff0c;该系统能够实时监测并调整风力机叶片的角度&#xff0c;优化风能转换效率。此项技术不仅提高了风力发电的稳定性和效率&#xff0c;而且为风力机的智能化管…

Pandas时间序列数据补全

一、问题 时间序列数据缺失&#xff0c;将其补全。 如下图所示&#xff0c;数据存在缺失秒级的情况 二、方法 1、需要将时间戳字段设置成 df 的索引 2、使用df.resample()方法 (1)上采样&#xff08;将上一条数据作为当前缺失数据&#xff09; resample()中的参数&#x…

内核移植学习

内核移植 内核移植就是指将RT-Thread内核在不同的芯片架构、不同的板卡上运行起来。 移植可分为CPU架构移植和BSP板级支持包移植两部分。 CPU架构移植 在嵌入式领域有多种不同CPU架构&#xff0c;例如Cortex-M、ARM920T、MIPS32、RISC-V等等。 为了使RT-Thread能够在不同C…

【软件架构】01-架构的概述

1、定义 软件架构就是软件的顶层结构 RUP&#xff08;统一过程开发&#xff09;4 1 视图 1&#xff09;逻辑视图&#xff1a; 描述系统的功能、组件和它们之间的关系。它主要关注系统的静态结构&#xff0c;包括类、接口、包、模块等&#xff0c;并用于表示系统的组织结构…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter&#xff1a;抽象类&#xff0c;实际开发中继承这个类并且重写相关方法&#xff0c;用得最多的一个Adapter&#xff01; ArrayAdapter&#xff1a;支持泛型…

Gradle统一管理依赖

背景 随着项目越来越大&#xff0c;module 越来越多&#xff0c;依赖的库也越来越多&#xff0c;依赖管理也越来越混乱。 我们一般会有以下需求&#xff1a; 1. 项目依赖统一管理&#xff0c;在单独文件中配置 2. 不同 Module 中的依赖版本号统一 管理 Gradle 依赖 说明&a…

Vue3学习——标签的ref属性

在HTML标签上&#xff0c;可以使用相同的ref名称&#xff0c;得到DOM元素ref放在组件上时&#xff0c;拿到的是组件实例&#xff08;组件defineExpose暴露谁&#xff0c;ref才可以看到谁&#xff09; <script setup lang"ts"> import RefPractice from /compo…

C++/C函数指针及函数指针数组

文章目录 什么是函数指针函数指针的使用为什么要使用函数指针&#xff1f;回调函数函数指针数组及使用阅读两段有趣的代码指向成员函数的指针&#xff08;C特有&#xff09; 什么是函数指针 首先它是一个指针&#xff0c;一个指向函数的指针&#xff0c;在内存空间中存放的是函…