我的上一篇博客Cplex解决FSP问题 - 加油,陌生人! - 博客园 (cnblogs.com)用Cplex完成了FSP的建模,这篇文章主要是解决JSP问题(车间调度问题)。

JSP问题:n个工件,m台机器,每个工件都有自己的加工路线,要求找出最佳的加工顺序,使得完工时间最小。从问题的描述来看,FSP是一种特殊的JSP,因为它所有工件的加工路线都是相同的。

下面就来考虑如何解决JSP问题。

先附上数据文件(.dat),如下

数据文件.dat

n=4;//工件数量
m=3;//机器数量
p=[[20,87,31],
[25,32,24],
[72,23,28],
[86,76,97]];//各工件在各机器上的加工时间
/*prec=[[1,3,2],
[3,1,2],
[3,2,1],
[2,3,1]];*/
temp=[ [[0,0,0,0],//表示加工顺序
[0,0,0,1],
[0,0,0,0],
[0,0,1,0]],
[[0,0,0,0],
[0,0,1,0],
[0,0,0,0],
[0,1,0,0]],
[[0,0,0,0],
[0,0,0,0],
[0,1,0,0],
[0,0,1,0]],
[[0,0,0,0],
[0,0,0,0],
[0,0,0,1],
[0,1,0,0]] ];

p表示各工件在各机器上的加工时间,例如工件1在机器1上的加工时间为20。temp用来表示每个工件的加工工艺,是个三维矩阵,里面包含了n个(m+1)*(m+1)的二维矩阵。例如在第一个二维矩阵arr中

可以看到arr[1][3]=1,表示机器1-->机器3;arr[3][2]=1,表示机器3-->2。于是工件1的加工顺序为m1-->m3-->m2,其他的工件也是类似的原理。

模型文件.mod

int n=...;//工件数量
int m=...;//机器数量,也可以理解为工序数量,因为一道工序只有一台机器
int M=100000;//一个非常大的数
range r1=1..n;
range r2=1..m;
int temp[r1][0..m][0..m]=...; dvar float+ c[r1][r2];//表示完工时间
int p[r1][r2]=...; dvar boolean a[r1][0..m][0..m];//i,h,k.机器h优先于机器k加工工件i
dvar boolean x[0..n][0..n][r2];//i,j,k.工件i优先于工件j在机器k上加工 minimize max(i in r1,k in r2) c[i][k];//机器i在机器k上的完工时间 subject to{
forall(i in r1,h in r2,k in r2)
c[i][k]-p[i][k]+M*(1-a[i][h][k])>=c[i][h];//机器h优先于机器k加工工件i
forall(i in r1,j in r1,k in r2)
c[j][k]-c[i][k]+M*(1-x[i][j][k])>=p[i][k];//工件i优先于工件j在机器k上加工
forall(j in r1,k in r2)
//对于任意一台机器上的工件j,必然有一个紧前作业i
sum(i in 0..n) x[i][j][k]==1;
forall(i in r1,k in r2)
//对于任意一台机器上的工件i,必然有一个紧后作业j
sum(j in 0..n) x[i][j][k]==1;
forall(k in r2)
//对于每台机器来说,只能由一个作业位于最后
sum(i in 0..n) x[i][0][k]<=1;
forall(k in r2)
//对于每台机器来说,只能有一个作业首先加工
sum(j in 0..n) x[0][j][k]<=1;
/*************************/
forall(i in r1,k in r2)
//对于任意一个工件,必然有一个紧前工序
sum(h in 0..m) a[i][h][k]==1;
forall(i in r1,h in r2)
//对于任意一个工件,必然有一个紧后工序
sum(k in 0..m) a[i][h][k]==1;
forall(i in r1)
//对于每个工件来说,只能有一个工序处于第一位
sum(k in 0..m) a[i][0][k]<=1;
forall(i in r1)
//对于每个工件来说,只能有一个工序处于最后一位
sum(h in 0..m) a[i][h][0]<=1;
/************************/
forall(i in r1)
sum(h in 0..m,k in 0..m) temp[i][h][k]*a[i][h][k]==2;
}
execute{
writeln("每台机器上工件加工的顺序:");
for(var k in r2){
for(var i in r1){
for(var j in r1){
if(x[i][j][k]==1){
writeln(k+":"+i+"-->"+j);
}
}
}
}
writeln("每个工件的加工顺序:")
for(var i in r1){
for(var h in r2){
for(var k in r2){
if(a[i][h][k]==1){
writeln(i+":"+h+"-->"+k);
}
}
}
}
}

结果:

// solution (optimal) with objective 220
// Quality Incumbent solution:
// MILP objective 2.2000000000e+002
// MILP solution norm |x| (Total, Max) 2.58900e+003 2.20000e+002
// MILP solution error (Ax=b) (Total, Max) 0.00000e+000 0.00000e+000
// MILP x bound error (Total, Max) 0.00000e+000 0.00000e+000
// MILP x integrality error (Total, Max) 0.00000e+000 0.00000e+000
// MILP slack bound error (Total, Max) 0.00000e+000 0.00000e+000
// c = [[0
118 31]
[87 220 62]
[148 76 0]
[220 0 97]];
a = [[[0 1 0 0]
[0 0 0 1]
[1 0 0 0]
[0 0 1 0]]
[[0 0 0 1]
[0 0 1 0]
[1 0 0 0]
[0 1 0 0]]
[[0 0 0 1]
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]
[[0 0 1 0]
[1 0 0 0]
[0 0 0 1]
[0 1 0 0]]];
x = [[[0 0 0]
[1 0 0]
[0 0 0]
[0 0 1]
[0 1 0]]
[[0 0 0]
[0 0 0]
[1 1 1]
[0 0 0]
[0 0 0]]
[[0 1 0]
[0 0 0]
[0 0 0]
[1 0 0]
[0 0 1]]
[[0 0 0]
[0 1 1]
[0 0 0]
[0 0 0]
[1 0 0]]
[[1 0 1]
[0 0 0]
[0 0 0]
[0 1 0]
[0 0 0]]];
/*----------------脚本信息---------------*/

// solution (optimal) with objective 220
每台机器上工件加工的顺序:
1:1-->2
1:2-->3
1:3-->4
2:1-->2
2:3-->1
2:4-->3
3:1-->2
3:2-->4
3:3-->1
每个工件的加工顺序:
1:1-->3
1:3-->2
2:1-->2
2:3-->1
3:2-->1
3:3-->2
4:2-->3
4:3-->1

Cplex解决JSP问题的更多相关文章

  1. 【转】解决jsp参数传递乱码的问题

    解决jsp参数传递乱码的问题 计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语.他跟我们一样,不管外语掌握到什么程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题. ...

  2. 解决JSP 不解析EL表达式

    解决JSP 不解析EL表达式,jsp在使用EL表达式的时候发现它不被解析,而是直接以字符串的形式显示了出来,经过查阅资料和实践,终于得知了原因并找到了解决方案 原因是:在默认情况下,Servlet 2 ...

  3. jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题

    jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...

  4. 怎么解决JSP中出现乱码的问题

    首先我们先了解一下问题的原因.一般情况在在每个JSP页的头部都有这样一条语句: 这条语句决定了此页面使用GB2312编码形式,而在数据库中一般用的是iso-8859-1字符集存储数据. 而Java程序 ...

  5. 使用过滤器解决JSP页面的乱码问题

    乱码详情  总结:讨论了使用GET和POST方法,控制台和JSP页面显示的问题. 最终发现:在servlet或者过滤器中添加:request.setCharacterEncoding("ut ...

  6. eclips中maven解决jsp报错的问题

    加入如下的pom依赖: <!-- 解决jsp报错的依赖包第一个 --> <dependency> <groupId>javax.servlet</groupI ...

  7. tomcat7解决jsp参数传递的中文乱码问题

    解决jsp参数传递的中文乱码问题 制作人:全心全意 在jsp页面中,通过参数传递传递中文时,在显示参数值时中文内容变成了乱码.这是因为请求参数的文字编码方式与页面中的不一致造成的,所有的request ...

  8. 解决JSP调用JavaBean出现乱码问题

    解决JSP调用JavaBean出现乱码问题 话不多说放代码 144 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style D ...

  9. 解决JSP页面获取的数据库数据乱码问题

    将java项目部署到服务器,页面数据乱码: 解决:首先查看了数据库编码和jsp编码都是utf-8,说明jsp和数据库没问题,于是查看了tomcat设置的编码 没有设置编码,于是加了URIEncodin ...

  10. java servlet之过滤器1(解决jsp之间POST方式数据传递乱码)

    首先,看看没有解决乱码的效果,新建两个jsp页面(a.jsp跳转到b.jsp). <form action="b.jsp" method="post"&g ...

随机推荐

  1. 权昌TSC244条码打印机如何加载数据实现大批量打印呢?

    我公司的TSC TTP-244条码打印机,只会改个名称打一张,怎么样改数据或者是加载数据实现大量打印的呢?   解答:   TSC TTP-244条码打印机,是一款性能不错的桌面型条码打印机,最大打印 ...

  2. python 迁移虚拟环境

    1.在源环境中获取包列表(新建文件夹whls) #cd 虚拟环境目录下的\scripts,cmd acitivate # 下载清单到requirements.txt,切换到whls目录 pip fre ...

  3. Ubuntu PostgreSQL数据库忘记密码

    1. find / -name pg_hba.conf2. sudo vi /etc/postgresql/13/main/pg_hba.conf 3. 拉到最下面,把postgres所在行的md5改 ...

  4. [THUPC2021 初赛] 切切糕

    个人思路: 从小往大切,感性理解一下. 由于每个人都足够聪明,博弈 dp 只有后效型而没有前效性,所以从固定的最终状态倒序往前 dp,得到初始状态的答案. 状态:\(dp_{i,j}\) 表示还剩 \ ...

  5. S-HR查询用户组织范围

    SELECT org.FNumber FNumber,org.FName_L2 orgName FROM T_PM_OrgRange orgRange LEFT JOIN T_ORG_admin or ...

  6. Python 字典类型

    1.由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复.程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典.实 ...

  7. 第四章:基本Git概念(重点)

    本章通过讨论Git的基本架构组成和一些重要概念,来探讨Git的不同之处和原因. 一: 基本概念 1.版本库. 1]Git版本库只是一个简单的数据库,包含所有用来维护与管理项目的修订版本和历史记录. 2 ...

  8. [485] C2 Age Of Splendor Update 1 OpCodez

    [485] C2 Age Of Splendor Update 1 Client 00 SendProtocolVersion 01 MoveBackwardToLocation 02 Say 03  ...

  9. react对于setState的写法

    react对于setState的写法,改变state的数组里边的值也可以这样写 [1,2,3,4,5].forEach((item)=>{ let arr={} arr[`list${item} ...

  10. 学习笔记||Vue踩过的坑3.0

    11.VUE之const,var,let VUE-var 用var命令声明的变量,是在全局范围内有效的 VUE-let let声明的变量,只是在当前循环的代码块中有效. let不允许在相同的作用域内重 ...