java 蚁群算法_Java蚁群算法(Ant Colony)求解旅行商问题(TSP)(二)
算法准备
旅行商问题(TSP)是一个经典的图论问题。在给定一系列城市和他们之间的距离以后,一个旅行商人希望能够找到一条能够走遍所有城市,并返回起点城市的最短路径。既然路径能串起来所有的城市,那么问题中的一个隐藏条件是,每个城市都必须至少有另一个城市与它相连,否则就会存在某个点无论如何不会进入路径的情况。在相连的两个城市之间,应该有一个正数的距离或者旅行时间,不相连的城市之间则存在一个极大的正数。
为什么要强调这是一个图论问题呢?因为解决一个图论问题的前提是,你至少得有一张图。通常,一张图(Graph)是用节点(Node)和点之间的边(Edge)组成。在数学表达中,也经常使用V来表示节点的集合,取Vertex 之意。这也就意味着,我们需要先创建“点”和“边”两个类。在Eclipse中,先创建一个工程(Project),按自己的喜好命名。这里我命名为ACOForTSPDorigo1996。
2. 在工程中新建一个包(package),命名为“graph",包的命名通常使用小写。有些程序员也可能直接创建一个叫Graph的类,也是完全没有问题的,此次不展开讲解。
3. 在graph包中,新建一个类Node,通常类名的首字母大写。此处不需要对Node进行很复杂的定义,只需要给Node一个id,以示区分不同的节点就可以了。所以在一个Node中建一个private的String变量,命名为"nodeId"。通常变量的首字母为小写,且考虑到面向对象程序设计的封装特性,这个变量最好是private类型的,为了获取这个变量的值和给这个变量赋值,需要设getter和setter函数。代码如下:
public class Node {
private String nodeId;
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
}
同时,每个类应该有构造函数,构造函数必须为public类型。这里我写了两种构造方式。代码如下:
public Node() {
}
public Node(String nodeId) {
this.nodeId = nodeId;
}
最后,为了以后使用方便,再写了一个toString()函数,便于打印节点的内容,和复写了equals(Object)函数,便于节点之间的比较。因为这些函数都要被其他类调用,它们都是public类型。
public String toString() {
return "node: "+nodeId;
}
@Override
public boolean equals(Object o) {
Node node = (Node)o;
return this.nodeId.equals(node.nodeId);
}
至此,一个Node类便完成了。全部代码如下:
package graph;
public class Node {
private String nodeId;
public Node() {
}
public Node(String nodeId) {
this.nodeId = nodeId;
}
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String toString() {
return "node: "+nodeId;
}
@Override
public boolean equals(Object o) {
Node node = (Node)o;
return this.nodeId.equals(node.nodeId);
}
}
4. 在graph包中,新建一个类Edge。一条边应该有一个起点和一个终点,同时边具有长度/旅行时间,所以一条边应该至少包含三个变量:
public class Edge {
private Node startNode;
private Node endNode;
private int travelTime;
}
同时,构造函数也需要写一下:
public Edge() {}
按照需要也可以写toString()函数,但是本例中就不再使用了。至此,整个Edge类的全部代码如下:
package graph;
public class Edge {
private Node startNode;
private Node endNode;
private int travelTime;
public Edge() {}
public Node getStartNode() {
return startNode;
}
public void setStartNode(Node startNode) {
this.startNode = startNode;
}
public Node getEndNode() {
return endNode;
}
public void setEndNode(Node endNode) {
this.endNode = endNode;
}
public int getTravelTime() {
return travelTime;
}
public void setTravelTime(int travelTime) {
this.travelTime = travelTime;
}
}
到这里为止,TSP问题的准备工作就完成了。
如果这个TSP在将来需要拓展,还可以向这两个类中添加更多的变量。比如一个节点可能包含坐标点信息,可能包含地名信息,一条边同时包含长度和旅行时间信息,也可能包含时间信息,因为不同时间段中的旅行时间是可能变化的(早晚高峰与平时存在差异)。这一类的扩展,与具体的问题要求有关,在高阶的应用中再予以考虑。
java 蚁群算法_Java蚁群算法(Ant Colony)求解旅行商问题(TSP)(二)相关推荐
- 粒子群算法求解旅行商问题TSP (JAVA实现)
粒子群算法求解旅行商问题TSP 写在开头: 最近师妹的结课作业问我,关于使用粒子群求解TSP问题的思路.我想了想,自己去年的作业用的是遗传算法,貌似有些关联,索性给看了看代码.重新学习了一遍粒子群算法 ...
- java gc回收算法_Java GC回收算法-判定一个对象是否可以回收
开源推荐 推荐一款一站式性能监控工具(开源项目) Pepper-Metrics是跟一位同事一起开发的开源组件,主要功能是通过比较轻量的方式与常用开源组件(jedis/mybatis/motan/dub ...
- 6种java垃圾回收算法_Java垃圾回收算法
主要根据以下3篇博客做的整理 http://blog.csdn.net/zsuguangh/article/details/6429592 http://www.cnblogs.com/ywl925/ ...
- 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器
一.如何确定某个对象是"垃圾"? 目前主流垃圾回收器都采用的是可达性分析算法来判断对象是否已经存活,不使用引用计数算法判断对象时候存活的原因在于该算法很难解决相互引用的问题.如何确 ...
- 单目标应用:瞪羚优化算法GOA求解旅行商问题TSP(提供Matlab代码)
一.瞪羚优化算法 瞪羚优化算法(Gazelle Optimization Algorithm,GOA)由Agushaka等人于2022年提出,该算法模拟了瞪羚逃避捕食者的行为,思路新颖,性能高效. 瞪 ...
- java密码学原型算法_java密码学原型算法实现——双线性对.pdf
java密码学原型算法实现--双线性对 Java 密码学原型算法实现--双线性对 1.背景介绍 如何使用jPBC 库进行双线性群初始化,包括: (1)质数阶双线性群(Prime-Order Bilin ...
- java 实现秒抢_Java实现抢红包算法,附完整代码(公平版和手速版)
当我们在群里抢红包时真的是手速越快红包金额越大吗? 当我们在群里抢红包时真的是手速越快红包金额越大吗? 答案当然是并不是,都说了是拼手气,岂能是拼手速! 不过也可以有拼手速的方法 二倍均值法(公平版) ...
- java算多元回归方程_java多元线性回归算法
多元线性回归的计算方法摘要 在实际经济问题中,一个变量往往受到多个变量的影响.例... STLyy UQ 在多元线性回归分析中,回归平方和表示的是所有 k 个自变量对 y 的变差的总影响,它可以 按公 ...
- java实现qq抢红包_Java实现抢红包算法,附完整代码(公平版和手速版)
当我们在群里抢红包时真的是手速越快红包金额越大吗? 当我们在群里抢红包时真的是手速越快红包金额越大吗? 答案当然是并不是,都说了是拼手气,岂能是拼手速! 不过也可以有拼手速的方法 二倍均值法(公平版) ...
最新文章
- python读取红外图
- 开发日记-20190502 关键词 汇编语言(一)
- 博士毕业的人也会交“智商税”?现实远比我们想象的残酷……
- array python 交集_Python基础(二)——列表和元组
- 一文带你领略虚拟化领域顶级技术会议KVM Forum 2018
- xml层级工具_.NET的类型层次查看工具,ClassHierarchyViewer,0.3.0.1
- 【计算机网络】为什么一个路由器会有两个wifi信号
- ERROR: Process pool report error: Can‘t pickle
- thaiphoon burner 使用_果粉请注意,苹果iPhone 12在日常使用时有两大隐忧
- 2021-04-13 Linux I/O模型
- 【Calcite】Calcite 的SQL解析
- java的OutOfMemoryError: PermGen space实战剖析
- 使用Easy CHM工具对文件生成API文档
- JMP软件与康涅狄格大学商学院
- 矩阵相乘的strassen算法_矩阵乘法Strassen算法
- android神器,android神器:tasker
- 写给夏燕第十一个男人
- 期货止损篇2:ATR止损,高手都在悄悄用的止损利器
- 中国在6G专利上再进一步,申请量占比达五成,遥遥领先,美国的希望落空
- 格式工厂 – 万能视频/音频/图片多媒体格式转换软件 (完全免费)
热门文章
- android mtk 系统架构,Android振动器(Vibrator)系统详解
- Housewife Wind
- 如何购买阿里云服务器?阿里云服务器购买详细教程
- 雪城大学计算机科学专业,雪城大学计算机科学专业概论.pdf
- 计算机网络复习资料-谢希仁版
- 图扑数字孪生智慧机场,助推民航“四型机场“建设
- 网络安全是什么?为什么要学网络安全 ?网络安全怎么学习?
- 十大经典排序算法之鸡尾酒排序
- zzuli 1981 赛前的准备--忙里偷闲 2/5
- 开发人员转型技术管理该怎么做?