它可以读取指定文件夹内的所有CSV文件,并输出相应的结果文件。在每个CSV文件中,包含了一组经纬度坐标点,利用该程序可以计算出在这些点中,经过20个距离最短的点的最优路径。具体实现过程中,该程序调用了geopy库进行点之间距离的计算。其中,主要函数为particle_swarm_optimization
,它实现了粒子群算法,通过迭代更新速度和位置等参数,来寻找全局最优解,最终返回一个由20个距离最短的点组成的最优航线。对于每个CSV文件,该程序将输出一个新的文件,包含了最优航线上的经纬度坐标点。
import pandas as pd
from geopy.distance import geodesic
import numpy as np
import os
# 根据经纬度计算两点间距离
def get_distance(lat1, lon1, lat2, lon2):
return geodesic((lat1, lon1), (lat2, lon2)).kilometers
# 粒子群算法实现
def particle_swarm_optimization(df, n_particles=20, n_iterations=50):
# 将数据转换成numpy数组
data = df[['LAT', 'LON']].to_numpy()
# 初始化粒子的位置和速度
swarm = np.random.uniform(low=data.min(axis=0), high=data.max(axis=0), size=(n_particles, data.shape[1]))
velocity = np.zeros((n_particles, data.shape[1]))
# 计算每个粒子的适应度
fitness = [sum([get_distance(data[i][0], data[i][1], swarm[j][0], swarm[j][1]) for i in range(len(data))]) for j in range(n_particles)]
p_best = np.copy(swarm)
fitness_p_best = np.copy(fitness)
# 找到全局最优解
g_best_index = np.argmin(fitness_p_best)
g_best = np.copy(p_best[g_best_index])
fitness_g_best = np.copy(fitness_p_best[g_best_index])
# 开始迭代
for i in range(n_iterations):
for j in range(n_particles):
# 更新速度
velocity[j] = 0.5 * velocity[j] \
+ 1.0 * np.random.random() * (p_best[j] - swarm[j]) \
+ 2.0 * np.random.random() * (g_best - swarm[j])
# 更新位置
swarm[j] += velocity[j]
# 更新适应度
fitness[j] = sum([get_distance(data[i][0], data[i][1], swarm[j][0], swarm[j][1]) for i in range(len(data))])
# 更新粒子的p_best和g_best
if fitness[j] < fitness_p_best[j]:
p_best[j] = np.copy(swarm[j])
fitness_p_best[j] = np.copy(fitness[j])
if fitness_p_best[j] < fitness_g_best:
g_best = np.copy(p_best[j])
fitness_g_best = np.copy(fitness_p_best[j])
# 将所有数据点按照到全局最优解的距离重新排序,并选择前20个距离最短的点作为最优航线点
distances = [get_distance(g_best[0], g_best[1], data[i][0], data[i][1]) for i in range(len(data))]
sorted_indices = np.argsort(distances)[:20]
best_route = data[sorted_indices]
return best_route
# 遍历CSV文件夹中的所有CSV文件,并依次输出相应的结果文件
folder_path = "D:/特征点1/"
for file_name in os.listdir(folder_path):
if file_name.endswith(".csv"):
file_path = os.path.join(folder_path, file_name)
df = pd.read_csv(file_path)
# 运行算法并输出结果
best_route = particle_swarm_optimization(df)
# 将结果保存到CSV文件中
route_df = pd.DataFrame(best_route, columns=['LAT', 'LON'])
output_path = os.path.join(folder_path, file_name.replace(".csv", "_route.csv"))
route_df.to_csv(output_path, index=False)
print("Best route saved to", output_path)