我的上一篇博客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. 如何让一个 div 左右各空一定距离然后 div 占满剩下的宽度?

    如何让一个 div 左右各空一定距离然后 div 占满剩下的宽度? 最开始想到的方法就是 div 宽度取 n%, style 设置 margin:auto. 但是这样有一个问题,一定距离是根据 n 的 ...

  2. 【Python】变量&数据类型&运算符

    一.Python变量&数据类型&运算符 1.print()函数 1.1 输出数字,字符串,含有运算符的表达式 print(123) print('hello world') print ...

  3. css 启动页 loading动画

    <div class="index-html-loader"> <div class="text">Loading...</div ...

  4. uniapp 上传

    fileList1: [], // uviewui ui组件<u-upload uploadText="上传打款凭证" :fileList="fileList1&q ...

  5. spider_ip代理

    title: spider_ip代理 author: 杨晓东 permalink: spider_ip代理 date: 2021-10-02 11:27:04 categories: - 投篮 tag ...

  6. JS中有关(...)的介绍

    1,深拷贝一个对象 如上图所示,obj和tmp是完全两个独立的对象,互不影响. 2,数组复制 如上图所示,arr和tmp是两个完全独立的数组,彼此之间的值互不影响. 3,函数形参中的使用 这里的... ...

  7. gRPC中protobuff type和C# type原生标量对应表

    查看Microsoft官方文档: Create Protobuf messages for .NET apps | Microsoft Docs

  8. Git commit时提示错误时 解决办法

    问题描述: * Please tell me who you are.  Run  git config –global user.email "you@example.com"  ...

  9. Coursera Programming Languages, Part B 华盛顿大学 Week 3

    ML Versus Racket 同 函数编程模式 (with constructs that encourage a functional style) 不鼓励 mutation (但提供了支持 m ...

  10. [419] C1 Harbingers Of War OpCodez

    [419] C1 Harbingers Of War Client 00 SendProtocolVersion 01 MoveBackwardToLocation 02 Say 03 Request ...