流水车间调度算法分析的简单+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_3687_简单题_bitset

    BZOJ_3687_简单题_bitset Description 小呆开始研究集合论了,他提出了关于一个数集四个问题: 1.子集的异或和的算术和. 2.子集的异或和的异或和. 3.子集的算术和的算术和 ...

  2. 【毕业原版】-《巴斯大学毕业证书》Bath一模一样原件

    ☞巴斯大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&am ...

  3. 处理php出现default timezone抖动的问题

    懒癌发作1年多,再次回来写随笔.(上次是16年,再上次是13年,好像懒的没救了) 这回遇到一个系统前端展现的时间在无规律抖动的问题: 前端php环境是5.3,运行于apache上,php.ini中已经 ...

  4. TensorFlow TensorBoard使用

    摘要: 1.代码例子 2.主要功能内容: 1.代码例子 <TensorFlow实战>使用MLP处理Mnist数据集并TensorBoard上显示 2.主要功能 执行TensorBoard程 ...

  5. 作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?

    其实这个问题很简单,我用最简单的语言给大家描述一下,学习一样东西就要了解这样东西学完了要干什么事情,有什么作用.然后就是应该学习哪些必要的内容,该如何运用得当的方法进行有效率的学习不至于自己摸不着头脑 ...

  6. 基于ko-easyui实现的PC前端模板功能完善

    上一篇博客我向大家介绍了基于ko-easyui实现的开发模板,博客地址:https://www.cnblogs.com/cqhaibin/p/9825465.html#4095185.但在还遗留三个问 ...

  7. 很详细的Django入门详解

    Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T.在学 ...

  8. 10 年三线小城 IT 开发的感悟

    一贯都是写技术博客,从来没写过感悟类文章,因为文笔不好.今天看到了大飞的一篇文章,<技术人,请不要封闭自己>,真的感触太深了. 一 先说说我自己,我并非科班出身,大学毕业后一直没找到好的工 ...

  9. Redis - NoSQL数据库技术(一)

    NoSQL入门概述(一) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 什么是NoSQL NoSQL(NoSQL - Not Only SQL),意“不仅仅是SQL”: 泛指非关系 ...

  10. zookeeper源码 — 一、单机启动

    zookeeper一般使用命令工具启动,启动主要就是初始化所有组件,让server可以接收并处理来自client的请求.本文主要结构: main入口 配置解析 组件启动 main入口 我们一般使用命令 ...