流水车间调度算法分析的简单+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_3289_Mato的文件管理_莫队+树状数组

    BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...

  2. Twitter分布式自增ID算法snowflake原理解析

    以JAVA为例 Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特(0和1). 那么一个 ...

  3. C++实现离散数学的关系类,支持传递闭包运算

    #include <vector> #include <cassert> #include <iostream> using namespace std; clas ...

  4. 机器学习web服务化实战:一次吐血的服务化之路

    背景 在公司内部,我负责帮助研究院的小伙伴搭建机器学习web服务,研究院的小伙伴提供一个机器学习本地接口,我负责提供一个对外服务的HTTP接口. 说起人工智能和机器学习,python是最擅长的,其以开 ...

  5. 实时监听input输入框value的变化:

    HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件实时监听输入框value的变化 oninput 事件在用户输入时触发. 该事件在 <input&g ...

  6. SSRS报表服务随笔(rdl报表服务)-创建一个简单的报表

    这段时间一直在敲rdl报表,在国内的不这么留在,在国外的话,还是挺流行的,国内的话,这方面的资料很少很少,也踏过不少坑 先从SSRS了解起,SSRS全称 SQL Server Reporting Se ...

  7. 游戏AI之决策结构—有限状态机/行为树(2)

    目录 有限状态机 行为树 控制节点 条件节点 行为节点 装饰节点 总结 额外/细节/优化 游戏AI的决策部分是比较重要的部分,游戏程序的老前辈们留下了两种经过考验的用于AI决策的结构: 有限状态机 行 ...

  8. Android之OkHttp详解

    文章大纲 一.OkHttp简介二.OkHttp简单使用三.OkHttp封装四.项目源码下载   一.OkHttp简介 1. 什么是OkHttp   一般在Java平台上,我们会使用Apache Htt ...

  9. Docker 创建 Crucible4.6.1 以及与 Crowd3.3.2 实现 SSO 单点登录

    目录 目录 1.介绍 1.1.什么是 Crucible? 2.Crucible 的官网在哪里? 3.如何下载安装? 4.对 Crucible 进行配置 4.1.破解 Crucible 第一步 4.2. ...

  10. .NET下的使用ActiveMQ

    项目结构 ActiveMQRecive下Program.cs using Apache.NMS; using Apache.NMS.ActiveMQ; using Apache.NMS.Util; u ...