今天暂时先不讲遗传算法,我要解决的是TSP问题,具体什么TSP问题之前文章里讲过了,大家可以点一下历史消息或者这里:
TSP问题里面除了算法还有一个重要的东西,就是距离,一般情况下计算两点之间距离直接用公式:√(Δx²+Δy²),可是我之前爬到的数据是经纬度,两地距离没有这么简单,因为毕竟是球面上两点的距离,不是平面,这里我不用网上的那个推导出来的公式,我一步步推导,首先以地球球心为原点,赤道平面为xOy平面,建立xyz三维坐标系,我在这里就默认东经是[0°,180°],西经是[-180°,0°](反过来也没事),北纬[0°,90°],南纬[-90°,0°](反过来没问题),假设第一个点经纬度是(α1,β1),第二个点经纬度是(α2,β2)(α1,α2对应经度值;β1,β2对应纬度值)。很明显第一个点转换成为三维坐标是(cosα1,sinα1,sinβ1),第二个点转换成为三维坐标也就是(cosα2,sinα2,sinβ2),点可以看成是向量,直接利用:
cosθ=两向量数量积/两向量模长的乘积
这个公式求出两向量夹角的余弦值cosθ,然后再利用反余弦函数arccos求出θ,不需要进行平移啥的,arccos函数值域是[0,π],向量夹角也是这个范围,最后利用公式L=|θ|*r(θ一定要是弧度制!r是地球平均半径,不平均还真的有点难处理
)求得弧长,也就是所谓的球面上两点的距离!
接下来说一下昨天文章中遗留下来的MAX取多大的值的问题,设置成10的话上面那个公式完全不能用,最小值应该比地球平均半径*π(也就是半圈)要大,这个值很明显比10大很多,但为什么我要用10是因为我感觉就海南岛那一小块地方,球面可以近似的看成平面(如果不能看成平面用上面那个方法),然后就是那个距离公式(√(Δx²+Δy²)),然后我编写程序算了一下经纬度的差,代码和运行结果如下:
很明显,令Δx=经度差,Δy=纬度差,代入√(Δx²+Δy²)这个距离公式,结果小于10,所以我可以用10表示不可达!
不管用什么方法,明天遗传算法大家也就只是距离计算方式不同,但最后得出来的最短路径都差不多那样!文章最后附上项目地址:https://github.com/3480430977/DataVisualizationOfGA
最后欢迎大家扫码关注