流水车间调度算法分析的简单+Leapms实践--混合整数规划的启发式建模
流水车间调度算法分析的简单+Leapms实践--混合整数规划的启发式建模
清华大学出版社出版的白丹宇教授著作《流水车间与开放车间调度算法渐近分析》采用渐近分析方法分析多个NP-难类启发调度算法的收敛性,学术性很强。
本帖用数学规划模型方法对比精确模型和启发模型之间的差异,从实践角度感觉启发算法的魅力。本帖的要点如下:
1。有人说数学规划模型是精确方法。其实广义地讲,数学规划模型也可以是启发算法,只要你对问题进行启发建模就行。
2。启发建模会牺牲求解精确性,但是对NP-难问题来说,由于对大规模问题的精确解很难获得,启发算法或启发建模是必须的。
3。当测试算法时,原始数据经常是随机生成的,最好能把数据的生成简洁地写进模型,那么测试就简单多了。
流水车间调度问题
假设有m个机器,n个工件,已知每个工件在不同机器上的加工时间,求如何排序工件在不同机器上的加工次序使得总完工时间最短(以此目标为例)。
流水车间调度的精确模型
设x[i][j] 为工件j 在机器i上的开始加工时间,设c为总完工时间,于是目标是:
min c
c肯定大于任何工件在任何机器上的完成时间:
c>=x[i][j]+T[i][j] | i=,..,m;j=,..,n
把工件 j 在机器 i 上的加工时间设置为T[i][j]。
对两个工件 j1,j2, j1$\neq$ j2,在同一台机器上的加工时间不可以冲突,即:
x[i][j2]>=x[i][j1]+T[i][j1] - M(-u[i][j1][j2])|i=,..,m;j1=,..,n;j2=,..,n;j1<j2
x[i][j1]>=x[i][j2]+T[i][j2] - M*u[i][j1][j2] | i=,..,m;j1=,..,n;j2=,..,n;j1<j2
对同一个工件j, 其在两台不同机器 i1,i2, i1 $\neq $ i2上加工的时间不能冲突,即:
x[i2][j]>=x[i1][j]+T[i1][j] - M(-v[i1][i2][j])| i1=,..,m;i2=,..,m;j=,..,n;i1<i2
x[i1][j]>=x[i2][j]+T[i2][j] - M*v[i1][i2][j] | i1=,..,m;i2=,..,m;j=,..,n;i1<i2
说明一下引入的常量和变量:
where
m,n are integers
M is a number
c is a variable of number
T[i][j] is a number|i=,..,m;j=,..,n
x[i][j] is a variable of nonnegative number|i=,..,m;j=,..,n
u[i][j1][j2] is a variable of binary|i=,..,m;j1=,..,n;j2=,..,n;j1<>j2
v[i1][i2][j] is a variable of binary|i1=,..,m;i2=,..,m;j=,..,n;i1<>i2
提供计算得来的数据,注意T[i][j]是用随机函数随机生成的0-100之间的数:
data_relation
T[i][j]=rand()|i=,...,m;j=,...,n
M=sum{i=,..,m;j=,..,n}T[i][j]
提供数据,这里设m=3使得问题NP-难,n=100规模足够大:
data
m=
n=
总体的模型:
//x[i][j] -- start time of job j on machine i
min c
subject to
c>=x[i][j]+T[i][j] | i=,..,m;j=,..,n
x[i][j2]>=x[i][j1]+T[i][j1] - M(-u[i][j1][j2])|i=,..,m;j1=,..,n;j2=,..,n;j1<j2
x[i][j1]>=x[i][j2]+T[i][j2] - M*u[i][j1][j2] | i=,..,m;j1=,..,n;j2=,..,n;j1<j2
x[i2][j]>=x[i1][j]+T[i1][j] - M(-v[i1][i2][j])| i1=,..,m;i2=,..,m;j=,..,n;i1<i2
x[i1][j]>=x[i2][j]+T[i2][j] - M*v[i1][i2][j] | i1=,..,m;i2=,..,m;j=,..,n;i1<i2
where
m,n are integers
M is a number
c is a variable of number
T[i][j] is a number|i=,..,m;j=,..,n
x[i][j] is a variable of nonnegative number|i=,..,m;j=,..,n
u[i][j1][j2] is a variable of binary|i=,..,m;j1=,..,n;j2=,..,n;j1<>j2
v[i1][i2][j] is a variable of binary|i1=,..,m;i2=,..,m;j=,..,n;i1<>i2
data_relation
T[i][j]=rand()|i=,...,m;j=,...,n
M=sum{i=,..,m;j=,..,n}T[i][j]
data
m=
n=
流水车间调度的启发模型
使用这个启发: 让在机器上加工时间较小的任务早些执行。即同一个机器上工件不冲突约束改变为:
x[i][j2]>=x[i][j1]+T[i][j1] |i=,..,m;j1=,..,n;j2=,..,n;j1<j2;T[i][j1]<T[i][j2]
x[i][j1]>=x[i][j2]+T[i][j2] | i=,..,m;j1=,..,n;j2=,..,n;j1<j2;T[i][j1]>=T[i][j2]
总体模型是:
//x[i][j] -- start time of job j on machine i
min c
subject to
c>=x[i][j]+T[i][j] | i=,..,m;j=,..,n
x[i][j2]>=x[i][j1]+T[i][j1] |i=,..,m;j1=,..,n;j2=,..,n;j1<j2;T[i][j1]<T[i][j2]
x[i][j1]>=x[i][j2]+T[i][j2] | i=,..,m;j1=,..,n;j2=,..,n;j1<j2;T[i][j1]>=T[i][j2]
x[i2][j]>=x[i1][j]+T[i1][j] - M(-v[i1][i2][j])| i1=,..,m;i2=,..,m;j=,..,n;i1<i2
x[i1][j]>=x[i2][j]+T[i2][j] - M*v[i1][i2][j] | i1=,..,m;i2=,..,m;j=,..,n;i1<i2
where
m,n are integers
M is a number
c is a variable of number
T[i][j] is a number|i=,..,m;j=,..,n
x[i][j] is a variable of nonnegative number|i=,..,m;j=,..,n
v[i1][i2][j] is a variable of binary|i1=,..,m;i2=,..,m;j=,..,n;i1<>i2
data_relation
T[i][j]=rand()|i=,...,m;j=,...,n
M=sum{i=,..,m;j=,..,n}T[i][j]
data
m=
n=
对比试算
将两个模型调入+Leapms环境中进行解析。
精确模型有3061个变量和30600个约束:
启发模型有901个变量,15750个约束:
两者不仅是变量和约束数字的差异,关键是模型结构上的差异。
在+Leapms中使用cplex命令呼叫 CPLEX求解:
精确模型在笔者能忍受的时间内求不到精确解,两分钟之后的最好解是5715, gap 96%,这样大的gap很难降下来。刚刚几乎死机,赶紧杀掉进程,保护本帖。
启发模型呼叫CPLEX后瞬间被求解,最优解4904。
关于渐进性的进一步实验统计得换m,n值慢慢算,有时间的再全面试下,该吃饭了,先下了。最后贴下两个模型的PDF摘录。
两个模型的PDF摘录:
流水车间调度算法分析的简单+Leapms实践--混合整数规划的启发式建模的更多相关文章
- 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)
00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...
- rt-thread的位图调度算法分析
转自:http://blog.csdn.net/prife/article/details/7077120 序言 期待读者 本文期待读者有C语言编程基础,后文中要分析代码,对其中的一些C语言中的简单语 ...
- 【转】rt-thread的位图调度算法分析
序言 期待读者 本文期待读者有C语言编程基础,后文中要分析代码,对其中的一些C语言中的简单语句不会介绍,但是并不要求读者有过多的C基础,比如指针和链表等不会要求太多,后面在分析代码时,会附带地介绍相关 ...
- Wolsey "强整数规划“ 建模的+Leapms实践——无产能批量问题
Wolsey "强整数规划“ 建模的+Leapms实践——无产能批量问题 <整数规划>[1]一书作者L. A. Wolsey对批量问题(Lot-sizing Problem)做了 ...
- htmlayout 最简单的实践,用于理解实现原理。
/ testHtmlayout.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "testHtmlayout.h&qu ...
- LVS的调度算法分析
LVS调度算法 一.静态调度算法 1. rr(round robin)轮询调度,即调度器将客户端的请求依次的传递给内部的服务器,从1到N,算法简洁,无须记录状态,但是不考虑每台服务器的性能. 配置如 ...
- RT-Thread的位图调度算法分析(最新版)
RT-Thread的内核调度算法 rt-thread的调度算法为基于优先级调度和基于时间片轮转调度共存的策略.rt-thread内核中存在多个线程优先级,并且支持多个线程具有同样的线程优先级.线程级别 ...
- Java调度框架Quartz简单示例
Quartz的大名如雷贯耳,这里就不赘述,而且本文也不作为深入探讨,只是看完Quartz的官方文档后,下个简单示例,至少证明曾经花了点时间学习过,以备不时之需. Quartz使用了SLF4J,所以至少 ...
- javascript简单计算器实践
参考部分资料,编写一个简单的计算器案例,虽然完成了正常需求,但是也有不满之处,待后续实力提升后再来补充,先把不足之处列出: 1:本来打算只要打开页面,计算器的输入框会显示一个默认为0的状态,但是在输入 ...
随机推荐
- 【状态表示】Bzoj1096 [SCOI2008] 着色方案
Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...
- 【爆料】-《伯明翰大学学院毕业证书》UCB一模一样原件
☞伯明翰大学学院毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归 ...
- Hive 查询元数据库获取某个分区的count数
=========查询分区的大小========= select d.NAME,t.TBL_NAME,p.PART_NAME,prm.PARAM_KEY,prm.PARAM_VALUE from TB ...
- springboot+redis分布式锁-模拟抢单
本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟抢单的场景来使用她:本篇不涉及到的redis环境搭建,快速搭建个人测试环境,这里建议使用docker:本篇内容节点如 ...
- 【Java进阶】并发编程
PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...
- Nginx 安装详细(一)
1. 老规矩,来点开场白:Nginx简单介绍 Nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:Nginx可以作为一个HTT ...
- 我眼中的 Nginx(四):是什么让你的 Nginx 服务退出这么慢?
张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...
- [PHP]日志处理error_log()函数和配置使用
1.error_log($message,$message_type,$destination,$extra_headers)函数, 2.message_type 是0,发送信息到php.ini配置的 ...
- jquery实现照片墙
jquery照片墙 由15张图片构成,大致思路:随机生成所有图片-->点击其中一张变为一张大图-->点击大图又变回多张 主要用到jquery实现 先来看看效果 html: <div ...
- 用css实现正方形div
目标:实现一个正方形,这个正方形边长等于 方法一:使用单位vw, (ps我觉得这个是最简单的方法) html结构也很简单,只有一个div即可 <html> <body> < ...