生产调度:flowshop问题数学建模

接上一篇文章,在了解生产调度问题的背景和基本概念之后,我想先从比较基础的 flowshop和 jobshop 数学模型入手,理解实际调度过程中的问题求解思路。这一篇文章主要面向 flowshop 问题进行数学建模,对于这类比较经典的问题,其实已经有很多现成的模型和求解思路了。我也在网上进行了搜索,看到了3种模型形式,本篇文章将进行列举及描述。

问题描述

n 个工件在 m 台机器上进行流水加工,每个工件在机器上的加工顺序相同。并且每个工件在同一台机器上只加工一次,每台机器在某个时刻只能加工一个工件。各工件在各机器上的加工时间和准备时间已知,求某个调度方案使得调度目标最优。

模型形式1

来自chatgpt的回复。

变量:

·pij:作业 i 在机器 j 上的加工时间。
·决策变量xijk:0-1变量,表示作业 i 是否在时间段 k 被安排在机器 j 上。
·Ci:作业 i 的完工时间。
·Cmax:最大完工时间。

目标函数:

Minimize Cmax

约束条件:

1、每个作业在每台机器上只能被加工一次:
在这里插入图片描述
2、每台机器在任意时间只能加工一个作业:
在这里插入图片描述
3、确保作业 i 在机器 j 上的完工时间大于等于其在机器 j-1上的完工时间加上加工时间:
在这里插入图片描述
4、确保作业 i 在机器 j 上的完工时间大于等于其前一个作业在同一机器上的完工时间加上加工时间:
在这里插入图片描述
5、最小化最大完工时间:
在这里插入图片描述

模型形式2

来自阿里云开发者社区。

变量:

·xij:工件 i 比工件 j 先加工时取1;否则取0。
·pim:工件 i 需要在机器 m 上的加工时间。
·smi:工件 i 在机器 m 上开始加工的时间。
·Cmax:最大完工时间,即makespan。

目标函数:

min Cmax

约束条件:

1、工件 i 比工件 j 先加工,则工件 j 必然比工件 i 后加工。即xij=1时xji=0,反之亦然。
在这里插入图片描述
2、若工件 i 比工件 j 先加工,则在任何机器上工件 j 的开始时间都不早于工件 i 的结束时间(用 Z 表示某一“足够大”的正实数)。
在这里插入图片描述

3、工件在后一机器上的开始时间不得早于前一机器上的结束时间。
在这里插入图片描述

4、最大完工时间定义。
在这里插入图片描述

5、变量的取值范围。
在这里插入图片描述

完整表达如下:

在这里插入图片描述

模型形式3

来自“运筹优化与数据科学”公众号。

变量:

·Xji:表示工件 j 被安排在位置i。
·Srj:表示机器 r 上第 i 个工序的开始加工时间。
·Trj:表示机器 r 加工工件 j 需要的时间。

目标函数:

最小化所有工件在最后一台机器上的完工时间(其实我并没有理解这里的表达式,有待后续深入
在这里插入图片描述

约束条件:

1、一个工件位置只有一台机器。
在这里插入图片描述

2、一台机器上只能安排一个工件位置。
在这里插入图片描述

3、第一台机器第一个工件的开始时间为0。
在这里插入图片描述

4、在第一台机器上,一个工件的开始时间等于上一个工件的完成时间。
在这里插入图片描述

5、在第 r+1 台机器上,第一个工件开始的时间等于第 r 台机器第一个工件的完成时间。
在这里插入图片描述
6&7、机器上某个工件开始的时间为 max{当前机器上一个工件的完成时间,上一个机器当前工件的完成时间}。
在这里插入图片描述
8、决策变量为0-1变量,Xji=1表示工件 j 被安排在位置 i。
在这里插入图片描述

9、机器 r 上第 i 个工件的开始加工时间为非负值。
在这里插入图片描述

总结

通过梳理这3种模型形式,我发现第2种形式是更为简洁的。对于flowshop问题来说,工件加工的机器顺序已经确定,就是要求解一组工件的先后顺序,从决策变量定义上看模型形式2更切中要害、易于理解。

参考资料

[1] 面对Flow-shop调度问题如何优化?可用MindOpt来决策
[2] 利用Pyhton+Gurobi求解置换Flowshop问题入门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型基础

大语言基础 GPT : Improving Language Understanding by Generative Pre-Training 提出背景 从原始文本中有效学习的能力对于减轻自然语言处理中对监督学习的依赖至关重要。很多深度学习方法需要大量人工标注的数据,限制了它们在很多领域的应用,收集更…

【鸿蒙学习笔记】MVVM模式

官方文档:MVVM模式 [Q&A] 什么是MVVM ArkUI采取MVVM Model View ViewModel模式。 Model层:存储数据和相关逻辑的模型。View层:在ArkUI中通常是Component装饰组件渲染的UI。ViewModel层:在ArkUI中,ViewModel是…

【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

文章目录 0. 分代收集理论分代假说分代GC定义 1. 垃圾回收算法1.1 标记清除(Mark-Sweep)算法优点缺点 1.2 标记复制算法优点缺点为什么是8:1:1? 1.3 标记整理算法优点缺点 2. 是否移动? 0. 分代收集理论 分代假说 现在多数JVM G…

子数组按位与为k

注意这里的子数组是连续的非空的数组&#xff0c;我们要学会与处理就是求交集 class Solution { public:long long countSubarrays(vector<int>& nums, int k) {long long ans 0;for (int i 0; i < nums.size(); i) {int x nums[i];for (int j i - 1; j > …

MATLAB 2024b 更新了些什么?

MATLAB 2024b版本已经推出了预览版&#xff0c;本期介绍一些MATLAB部分的主要的更新内容。 帮助浏览器被移除 在此前的版本&#xff0c;当我们从MATLAB中访问帮助文档时&#xff0c;默认会通过MATLAB的帮助浏览器&#xff08;Help browser&#xff09;。 2024b版本开始&…

【Linux】压缩命令——gzip,bzip2,xz

1.压缩文件的用途与技术 你是否有过文件太大&#xff0c;导致无法以正常的E-mail方式发送&#xff1f;又或学校、厂商要求使用CD或DVD来做数据归档之用&#xff0c;但是你的单一文件却都比这些传统的一次性存储媒介还要大&#xff0c;那怎么分成多块来刻录&#xff1f;还有&am…

[搭建个人网站] 云服务器 or 本地环境搭建

别人没有的&#xff0c;你有&#xff0c;你就牛。 面试&#xff0c;吹牛皮的时候 都可以拉出来溜溜 本文介绍2种搭建网站模式方式&#xff1a;区别嘛&#xff08;花钱跟不花钱&#xff09; 花钱&#xff1a; 1. 先购买个域名。。&#xff08;这里就不多介绍了&#xff0c;随便…

昇思学习打卡-9-ResNet50图像分类

文章目录 网络介绍数据可视化部分网络实现Building Block结构BottleNet模块 模型训练推理结果可视化学习总结优点不足 网络介绍 在ResNet网络提出之前&#xff0c;传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的&#xff0c;但当网络堆叠到一定深度时&#xff0c;…

STM32崩溃问题排查

文章目录 前言1. 问题说明2. STM32&#xff08;Cortex M4内核&#xff09;的寄存器3. 崩溃问题分析3.1 崩溃信息的来源是哪里&#xff1f;3.2 崩溃信息中的每个关键字代表的含义3.3 利用崩溃信息去查找造成崩溃的点3.4 keil5中怎么根据地址找到问题点3.5 keil5上编译时怎么输出…

C++模板元编程(二)——完美转发

完美转发指的是函数模板可以将自己的参数“完美”地转发给内部调用的其它函数。所谓完美&#xff0c;即不仅能准确地转发参数的值&#xff0c;还能保证被转发参数的左、右值属性不变。 文章目录 场景旧的方法新的方法内部实现参考文献 场景 思考下面的代码&#xff1a; templ…

深度学习之网络构建

目标 选择合适的神经网络 卷积神经网络&#xff08;CNN&#xff09;&#xff1a;我们处理图片、视频一般选择CNN 循环神经网络&#xff08;RNN&#xff09;&#xff1a;我们处理时序数据一般选择RNN 超参数的设置 为什么训练的模型的错误率居高不下 如何调测出最优的超参数 …

【pytorch20】多分类问题

网络结构以及示例 该网络的输出不是一层或两层的&#xff0c;而是一个十层的代表有十分类 新建三个线性层&#xff0c;每个线性层都有w和b的tensor 首先输入维度是784&#xff0c;第一个维度是ch_out,第二个维度才是ch_in(由于后面要转置)&#xff0c;没有经过softmax函数和…

C++ 引用——引用的本质

本质&#xff1a;引用的本质在c内部实现是一个指针常量 C推荐用引用技术&#xff0c;因为语法方便&#xff0c;引用本质是指针常量&#xff0c;但是所有的指针操作编译器都帮我们做了 示例&#xff1a; 运行结果&#xff1a;

C++初学者指南-4.诊断---valgrind

C初学者指南-4.诊断—Valgrind Valgrind&#xff08;内存错误检测工具&#xff09; 检测常见运行时错误 读/写释放的内存或不正确的堆栈区域使用未初始化的值不正确的内存释放&#xff0c;如双重释放滥用内存分配函数内存泄漏–非故意的内存消耗通常与程序逻辑缺陷有关&#xf…

水箱高低水位浮球液位开关工作原理

工作原理 水箱高低水位浮球液位开关是一种利用浮球随液位升降来实现液位控制的设备。其基本原理是浮球在液体的浮力作用下上下浮动&#xff0c;通过磁性作用驱动与之相连的磁簧开关的开合&#xff0c;从而实现液位的高低控制和报警。当液位升高时&#xff0c;浮球上浮&#xf…

cmake find_package 使用笔记

目录 1 find_package2 config mode2.1 搜索的文件名2.2 搜索路径 3 module mode3.1 搜索的文件名3.2 搜索路径 参考 1 find_package 这是官方文档 下面是学习总结&#xff1a; 首先是find_package的作用是什么&#xff1f;引入预编译的库。 find_package有两种模式&#xff1a…

C语言 指针和数组——指针和二维数组之间的关系

目录 换个角度看二维数组 指向二维数组的行指针 按行指针访问二维数组元素 再换一个角度看二维数组 按列指针访问二维数组元素 二维数组作函数参数 指向二维数组的行指针作函数参数 指向二维数组的列指针作函数参数​编辑 用const保护你传给函数的数据 小结 换个角度看…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中&#xff0c;嵌入富文本编辑器时&#xff0c;可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候&#xff0c;场景稍微复杂点&#xff0c;比如一个输入页面除了要保存富文本编辑器的内容到后端&#xff0c;可能还有一些其他输入组件获取到的数据也一并…

Win10安装MongoDB(详细版)

文章目录 1、安装MongoDB Server1.1. 下载1.2. 安装 2、手动安装MongoDB Compass(GUI可视工具)2.1. 下载2.2.安装 3、测试连接3.1.MongoDB Compass 连接3.2.使用Navicat连接 1、安装MongoDB Server 1.1. 下载 官网下载地址 https://www.mongodb.com/try/download/community …

『大模型笔记』《Pytorch实用教程》(第二版)

『大模型笔记』《Pytorch实用教程》(第二版) 文章目录 一. 《Pytorch实用教程》(第二版)1.1 上篇1.2 中篇1.3 下篇1.4 本书亮点1.5 本书内容及结构二. 参考文献🖥️ 配套代码(开源免费):https://github.com/TingsongYu/PyTorch-Tutorial-2nd📚 在线阅读(开源免费)…