4.2.3 第二次进基离基
为便于表述,我们将x2直接换掉:
Cplex求解:
dvar int+ x1; dvar int+ x2; dvar int+ x3; dvar int+ x4; minimize 5*x1 + 9*x2 + 5*x3 + 10*x4; subject to{ 2*x1 + 0*x2 + 0*x3 + 0*x4 >= 30; 0*x1 + 0*x2 + 0*x3 + 3*x4 >= 20; 0*x1 + 2*x2 + 1*x3 + 0*x4 >= 40; }
X = [15,20,0,6.7]; 目标值321.67;对偶变量:[2.5,3.3,4.5]
对应整数解为X = [15, 20, 0, 7];目标值325
应该离基,构建新列
进基列[1, 1, 0];离基列[0, 0, 1]
4.2.4 第三次进基离基
直接换掉
Cplex求解:
dvar int+ x1; dvar int+ x2; dvar int+ x3; dvar int+ x4; minimize 5*x1 + 9*x2 + 5*x3 + 10*x4; subject to{ 2*x1 + 0*x2 + 1*x3 + 0*x4 >= 30; 0*x1 + 0*x2 + 1*x3 + 3*x4 >= 20; 0*x1 + 2*x2 + 0*x3 + 0*x4 >= 40; }
X = [5, 20, 20, 0]; 目标值305;对偶变量:[2.5,2.5,4.5]
应该离基,构建新列
三个检验数都为0,我们完美的找到了问题的最优解,而且还是整数解。
4.2.5 解的分析
有三种长度为9,14,16的木材,成本价分别为5,9,10,需要切割长度为4的成品 30个;长度为5的成品20个;长度为7的成品40个,求解切割方案,使得总体成本价最低。
X = [5, 20, 20]; 目标值305
5个[2,0,0]的方案,20个[0,0,2]的方案,20个[1,1,0]的方案
方案为:9米的木材切成两个4米,方案使用5次; 9米木材切成1个4米、1个5米的方案使用20次; 14米木材切成2个7米的方案使用20次
该方案浪费木料为:5 * 1 + 20*0 + 20*2 = 45米;一共使用了45根木材,25根14米木材,没有使用16米的木材。
4.2.6 总结
这一节我们计算了3种不同成本的木材型号和3种需求的CSP问题的求解实例验证,做如下小结:
由于我们只有3个约束,要先选择三个可行的裁切方案作为初始裁切组合
我们构建了3种木材类型的subproblem,subprobelm的约束根据可用的木材型号设置
进基变量是subproblem目标负最小值列;离基变量为决策变量取值为0的列;一进一出,始终保持模型只处理4个变量
RMP的每次优化都会得到新的决策变量及其对偶变量的取值
对偶变量发生变化时,每个subproblem只需更新他的目标函数即可,约束不用动
终止的条件是所有的subproblem的最优目标值非负
5 Java调用Cplex实现的列生成算法
代码请关注文末公众号回复:java-cplex-CG-CSP
5.1 遇到的问题及解决
导入Java工程:File --> import --> General --> Existing Projects into Workspace --> Next --> Select toot directory后输入工程父目录,下边勾选Copy projects into workspace --> Fnished
运行工程:右键点击src --> cut --> CutStock.java,点击Run as --> 1 Java Application;此处弹出运行错误,以后处理
5.1.2 JNI错误及处理办法
1) 错误截图:
2) 原因:这个错误是因为项目的依赖库不对,需要你重新配置一下
3) 解决方案
该项目的 Build Path
, 在Libraries
中看到如下内容:
有两个路径缺失,我们要做的就是把这个路径删除,替换为我们自己
处理方式:
选中第一行的cplex.jar,点击右侧的Remove;再点击Add External JARS ...,找到自己的cplex.jar,把它加进来
net.mindview.jar包,是java编程思想第四版中需要使用net.mindview.util包,下载地址, 提取码: a25m;下载之后,加载方式与 1 一致
配置Java环境:Add Library.. -> JRE System Library -> Execution environment:JavaSE-1.8
5.2 算例及运行