一、TSP问题描述
旅行商问题是由英国数学家Thomas Penyngton Kirkman 和爱尔兰数学家 Sir William Rowan Hamilton 在 19 世纪提出的数学问题,是图论中的一个经典问题,也是一个典型的组合优化问题。问题是这样描述的:一名旅行商人要到若干个城市去销售商品,已知城市的个数 n 和任意两个城市间的距离,需要找到一条从任意城市 A 出发,途经所有城市一次并且仅一次,最后返回到城市 A 的路线,使得总的距离最小。、
二、模拟退火算法基本原理
模拟退火(SA)算法的基本原理如下:
(1)给定初始温度T0和初始点x0,计算该点的函数值f(x0);
(2)随机产生扰动△x,得到新点x′=x+△x,计算新点的函数值f(x′)和差△f=f(x′)-f(x);
(2)随机产生扰动△x,得到新点x′=x+△x,计算新点的函数值f(x′)和差△f=f(x′)-f(x);
(3)若△f≤0,则接受新点,作为下一次模拟退火的初始点;
(4)若△f>0,则计算新点的接受概率:p(△f)=xp(-△f/(K T)),产生[0,1]区间上均匀分布的伪随机数r,r∈ [0,1]。若p≤r,则接受新点作为下一次模拟的初始点;否则仍取原来的点作为下一次模拟退火的初始点。以上步骤称为Metropolis过程。逐渐降低控制温度,重复Metropolis过程,直至达到结束准则,就构成了SA算法。
三、利用模拟退火算法实现TSP问题
1,定义城市实体类,实现计算城市间的距离
public class City {
// 地球赤道半径
private static final double ERATH_EQUATORIAL_RADIUS = 6378.1370D;
private static final double CONCVERT_DEGREES_TO_RADIANS = Math.PI / 180;
// 经度
private double longitude;
// 纬度
private double latitude;
// 城市名
private String name;
public City(double longitude,double latitude,String name){
super();
this.longitude=longitude;
this.latitude=latitude;
this.name=name;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}