纯Python实现TSP问题求解,输入一组坐标文件,输出根据最佳路径重新排序的坐标文件

代码A

基于python-tsp(https://github.com/fillipe-gsm/python-tsp/)实现

# -*- encoding: utf-8 -*-
#基于 python-tsp
#https://github.com/fillipe-gsm/python-tsp/
#输入:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_input.csv
#输出:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_output.csv

import csv
import numpy as np
from python_tsp.distances import great_circle_distance_matrix
from python_tsp.exact import solve_tsp_dynamic_programming
from python_tsp.heuristics import solve_tsp_local_search, solve_tsp_simulated_annealing

def create_output_file(filename,data,indexes):
    x = [data[i][0] for i in indexes]
    y = [data[i][1] for i in indexes]
    with open(filename,'w',newline='')as f:
        writer = csv.writer(f)
        for pos in zip(x, y):
            writer.writerow(pos)

sources = np.genfromtxt('position_xy_input.csv',delimiter=',') 
distance_matrix = great_circle_distance_matrix(sources) #获得距离矩阵
distance_matrix[:,0]=0  #不需要回到起点,所以将距离矩阵第一列所有元素设为零

permutation, distance = solve_tsp_simulated_annealing(distance_matrix)
permutation2, distance2 = solve_tsp_local_search(
    distance_matrix, x0=permutation, perturbation_scheme="ps3"
)

oridata = sources.tolist()
create_output_file('position_xy_output.csv',oridata,permutation2)


代码B

参考https://github.com/425776024/TSP-GA.py
根据实际需求稍微改写了下TSP_GA.pyDW.py 两个文件

输入文件:pos_input.csv
输出文件:pos_output.csv

TSP_M.py

# -*- encoding: utf-8 -*-
#基于https://github.com/425776024/TSP-GA-py修改
#输入:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_input.csv
#输出:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_output.csv

import csv
import numpy as np
import pandas as pd
from numpy.linalg import norm
#windows
# from . import Draw

#linux
from DW_M import Draw

class TSP(object):
    poss = np.array([])
    pos_list = np.array([])
    pop_size = 50
    c_rate = 0.7
    m_rate = 0.05
    pop = np.array([])
    fitness = np.array([])
    pos_size = -1
    ga_num = 500
    best_dist = 1
    best_gen = []
    dw = Draw()

    def __init__(self, c_rate, m_rate, pop_size, ga_num):
        self.fitness = np.zeros(self.pop_size)
        self.c_rate = c_rate
        self.m_rate = m_rate
        self.pop_size = pop_size
        self.ga_num = ga_num

    def init(self):
        tsp = self
        tsp.load_Position()
        tsp.pop = tsp.creat_pop(tsp.pop_size)
        tsp.fitness = tsp.get_fitness(tsp.pop)
        tsp.dw.bound_x = [np.min(tsp.poss[:, 0]), np.max(tsp.poss[:, 0])]
        tsp.dw.bound_y = [np.min(tsp.poss[:, 1]), np.max(tsp.poss[:, 1])]
        tsp.dw.set_xybound(tsp.dw.bound_x, tsp.dw.bound_y)

    # --------------------------------------
    def creat_pop(self, size):
        pop = []
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值