今天暂时先不讲遗传算法,我要解决的是TSP问题,具体什么TSP问题以前文章里讲过了,你们能够点一下历史消息或者这里:html
遗传算法可视化项目(3):建立图的数据结构
github
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学习
最后欢迎你们扫码关注
本文分享自微信公众号 - Python机器学习算法说书人(Python-ML-Algorithm)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。