Cplex解决JSP问题
我的上一篇博客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问题的更多相关文章
- 【转】解决jsp参数传递乱码的问题
解决jsp参数传递乱码的问题 计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语.他跟我们一样,不管外语掌握到什么程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题. ...
- 解决JSP 不解析EL表达式
解决JSP 不解析EL表达式,jsp在使用EL表达式的时候发现它不被解析,而是直接以字符串的形式显示了出来,经过查阅资料和实践,终于得知了原因并找到了解决方案 原因是:在默认情况下,Servlet 2 ...
- jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题
jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...
- 怎么解决JSP中出现乱码的问题
首先我们先了解一下问题的原因.一般情况在在每个JSP页的头部都有这样一条语句: 这条语句决定了此页面使用GB2312编码形式,而在数据库中一般用的是iso-8859-1字符集存储数据. 而Java程序 ...
- 使用过滤器解决JSP页面的乱码问题
乱码详情 总结:讨论了使用GET和POST方法,控制台和JSP页面显示的问题. 最终发现:在servlet或者过滤器中添加:request.setCharacterEncoding("ut ...
- eclips中maven解决jsp报错的问题
加入如下的pom依赖: <!-- 解决jsp报错的依赖包第一个 --> <dependency> <groupId>javax.servlet</groupI ...
- tomcat7解决jsp参数传递的中文乱码问题
解决jsp参数传递的中文乱码问题 制作人:全心全意 在jsp页面中,通过参数传递传递中文时,在显示参数值时中文内容变成了乱码.这是因为请求参数的文字编码方式与页面中的不一致造成的,所有的request ...
- 解决JSP调用JavaBean出现乱码问题
解决JSP调用JavaBean出现乱码问题 话不多说放代码 144 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style D ...
- 解决JSP页面获取的数据库数据乱码问题
将java项目部署到服务器,页面数据乱码: 解决:首先查看了数据库编码和jsp编码都是utf-8,说明jsp和数据库没问题,于是查看了tomcat设置的编码 没有设置编码,于是加了URIEncodin ...
- java servlet之过滤器1(解决jsp之间POST方式数据传递乱码)
首先,看看没有解决乱码的效果,新建两个jsp页面(a.jsp跳转到b.jsp). <form action="b.jsp" method="post"&g ...
随机推荐
- 页面布局 Stack 层叠组件 Stack 与 Align Stack 与 Positioned 实现定位布局
一.Flutter Stack 组件 Stack 表示堆的意思,我们可以用 Stack 或者 Stack 结合 Align 或者 Stack 结合 Positiond 来实现页面的定位布局 属性 说明 ...
- 常见的hash数据结构
遍历 hash表是一种比较简单和直观的数据结构,在查找时也有很好的性能.但是hash表不能提供有序遍历,这个是其特性决定,所以不足为奇.但是,更为实际的一个问题是如果遍历整个hash表中的所有元素? ...
- vi 异常退出出现 E325:Attention的解决办法
在linux系统下使用vi编辑程序的时候,没有保存退出,直接关闭了,出现了以下的情况: 打开就会显示filename.c.swap已经存在. 这是因为vi在编辑文件时会创建一个交换文件swap fil ...
- jQuary学习(一)
一.jQuary简介 jQuery是继prototype之后又一个优秀的Javascript框架.其宗旨是--WRITE LESS,DO MORE,写更少的代码,做更多的事情. jQuery能够使用户 ...
- 原创:USB HID读卡器数据解析(R321-13.56MHZ读卡器)
1.工具准备 USB 监视软件:Device Monitoring Studio7.25 PC端软件:单片机多功能调试助手 2.发送数据包 接收数据包 3.数据分析 usb hid(pc软件)发送帧( ...
- kubectl 补全报错:-bash: _get_comp_words_by_ref: command not found
1.kubectl自动补全设置 yum -y install bash-completion source <(kubectl completion bash) # 在 bash 中设置当前 s ...
- Solution Set - 杭电多校 2022 Day2 一句话题解
A:看了题就很容易想到虚树吧,建出虚树后考虑整体扫一遍虚树,注意到这是一棵根向树,那么统计其实十分简单,将对 \(C\) 类节点的标记下放,\(A,B\) 类节点同时上传,如果在 DFS 的过程中发现 ...
- Java基础——(综合练习)买飞机票和找素数
package com.zhao.test; import java.util.Scanner; public class Test14 { /* 需求:机票价格按照淡季旺季.头等舱和经济舱收费. 输 ...
- Windows 进程间通信 共享内存
向内存中写数据 1 // SharedMemorySample_write_main.cpp 2 #include <SDKDDKVer.h> 3 #include <Windows ...
- C# 俩个字符串数据进行对比取出不同的数据
string sel_JD = "电冰箱,电热水壶,客厅空调,饮水机,"; string Operation_JD = "电冰箱,电热水壶,电动汽车,"; Li ...