流水车间调度算法分析的简单+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的状态,但是在输入 ...
随机推荐
- SimpleDateFormat安全的时间格式化
SimpleDateFormat安全的时间格式化 想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和 ...
- Ordering犀利的比较器
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...
- BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图
BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4873 分析:我们发现分数正负 ...
- Hibernate-ORM:02.Hibernate增删改入门案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本笔者使用的是Idea+mysql+maven做Hibernate的博客,本篇及其以后都是如此! 首先写好思路 ...
- shell脚本中cd命令无效
对于一段包含cd 命令的shell脚本(test.sh): #!/bin/bash cd .. mkdir ./test 运行: sh ./test.sh 脚本运行时无法在上级目录建立test文件 此 ...
- 死链接检查工具:Xenu 使用教程
一.软件作用 Xenu 全称Xenu’s Link Sleuth,是一款英文软件,界面单一,功能简单,使用方法很容易掌握.虽然看起来简单,但Xenu却拥有强大的功能.Xenu可以对网站的内链进行详细的 ...
- Spark学习之数据读取与保存总结(二)
8.Hadoop输入输出格式 除了 Spark 封装的格式之外,也可以与任何 Hadoop 支持的格式交互.Spark 支持新旧两套Hadoop 文件 API,提供了很大的灵活性. 要使用新版的 Ha ...
- linux根目录下的各文件夹含义说明
在早期的 UNIX 系统中,各个厂家各自定义了自己的 UNIX 系统文件目录,比较混乱. Linux 面世不久后,对文件目录进行了标准化,于1994年对根文件目录做了统一的规范, 推出 FHS ( F ...
- es6学习笔记-class之继承
继承 上一篇学习了class的概念,在es5时,对象的继承有好几种,原型链继承,借用构造函数继承,组合继承,原型式继承,寄生式继承以及寄生组合式继承,都是按照函数的形式去集成的,现在class也有它的 ...
- SpringBoot系列——利用系统环境变量与配置文件的分支选择实现“智能部署”
前言 通过之前的博客:SpringBoot系列——jar包与war包的部署,我们已经知道了如果实现项目的简单部署,但项目部署的时候最烦的是什么?修改成发布环境对应的配置!数据库连接地址.Eureka注 ...