流水车间调度算法分析的简单+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实践--混合整数规划的启发式建模的更多相关文章

  1. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...

  2. rt-thread的位图调度算法分析

    转自:http://blog.csdn.net/prife/article/details/7077120 序言 期待读者 本文期待读者有C语言编程基础,后文中要分析代码,对其中的一些C语言中的简单语 ...

  3. 【转】rt-thread的位图调度算法分析

    序言 期待读者 本文期待读者有C语言编程基础,后文中要分析代码,对其中的一些C语言中的简单语句不会介绍,但是并不要求读者有过多的C基础,比如指针和链表等不会要求太多,后面在分析代码时,会附带地介绍相关 ...

  4. Wolsey "强整数规划“ 建模的+Leapms实践——无产能批量问题

    Wolsey "强整数规划“ 建模的+Leapms实践——无产能批量问题 <整数规划>[1]一书作者L. A. Wolsey对批量问题(Lot-sizing Problem)做了 ...

  5. htmlayout 最简单的实践,用于理解实现原理。

    / testHtmlayout.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "testHtmlayout.h&qu ...

  6. LVS的调度算法分析

    LVS调度算法 一.静态调度算法 1.  rr(round robin)轮询调度,即调度器将客户端的请求依次的传递给内部的服务器,从1到N,算法简洁,无须记录状态,但是不考虑每台服务器的性能. 配置如 ...

  7. RT-Thread的位图调度算法分析(最新版)

    RT-Thread的内核调度算法 rt-thread的调度算法为基于优先级调度和基于时间片轮转调度共存的策略.rt-thread内核中存在多个线程优先级,并且支持多个线程具有同样的线程优先级.线程级别 ...

  8. Java调度框架Quartz简单示例

    Quartz的大名如雷贯耳,这里就不赘述,而且本文也不作为深入探讨,只是看完Quartz的官方文档后,下个简单示例,至少证明曾经花了点时间学习过,以备不时之需. Quartz使用了SLF4J,所以至少 ...

  9. javascript简单计算器实践

    参考部分资料,编写一个简单的计算器案例,虽然完成了正常需求,但是也有不满之处,待后续实力提升后再来补充,先把不足之处列出: 1:本来打算只要打开页面,计算器的输入框会显示一个默认为0的状态,但是在输入 ...

随机推荐

  1. 【BZOJ 3754】: Tree之最小方差树

    题目链接: TP 题解: 都是骗子233,我还以为是什么神奇的算法. 由于边权的范围很小,最小生成树和最大生成树之间的总和差不会太大,所以可以枚举边权和,再直接根据方差建最小生成树,每次更新答案即可. ...

  2. bzoj 4129 Haruna’s Breakfast 树上莫队

    按照dfs序分块,莫队乱搞 再套个权值分块 #include<cstdio> #include<iostream> #include<cstring> #inclu ...

  3. centos7系统服务管理

    systemd是RH7系列操作系统开始启用新的系统和服务管理器.它被设计为与sysv init脚本向后兼容,并提供了一些功能,例如在引导时并行启动系统服务,按需激活守护程序或基于依赖关系的服务控制逻辑 ...

  4. XML错误信息Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-4.0.xsd). For more information, right click on the message in the Problems View ...

    错误信息:Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-4.0.x ...

  5. ajax 和jsonp 不是一码事

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  6. sum() 函数性能堪忧,列表降维有何良方?

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/mK1nav2vKykZaKw_TY-rtw Python 的内置函数 ...

  7. 七牛云免费对象存储,并绑定到cloudreve中

    之前开通了腾讯云的对象存储COS并使用中,不过之前主要将它当作云盘使用,这两天再做博客系统时发现也可以将它作为网站的图库,这样对网站的访问效率也会提高. 今天了解到七牛云有免费的对象存储可以使用,于是 ...

  8. TensorFlow从1到2(五)图片内容识别和自然语言语义识别

    Keras内置的预定义模型 上一节我们讲过了完整的保存模型及其训练完成的参数. Keras中使用这种方式,预置了多个著名的成熟神经网络模型.当然,这实际是Keras的功劳,并不适合算在TensorFl ...

  9. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...

  10. Nginx技术进阶详讲

    Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...