【CPLEX教程03】java调用cplex求解一个TSP问题模型
00 前言
前面我们已经搭建好cplex的java环境了,相信大家已经跃跃欲试,想动手写几个模型了。今天就来拿一个TSP的问题模型来给大家演示一下吧~
CPLEX系列教程可以关注我们的公众号哦!获取更多精彩消息!

01 TSP建模
关于TSP建模,就不多解释了。以及什么是TSP问题,也不要问我了。直接贴一个现成的模型出来吧。

02 程序框架
整个程序框架如图,app下是调用cplex的主要package。

其中:
- App.java:程序入口,cplex调用建模求解过程。
- ConstraintFactory.java:控制子环约束的。
- FileManager.java:读取instance数据的。
package graph定义了一些变量,在求解过程中需要用到。input是算例,包含100-9000个城市。
03 求解过程
求解过程可以分为以下几步进行:
- 定义一个模型
IloCplex model = new IloCplex();
- 定义决策变量,boolVar可以返回一个01的bool类型决策变量。
// define variables
IloIntVar[][] x = new IloIntVar[data.size()][data.size()];
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x.length; j++) {
x[i][j] = model.boolVar("X[" + i + ", " + j + "]");
}
}
- 添加约束7-1,addTerm将1*x[i][j]添加进表达式r里面,最终r的取值是里面所有的元素之和,也就是\(1*x[i][1]+1*x[i][2]+...+1*x[i][n]\)。
// one has only a city to go, and should
for (int i = 0; i < x.length; i++) {
IloLinearIntExpr r = model.linearIntExpr();
for (int j = 0; j < x.length; j++) {
// if (i == j)
// continue;
r.addTerm(1, x[i][j]);
}
model.addEq(r, 1);
}
- 添加约束7-2,原理同上一条。
// one can only arrive to one city at a time, and should
for (int j = 0; j < x.length; j++) {
IloLinearIntExpr r = model.linearIntExpr();
for (int i = 0; i < x.length; i++) {
// if (i == j)
// continue;
r.addTerm(1, x[i][j]);
}
model.addEq(r, 1);
}
- 添加约束7-3,子环约束处理有点复杂,但这个不是本文重点,读者自行理解。
// add cycle restrictions
for (Stack<Edge> stack : stacks) {
// stack.forEach((edge) -> System.out.println(edge.getFrom() + "->" + edge.getTo()));
constraintFactory.cycleRestrictions(model, x, stack);
}
- 添加目标函数,z的表达式同上。
// one should complete the tour within the smallest distance possible
IloLinearNumExpr z = model.linearNumExpr();
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x.length; j++) {
if (i == j)
continue;
z.addTerm(distance[i][j], x[i][j]);
}
}
- 确定目标是最小化目标
model.addMinimize(z);
- 开始求解
if (model.solve()) {
// get tour
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x.length; j++) {
if (model.getValue(x[i][j]) >= 0.5) {
tour.add(new Edge(i, j));
}
}
}
// repaint tour
} else {
System.err.println("Boi, u sick!");
System.exit(1);
}
注意,一次求解不一定能求得最优解,小编跑了一个早上都跑不出来,还是100个节点的。model.getValue(x[i][j]) >= 0.5这个判断只是把求解过程中一些较好的边给添加进去而已。最优解是要满足所有约束的。
04 运行说明
代码下载请关注我们的公众号哦!后台回复【CPTSP】不包括【】即可下载。

代码来源GitHub,小编去掉了部分代码。期待后期进一步精简和修改,大家下载下来后用eclipse导入,设置好cplex环境以后。在App.java里面,右键Run As->Run configurations...:

找到App,在Arguments窗口,找到Program arguments:

输入参数说明:
--instancePath+空格+算例文件的路径,注意用英文双引号括起来。
--maximumRead+空格+数字,表示算例大小,也就是多少个城市,文件名可以直接看出。
然后就可以愉快的run了。
附上运行结果:

大家可以在while(count<1)这个条件里面更改迭代次数,以便能获取更好的解。
【CPLEX教程03】java调用cplex求解一个TSP问题模型的更多相关文章
- 【CPLEX教程02】配置Cplex的Java环境以及API说明
00 前言 因为小编一般用的C++和Java比较多,而且现在开发大型算法用这类面向对象的编程语言也方便得多.基于上面的种种考虑,加上时间和精力有限,所以就暂时只做C++和Java的详细教程辣.关于ma ...
- 代码 | 用ALNS框架求解一个TSP问题 - 代码详解
写在前面 前面好多篇文章,我们总算是把整个ALNS的代码框架给大家说明白了.不知道大家对整个框架了解了没有.不过打铁要趁热,心急了要吃热豆腐.今天就来实战一下,教大家怎么用ALNS的代码框架,求解一个 ...
- 机器学习——Java调用sklearn生成好的Logistic模型进行鸢尾花的预测
机器学习是python语言的长处,而Java在web开发方面更具有优势,如何通过java来调用python中训练好的模型进行在线的预测呢?在java语言中去调用python构建好的模型主要有三种方法: ...
- 零基础大数据入门教程:Java调用阿里云短信通道服务
这里我们使用SpringBoot 来调用阿里通信的服务. 阿里通信,双11.收到短信,日发送达6亿条.保障力度非常高. 使用的步骤: 1.1. 第一步:需要开通账户 1.2. 第二步:阅读接口文档 1 ...
- Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符
ylbtech-Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符 1.返回顶部 1. Java 实例 - 删除字符串中的一个字符 Java 实例 以 ...
- [Java 教程 03] 我的第一个Java程序
现在,大家应该都已经安装好jdk环境了吧!是不是已经跃跃欲试,按耐不住心中的小激动了?那我们现在就来写我们java学习生涯中的第一个java程序. 文件相关设置 为了方便后面大家的学习呢?有一点大家还 ...
- Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un
ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法 Java 实例 汉诺塔(又称河内塔)问题是源 ...
- java接口调用——webservice就是一个RPC而已
很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
随机推荐
- k8s安装部署问题、解决方案汇总
角色 节点名 节点ip master n1 192.168.14.11 节点1 n2 192.168.14.12 节点2 n3 192.168.14.13 https://raw.githubuser ...
- 网页调用文件另存为js
查看引用是否正常,页面添加html代码. <a id="downLoad" onclick="oDownLoad('downLoad')">下载&l ...
- 小div在大div中垂直居中方式
代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- css3 text-fill-color属性
text-fill-color是什么意思呢?单单从字面上来看就是“文本填充颜色”,不过它实际也是设置对象中文字的填充颜色,和color的效果很相似.如果同时设置text-fill-color和colo ...
- getElementsByClassName兼容 封装
众所周知,JS获取DOM有个getElementsByClassName,非常方便,但是呢,为了兼容某些浏览器(你懂的).只能 进行封装下了.解决方法如下 <!DOCTYPE html> ...
- day 04作业
目录 简述Python的五大数据类型的作用.定义方式.使用方法: 数字类型 字符串类型(str) 列表(list) 字典(dict) 布尔型(bool) 一行代码实现下述代码实现的功能: 写出两种交换 ...
- Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块
Hmac模块 其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性. 关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Mess ...
- Response响应相关
response是响应的对象 response.text # 返回的是字节,数据的原内容response.content # 返回的是字符串,默认是utf-8解码 import reques ...
- Linux命令——whiptail交互式shell脚本对话框
转自:交互式shell脚本对话框----whiptail指令 当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不 ...
- 2013.6.29 - OpenNER第九天
上午看计算机网络,下午做计算机实验.晚上写计算机实验报告,还有OpenStack的实验报告. 写完之后跟师兄讨论了一下OpenNER的事情,觉得OpenNE很像是化学物质,里面很多都可以构成原子团,原 ...