我的上一篇博客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. vue element 可编辑表格行内验证

    <template> <div class="page-layout rataMdel"> <el-button type="primary ...

  2. centos7 双网卡同网段双网关配置

    需求: #1.服务器为双网卡: #2.网卡1为互联网 172.16.137.99/24/254 #3.网卡2为旅游专网 172.16.137.97/24/1 #4.互联网路由器为172.16.137. ...

  3. [AGC033C] Removing Coins

    个人思路: 每轮会删掉除选定节点外的所有叶子节点. 黑白染色,但是不会推 SG 函数. 然后就不会了. 正解: 每次直径长度 \(-1\) 或 \(-2\).\(0\) 必胜,\(1\) 必败,\(2 ...

  4. echarts 容器宽度设置百分比,但是图表缩成一团

    如图 明明设置了充满整个div,然后发现都缩成了一团,后来发现echarts不能和display:none;属性一起用 解决方法: 把v-show改成v-if就可以了充满容器了... 

  5. Java基础之注释

    注释 在Java的编写过程中我们需要对一些程序进行注释,除了自己方便阅读,更为别人更好理解自己的程序,可以是编程思路或者是程序的作用. 注释不会被执行,是给写代码的人看的. 书写注释是一个非常好的习惯 ...

  6. 053_Salesforce Lightning与Classic对比

    Classic页面  Lightning页面  特点: 应用程序的切换更加方便 可以快速访问最近项目和备注等 新的记录页面布局 涡轮增压列表视图 仪表板有所变化 圆滑的报告视图 其中最重要的变化也当属 ...

  7. django自定义管理类的save model和delete model记一次进一步了解

    业务背景: 最近在写一个个人博客网站,文章分类是一个自关联的两层分类.希望在点开分类时,显示一级分类.一级分类下的所有二级分类以及每个二级分类有多少个文章.最简单办法就是关联查询,查询出所有二级分类, ...

  8. 实时中文语音克隆——开源项目MockingBird体验

    [引子] 在今年大型网络攻防演练前不久,笔者接到一个公司的座机号码来电,上来就问防守准备得怎么样了,哪里还有不足等.等等,这声音不认识,笔者第一反应就是蓝军(Red Team)来进行社会工程攻击,于是 ...

  9. ASP.NET Core 5.0之默认主机Host.CreateDefaultBuilder

    通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置.应用程序配 ...

  10. 启动appium服务时报错,服务不通:Original error: Could not find 'apksigner.jar'

    启动时报错,服务不通:Original error: Could not find 'apksigner.jar' 是因为少了个文件,添加个文件就好了,可以参考下面的帖子. 可以参考这个帖子:http ...