使用粒子群算法进行航线规划

它可以读取指定文件夹内的所有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)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值